兼容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脚本控 ...
随机推荐
- [zhuan]java发送http的get、post请求
http://www.cnblogs.com/zhuawang/archive/2012/12/08/2809380.html Http请求类 package wzh.Http; import jav ...
- CSS设计一个三列布局的页面
探讨这种布局是因为最近对话框组件以及信息系统B/S界面布局的需要.无论是什么,我们在写CSS之前首先引入reset.css,我使用的是淘宝的reset. 01 /* 02 KISSY CSS Rese ...
- 面向小数据集构建图像分类模型Keras
文章信息 本文地址:http://blog.keras.io/building-powerful-image-classification-models-using-very-little-data. ...
- ubuntu 服务器搭建汇总
开启ssh 1.首先:终端安装开启ssh-server服务: sudo apt-get install openssh-server 2.然后确认sshserver是否启动了: ps-e | grep ...
- 【题解】互不侵犯 SCOI 2005 BZOJ 1087 插头dp
以前没学插头dp的时候觉得这题贼难,根本不会做,学了才发现原来是一裸题. 用二进制表示以前的格子的状态,0表示没放国王,1表示放了国王. 假设当前位置为(x,y),需要记录的是(x-1,y-1)至(x ...
- Java中的String为什么是不可变的? — String源码分析
原文地址:http://www.importnew.com/16817.html 什么是不可变对象? 众所周知, 在Java中, String类是不可变的.那么到底什么是不可变的对象呢? 可以这样认为 ...
- [Android篇]Android Studio + Genymotion 一夜无眠 ,超级详细版本[请使用新版2.0]
环境说明:这里很重要,因为我在windows10中吃过很多的亏 操作系统: windows 7 64位系统 JDK 64位 : jdk1.7.0_75 注意我这里吃过亏!都用64位的! Android ...
- Chromedriver 的安装与配置
首先是下载网址:https://sites.google.com/a/chromium.org/chromedriver/downloads(需要FQ,用Browser浏览器即可翻进,版本要和Chro ...
- mysql按月统计六个月内不同类型订单的成交金额
mysql按月统计六个月内不同类型订单的成交金额 创建数据库 CREATE DATABASE test; 创建订单表 CREATE TABLE `t_order` ( `id` ) NOT NULL ...
- [洛谷P2852] [USACO06DEC]牛奶模式Milk Patterns
洛谷题目链接:[USACO06DEC]牛奶模式Milk Patterns 题目描述 Farmer John has noticed that the quality of milk given by ...