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. Flex 布局教程:语法篇 【转】

    Flex 布局教程:语法篇   作者: 阮一峰 日期: 2015年7月10日 原文:http://www.ruanyifeng.com/blog/2015/07/flex-grammar.html 网 ...

  2. mysql的select的五子句

    转: http://www.cnblogs.com/billyu/p/5033167.html http://www.cnblogs.com/xiadong90-2015/p/4222965.html ...

  3. Android核心类源码分析

    Handler流程1.首先Looper.prepare()在本线程中保存一个Looper实例,然后该实例中保存一个MessageQueue对象:因为Looper.prepare()在一个线程中只能调用 ...

  4. [技巧篇]12.从Spring的编码过滤器说起

    有一枚学生问问了我一个问题,突然灵感爆发,他使用的Spring的过滤器,前台利用GET方式向后端发出一个请求,由于里面含有中文数据,结果在后端显示的是乱码,他问我为什么?明明在Spring里面也配了字 ...

  5. 图论:LCA-树上倍增

    BZOJ1602 求最近公共祖先有三种常用的方法,在线的有两种,分别是树上倍增算法和转化为RMQ问题 离线的有一种,使用Tarjan算法 这里,我们介绍复杂度优异并且在线的倍增算法,至于后续的两种方法 ...

  6. 【bzoj3362-导航难题】带权并查集

    题意: 约翰所在的乡村可以看做一个二维平面,其中有N 座牧场,每座牧场都有自己的坐标,编号为1到N.牧场间存在一些道路,每条道路道路连接两个不同的牧场,方向必定平行于X 轴或Y轴.连通两座牧场之间的路 ...

  7. 【Foreign】咏叹 [模拟退火]

    咏叹 Time Limit: 100 Sec  Memory Limit: 256 MB Description 有n根木棍,第i根长度为ai.你要贴着墙围出一个矩形区域,木棍围成的矩形边缘必须平行或 ...

  8. bzoj 4378: [POI2015]Logistyka ——树桩数组+离散化

    Description 维护一个长度为n的序列,一开始都是0,支持以下两种操作:1.U k a 将序列中第k个数修改为a.2.Z c s 在这个序列上,每次选出c个正数,并将它们都减去1,询问能否进行 ...

  9. 汕头市队赛 SRM19 字符题

    从天上掉下来了个这样的问题: 有一个字符串 从中选出两个子串 A,B,求 A+B可以构成的不同串的个数. 还想知道,这么多个串中字典序最大的那一个. 某人捡到了这个问题,并把它扔给了你. [输入] 一 ...

  10. 海康解码器对接总结(java 版)

    本文只是对接海康解码器的动态解码功能,即配置解码器大屏上指定的某个窗口去解某一路IP视频源. 1. 首先,定义所需的结构体与接口.海康SDK中包含的结构体与接口非常之多,在官方的例子中,实现了大部分的 ...