兼容python3的SSDB客户端
SSDB.py
import socket class SSDB_Response(object):
def __init__(self, code='', data_or_message=None):
self.type = 'none'
self.code = code
self.data = None
self.message = None
self.set(code, data_or_message) def set(self, code, data_or_message=None):
self.code = code if code == 'ok':
self.data = data_or_message
else:
if isinstance(data_or_message, list):
if len(data_or_message) > :
self.message = data_or_message[]
else:
self.message = data_or_message def __repr__(self):
return ((((str(self.code) + ' ') + str(self.message)) + ' ') + str(self.data)) def ok(self):
return self.code == 'ok' def not_found(self):
return self.code == 'not_found' def str_resp(self, resp):
self.type = 'val' if resp[] == 'ok':
if len(resp) == :
self.set('ok', resp[])
else:
self.set('server_error', 'Invalid response')
else:
self.set(resp[], resp[:])
return self def str_resp(self, resp):
self.type = 'val'
if resp[] == 'ok':
if len(resp) == :
self.set('ok', resp[])
else:
self.set('server_error', 'Invalid response')
else:
self.set(resp[], resp[:])
return self def int_resp(self, resp):
self.type = 'val' if resp[] == 'ok':
if len(resp) == :
try:
val = int(resp[])
self.set('ok', val)
except Exception as e:
self.set('server_error', 'Invalid response')
else:
self.set('server_error', 'Invalid response')
else:
pass
self.set(resp[], resp[:])
return self def float_resp(self, resp):
self.type = 'val'
if resp[] == 'ok':
if len(resp) == :
try:
val = float(resp[])
self.set('ok', val)
except Exception as e:
self.set('server_error', 'Invalid response')
else:
self.set('server_error', 'Invalid response')
else:
self.set(resp[], resp[:])
return self def list_resp(self, resp):
self.type = 'list'
self.set(resp[], resp[:])
return self def int_map_resp(self, resp):
self.type = 'map' if resp[] == 'ok':
if len(resp) % == :
data = {'index': [], 'items': {}, }
i = while i < len(resp):
k = resp[i]
v = resp[(i + )]
try:
v = int(v)
except Exception as e:
v = - ()
data['index'].append(k)
data['items'][k] = v
i +=
self.set('ok', data)
else:
self.set('server_error', 'Invalid response')
else:
self.set(resp[], resp[:])
return self def str_map_resp(self, resp):
self.type = 'map' if resp[] == 'ok': if len(resp) % == :
data = {'index': [], 'items': {}, }
i = while i < len(resp):
k = resp[i]
v = resp[(i + )]
data['index'].append(k)
data['items'][k] = v
i +=
self.set('ok', data)
else:
self.set('server_error', 'Invalid response')
else:
self.set(resp[], resp[:])
return self class SSDB(object):
def __init__(self, host, port):
self.recv_buf = ''
self._closed = False
self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.sock.connect(tuple([host, port]))
self.sock.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, ) def close(self):
if not (self._closed):
self.sock.close()
self._closed = True def closed(self):
pass
return self._closed def request(self, cmd, params=None):
pass if params is None:
params = []
params = ([cmd] + params)
self.send(params)
resp = self.recv() if resp is None:
return SSDB_Response('error', 'Unknown error') if len(resp) == :
return SSDB_Response('disconnected', 'Connection closed')
ret = SSDB_Response() # {{{ switch: cmd
_continue_1 = False
while True:
if False or ((cmd) == 'ping') or ((cmd) == 'set') or ((cmd) == 'del') or ((cmd) == 'qset') or (
(cmd) == 'zset') or ((cmd) == 'hset') or ((cmd) == 'qpush') or ((cmd) == 'qpush_front') or (
(cmd) == 'qpush_back') or ((cmd) == 'zdel') or ((cmd) == 'hdel') or ((cmd) == 'multi_set') or (
(cmd) == 'multi_del') or ((cmd) == 'multi_hset') or ((cmd) == 'multi_hdel') or (
(cmd) == 'multi_zset') or ((cmd) == 'multi_zdel'):
if len(resp) > :
return ret.int_resp(resp)
else:
return SSDB_Response(resp[], None)
break
if False or ((cmd) == 'version') or ((cmd) == 'substr') or ((cmd) == 'get') or ((cmd) == 'getset') or (
(cmd) == 'hget') or ((cmd) == 'qfront') or ((cmd) == 'qback') or ((cmd) == 'qget'):
pass
return ret.str_resp(resp)
break
if False or ((cmd) == 'qpop') or ((cmd) == 'qpop_front') or ((cmd) == 'qpop_back'):
size =
try:
size = int(params[])
except Exception as e:
pass if size == :
return ret.str_resp(resp)
else:
return ret.list_resp(resp)
break
if False or ((cmd) == 'dbsize') or ((cmd) == 'getbit') or ((cmd) == 'setbit') or ((cmd) == 'countbit') or (
(cmd) == 'bitcount') or ((cmd) == 'strlen') or ((cmd) == 'ttl') or ((cmd) == 'expire') or (
(cmd) == 'setnx') or ((cmd) == 'incr') or ((cmd) == 'decr') or ((cmd) == 'zincr') or (
(cmd) == 'zdecr') or ((cmd) == 'hincr') or ((cmd) == 'hdecr') or ((cmd) == 'hsize') or (
(cmd) == 'zsize') or ((cmd) == 'qsize') or ((cmd) == 'zget') or ((cmd) == 'zrank') or (
(cmd) == 'zrrank') or ((cmd) == 'zsum') or ((cmd) == 'zcount') or ((cmd) == 'zremrangebyrank') or (
(cmd) == 'zremrangebyscore') or ((cmd) == 'hclear') or ((cmd) == 'zclear') or ((cmd) == 'qclear') or (
(cmd) == 'qpush') or ((cmd) == 'qpush_front') or ((cmd) == 'qpush_back') or (
(cmd) == 'qtrim_front') or ((cmd) == 'qtrim_back'):
pass
return ret.int_resp(resp)
break
if False or ((cmd) == 'zavg'):
pass
return ret.float_resp(resp)
break
if False or ((cmd) == 'keys') or ((cmd) == 'rkeys') or ((cmd) == 'zkeys') or ((cmd) == 'zrkeys') or (
(cmd) == 'hkeys') or ((cmd) == 'hrkeys') or ((cmd) == 'list') or ((cmd) == 'hlist') or (
(cmd) == 'hrlist') or ((cmd) == 'zlist') or ((cmd) == 'zrlist'):
pass
return ret.list_resp(resp)
break
if False or ((cmd) == 'scan') or ((cmd) == 'rscan') or ((cmd) == 'hgetall') or ((cmd) == 'hscan') or (
(cmd) == 'hrscan'):
pass
return ret.str_map_resp(resp)
break
if False or ((cmd) == 'zscan') or ((cmd) == 'zrscan') or ((cmd) == 'zrange') or ((cmd) == 'zrrange') or (
(cmd) == 'zpop_front') or ((cmd) == 'zpop_back'):
pass
return ret.int_map_resp(resp)
break
if False or ((cmd) == 'auth') or ((cmd) == 'exists') or ((cmd) == 'hexists') or ((cmd) == 'zexists'):
pass
return ret.int_resp(resp)
break
if False or ((cmd) == 'multi_exists') or ((cmd) == 'multi_hexists') or ((cmd) == 'multi_zexists'):
pass
return ret.int_map_resp(resp)
break
if False or ((cmd) == 'multi_get') or ((cmd) == 'multi_hget'):
pass
return ret.str_map_resp(resp)
break
if False or ((cmd) == 'multi_hsize') or ((cmd) == 'multi_zsize') or ((cmd) == 'multi_zget'):
pass
return ret.int_map_resp(resp)
break
### default
return ret.list_resp(resp)
break
break
if _continue_1:
continue
# }}} switch return SSDB_Response('error', 'Unknown error') def send(self, data):
pass
ps = [] _cpy_r_0 = _cpy_l_1 = data
if type(_cpy_r_0).__name__ == 'dict':
_cpy_b_3 = True; _cpy_l_1 = _cpy_r_0.iterkeys()
else:
_cpy_b_3 = False;
for _cpy_k_2 in _cpy_l_1:
if _cpy_b_3:
p = _cpy_r_0[_cpy_k_2]
else:
p = _cpy_k_2
pass
p = str(p)
ps.append(str(len(p)))
ps.append(p)
nl = '\n'
s = (nl.join(ps) + '\n\n')
try:
while True:
ret = self.sock.send(s.encode())
if ret == :
return - ()
s = s[ret:]
if len(s) == :
break
except socket.error as e:
return -()
return ret def net_read(self):
try:
data = self.sock.recv( * )
except Exception as e:
data = '' if data == '':
self.close()
return
self.recv_buf += str(data,encoding = "ascii")
return len(data) def recv(self):
while True:
ret = self.parse()
if ret is None:
if self.net_read() == :
return []
else:
return ret def parse(self):
pass
ret = []
spos =
epos = while True:
spos = epos
epos = self.recv_buf.find('\n', spos) if epos == - ():
break
epos +=
line = self.recv_buf[spos: epos]
spos = epos if line.strip() == '':
if len(ret) == :
continue
else:
self.recv_buf = self.recv_buf[spos:]
return ret
try:
num = int(line)
except Exception as e:
return []
epos = (spos + num) if epos > len(self.recv_buf):
break
data = self.recv_buf[spos: epos]
ret.append(data)
spos = epos
epos = self.recv_buf.find('\n', spos) if epos == - ():
break
epos +=
return None
测试程序
from SSDB import SSDB
ssdb = SSDB('192.168.1.250', )
l = []
l.append('person_1')
l.append('a')
l.append('')
l.append('b')
l.append('')
print(ssdb.request('multi_hset', l))
'''
print(ssdb.request('set', ['test', '']))
print(ssdb.request('get', ['test']))
print(ssdb.request('incr', ['test', '']))
print(ssdb.request('decr', ['test', '']))
print(ssdb.request('scan', ['a', 'z', ]))
print(ssdb.request('rscan', ['z', 'a', ]))
print(ssdb.request('keys', ['a', 'z', ]))
print(ssdb.request('del', ['test']))
print(ssdb.request('get', ['test']))
print("\n")
print(ssdb.request('zset', ['test', 'a', ]))
print(ssdb.request('zget', ['test', 'a']))
print(ssdb.request('zincr', ['test', 'a', ]))
print(ssdb.request('zdecr', ['test', 'a', ]))
print(ssdb.request('zscan', ['test', 'a', , , ]))
print(ssdb.request('zrscan', ['test', 'a', , , ]))
print(ssdb.request('zkeys', ['test', 'a', , , ]))
print(ssdb.request('zdel', ['test', 'a']))
print(ssdb.request('zget', ['test', 'a']))
print("\n")
print(ssdb.request('hset', ['test', 'a', ]))
print(ssdb.request('hget', ['test', 'a']))
print(ssdb.request('hincr', ['test', 'a', ]))
print(ssdb.request('hdecr', ['test', 'a', ]))
print(ssdb.request('hscan', ['test', '', 'z', ]))
print(ssdb.request('hrscan', ['test', 'z', '', ]))
print(ssdb.request('hkeys', ['test', '', 'z', ]))
print(ssdb.request('hdel', ['test', 'a']))
print(ssdb.request('hget', ['test', 'a']))
print("\n")
'''
pyssdb客户端的使用
import pyssdb
c = pyssdb.Client('192.168.1.250', )
list = ['lastName', '海', 'firstName', '黄']
print(c.multi_hset('person_1', *tuple(list)))
c.disconnect()
测试多线程
import pyssdb
import threading # 客户端默认是有连接池的
c = pyssdb.Client('192.168.1.250', ) def makeCache(func):
list = ['lastName', '海', 'firstName', '黄']
for i in range():
c.multi_hset('person_huanghai_'+str((func-)*i), *tuple(list))
print('成功完成线程:'+str(func))
# 定义五个线程 threads = []
t1 = threading.Thread(target=makeCache, args=(,))
threads.append(t1) t2 = threading.Thread(target=makeCache, args=(,))
threads.append(t2) t3 = threading.Thread(target=makeCache, args=(,))
threads.append(t3) t4 = threading.Thread(target=makeCache, args=(,))
threads.append(t4) t5 = threading.Thread(target=makeCache, args=(,))
threads.append(t5) for t in threads:
t.setDaemon(True)
t.start() t1.join()
t2.join()
t3.join()
t4.join()
t5.join() c.disconnect()
print('程序结束')
兼容python3的SSDB客户端的更多相关文章
- 让你的python程序同时兼容python2和python3
python邮件列表里有人发表言论说「python3在10内都无法普及」.在我看来这样的观点有些过于悲观,python3和python2虽然不兼容,但他们之间差别并没很多人想像的那么大.你只需要对自己 ...
- python3实现的rtsp客户端脚本
一.说明 此客户端使用python3编写 此客户端实现RTSP的OPTIONS, DESCRIBE, SETUP , PLAY, GET_PARAMETER,TEARDOWN方法,未实现ANNOUNC ...
- 在代码生成工具Database2Sharp中使用ODP.NET(Oracle.ManagedDataAccess.dll)访问Oracle数据库,实现免安装Oracle客户端,兼容32位64位Oracle驱动
由于我们开发的辅助工具Database2Sharp需要支持多种数据库,虽然我们一般使用SQLServer来开发应用较多,但是Oracle等其他数据库也是常用的数据库之一,因此也是支持使用Oracle等 ...
- Python2与Python3兼容
Python2与Python3兼容 python3写的代码如何也能在pyhon2上跑?请无论如何加上这一句,python3没有啥影响 from __future__ import absolute_i ...
- Python3 连接各类数据库
Python 标准数据库接口为 Python DB-API,Python DB-API为开发人员提供了数据库应用编程接口.它定义了一系列必须的对象和数据库存取方式, 以便为各种各样的底层数据库系统和多 ...
- 12 . Python3之网络编程
互联网的本质 两台计算机之间的通信与两个人打电话原理是一样的. # 1. 首先要通过各种物理连接介质连接 # 2. 找准确对方计算机(准确到软件)的位置 # 3. 通过统一的标准(一般子协议)进行数据 ...
- TortoiseSvn客户端出现Http state 405 'Method Not Allowed' 的解决办法
原文地址链接 http://stackoverflow.com/questions/28247512/visualsvn-server-3-2-unexpected-http-status-405 就 ...
- python3.4 or 3.x xlwt replaced with xlwt-future
Q:最近在使用python3.4处理一些生物信息数据,需要将内容保存到excel中,但是,但是,发现xlwt不能再3.4中使用,即使安装也安装不成功. 由于xlwt不兼容python3.4(x),不必 ...
- 跨平台轻量级redis、ssdb代理服务器(C++ 11编写)
dbproxy 是我业余采用C++11编写的跨平台代理服务器(并使用lua和自己的网络库),以扩展系统负载,同时使用多个后端数据库,后端数据库支持redis和ssdb. 需要由用户自己编写lua脚本控 ...
随机推荐
- 被引用的外部JS存在window.onload时,判断当前页面是否已存在window.onload,并进行相应处理
如果页面a.html引用了b.js,b.js里的方法需要在页面资源加载完成后执行,即在window.onload里执行:这时如果a.html里使用了window.onload方法,b.js就不能重复调 ...
- BAT-Java必考面试题集
2018最新<BAT Java必考面试题集> 1.面向对象的特征有哪些方面? 答:面向对象的特征主要有以下几个方面: 1)抽象:抽象是将一类对象的共同特征总结出来构造类的过程,包括数据抽象 ...
- 在Linux系统的服务器上使用Memtester进行内存压力测试
最近要测试一台机器的整体性能情况,就在google搜索一番,发现这个一个小工具,说是可以进行内存的压力测试,Memtester主要是捕获内存错误和一直处于很高或者很低的坏位, 其测试的主要项目有随机值 ...
- POJ3186 DP
Treats for the Cows Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 5753 Accepted: 29 ...
- PHP调试的时候出现了警告:
It is not safe to rely on the system解决方法,其实就是时区设置不正确造成的,本文提供了3种方法来解决这个问题. 实际上,从PHP 5.1.0开始当对使用date() ...
- php下载大文件
<?php $file = @ fopen($file_dir . $file_name,"r"); $filesize=filesize($file_dir.$file_n ...
- 挖一挖unsigned int和补码
文章要讨论的是两部分: 1. 原码,反码和补码. 2. short, unsigned short, int, unsigned int, long, unsigned long的表示及转换 1. 原 ...
- 8.IO模型
一.事件驱动模型 服务器处理模型程序,通常有以下几种: (1)收到一个请求则创建一个新的进程来处理这个请求 (2)收到一个请求则创建一个新的线程来处理这个请求 (3)收到一个请求,把它放入事件列表,让 ...
- [SDOI2011] 染色(Luogu 2486)
题目描述 输入输出格式 输入格式: 输出格式: 对于每个询问操作,输出一行答案. 输入输出样例 输入样例#1: 6 5 2 2 1 2 1 1 1 2 1 3 2 4 2 5 2 6 Q 3 5 C ...
- Jenkenis报错:该jenkins实例似乎已离线[转]
解决方法: 安装插件那个页面,就是提示你offline的那个页面,不要动.然后打开一个新的tab,输入网址http://localhost:8080/pluginManager/advanced. 这 ...