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客户端的更多相关文章

  1. 让你的python程序同时兼容python2和python3

    python邮件列表里有人发表言论说「python3在10内都无法普及」.在我看来这样的观点有些过于悲观,python3和python2虽然不兼容,但他们之间差别并没很多人想像的那么大.你只需要对自己 ...

  2. python3实现的rtsp客户端脚本

    一.说明 此客户端使用python3编写 此客户端实现RTSP的OPTIONS, DESCRIBE, SETUP , PLAY, GET_PARAMETER,TEARDOWN方法,未实现ANNOUNC ...

  3. 在代码生成工具Database2Sharp中使用ODP.NET(Oracle.ManagedDataAccess.dll)访问Oracle数据库,实现免安装Oracle客户端,兼容32位64位Oracle驱动

    由于我们开发的辅助工具Database2Sharp需要支持多种数据库,虽然我们一般使用SQLServer来开发应用较多,但是Oracle等其他数据库也是常用的数据库之一,因此也是支持使用Oracle等 ...

  4. Python2与Python3兼容

    Python2与Python3兼容 python3写的代码如何也能在pyhon2上跑?请无论如何加上这一句,python3没有啥影响 from __future__ import absolute_i ...

  5. Python3 连接各类数据库

    Python 标准数据库接口为 Python DB-API,Python DB-API为开发人员提供了数据库应用编程接口.它定义了一系列必须的对象和数据库存取方式, 以便为各种各样的底层数据库系统和多 ...

  6. 12 . Python3之网络编程

    互联网的本质 两台计算机之间的通信与两个人打电话原理是一样的. # 1. 首先要通过各种物理连接介质连接 # 2. 找准确对方计算机(准确到软件)的位置 # 3. 通过统一的标准(一般子协议)进行数据 ...

  7. TortoiseSvn客户端出现Http state 405 'Method Not Allowed' 的解决办法

    原文地址链接 http://stackoverflow.com/questions/28247512/visualsvn-server-3-2-unexpected-http-status-405 就 ...

  8. python3.4 or 3.x xlwt replaced with xlwt-future

    Q:最近在使用python3.4处理一些生物信息数据,需要将内容保存到excel中,但是,但是,发现xlwt不能再3.4中使用,即使安装也安装不成功. 由于xlwt不兼容python3.4(x),不必 ...

  9. 跨平台轻量级redis、ssdb代理服务器(C++ 11编写)

    dbproxy 是我业余采用C++11编写的跨平台代理服务器(并使用lua和自己的网络库),以扩展系统负载,同时使用多个后端数据库,后端数据库支持redis和ssdb. 需要由用户自己编写lua脚本控 ...

随机推荐

  1. Java反转字符串的方式?

    1. 将String转换成字符数组,再利用字符数组进行首尾调换. 2. 利用递归的方式,主要是:reverse(str.substring(1)) + str.charAt(0); 3. 虽然Stri ...

  2. CCPC-Winter Camp div2 day5

    DIV2 有部分div1的题会写 div1的大佬真的太强了 向他们学习 (好像和zqc大佬说过话了hhh,zqc大佬真的是一个超有意思的人啊,羡慕有妹子队友的zqc大佬) A: 你有一棵树,你想把它画 ...

  3. ubuntu 服务器搭建汇总

    开启ssh 1.首先:终端安装开启ssh-server服务: sudo apt-get install openssh-server 2.然后确认sshserver是否启动了: ps-e | grep ...

  4. Base64 编解码

    Base64编码简介 Base64用来将binary的字节序列数据编码成ASCII字符序列构成的文本.其使用的字符包括大小写字母各26个,加上10个数字,和加号“+”,斜杠“/”,一共64个字符.另外 ...

  5. [rsync]rsync设定及错误处理

    server端设置      修改/etc/default/rsync RSYNC_ENABLE=true RSYNC_OPTS='--address=10.192.0.5' RSYNC_NICE=' ...

  6. 元类编程-- metaclass

    #类也是对象,type创建类的类 def create_class(name): if name == "user": class User: def __str__(self): ...

  7. 知问前端——cookie插件

    Cookie是网站用来在客户端保存识别用户的一种小文件.一般可以保存用户登录信息.购物数据信息等一系列微小信息. 一.使用cookie插件 官方网站:http://plugins.jquery.com ...

  8. 超酷算法-BK树

    前几天无意间遇到一个博客,觉得写得挺好的,自己之前的时候有个不好的习惯,那就是遇到了好资源第一反应就是收藏起来然后却很少再看!!这是坏习惯,要改!于是今天就开始通读了,读的第二篇是BK树.觉得有点意思 ...

  9. LTC 钱包部署

    基础环境 系统: CentOS 7.x nodejs: v4.6.0 zeromq: 4.x 安装nodejs + zeromq 基础依赖 yum install -y gcc make gcc-c+ ...

  10. How to write educational schema.

    Sometimes, writing such educational schemas could be of much use, and creating such docs can be bene ...