date:20140530
auth:jin
http://github.com/andymccurdy/redis-py
https://github.com/andymccurdy/redis-py/blob/master/README.rst
一.安装
# yum -y install python-redis
# zypper install python-redis
二.使用
1.连接
import redis
r = redis.Redis(host='127.0.0.1', port=6380, db=1)
或者
r = redis.Redis(unix_socket_path='/tmp/redis.sock')
#help(r)
连接池
>>> pool = redis.ConnectionPool(host='localhost', port=6379, db=0)
>>> r = redis.Redis(connection_pool=pool)
在python中报错,在pypy中可以
更新redis模块由2.0.0升级到2.10.3
# easy_install -U redis
>>> import redis
>>> pool = redis.ConnectionPool(host='localhost', port=6379, db=0)
可以了
2 看信息 r.info()
info = r.info()
for key in info:
print "%s: %s" % (key, info[key])
3 查数据库大小 r.dbsize()
print '
dbsize: %s' % r.dbsize()
4 看连接 r.ping()
print "ping %s" % r.ping()
5 设置key 和value
(1)添加
>>> r = redis.Redis(host='127.0.0.1', port=6380, db=1)
>>> r = redis.StrictRedis(host='127.0.0.1', port=6380, db=0)
>>> r.set('name','jin')
True
>>> r.get('name')
'jin'
字典赋值方式
>>> r['sex'] = 1
>>> r.get('sex')
'1'
append key-value 方式
>>> r.append('email','test@qq.com')
11L
>>> r.get('email')
'test@qq.com'
2)删除
对象delete方法
>>> r.delete('sex')
1
>>> r.delete('sex')
0
del方式
>>> r.get('name')
'jin'
>>> del r['name']
>>> r.get('name')
6.其他key value方法
1).r.exists() 判断是否有key
>>> r.exists('email')
True
2)r.flushdb()
flushall 清空当前主机的数据
flushdb() 清空当前库的数据
>>> r.dbsize()
2L
>>> r.flushdb()
True
>>> r.dbsize()
0L
| flushall(self)
| Delete all keys in all databases on the current host
|
| flushdb(self)
| Delete all keys in the current database
3)列出所有key r.keys()
>>> r.keys()
['name', 'sex', 'level']
便利key获取value
for i in r.keys():
print r.get(i)
通配符
>>> r.keys('a*')
['a', 'a1', 'age']
随机
>>> r.randomkey()
'age'
7.获取数据类型
>>> print r.type('name')
string
三、各种数据类型
它有四种类型: string(key,val)、list(序列)、set(集合)、zset(有序集合,多了一个顺序属性)
(一)、string操作
>>> r.set('name','jin')
True
>>> r['level']=11
>>> r.append('age',28)
2L
#这里有个getset属性,如果为Tr 可以在存新数据时将上次存储内容同时返回出来
>>> r.getset('c2','jj')
'jj'
>>> r.getset('c2','ab')
'jj'
>>> r.get('c2')
'ab'
#设置一个递增的整数 每执行一次它自加1(可以指定偏移):
>>> r.incr('age')
31
>>> r.incr('age')
32
>>> r.get('age')
'32'
>>> r.incr('age',10)
42
>>> r.get('age')
'42'
#设置一个递减的整数 每执行一次它自减1(可以指定偏移)
>>> print 'decr:',r.decr('b1')
decr: -1
>>> print 'decr:',r.decr('b1')
decr: -2
>>> print 'decr:',r.decr('b1',10)
decr: -12
# 取value
get方法
>>> r.get('a1')
'12'
字典方法
>>> r['a1']
'12'
#同时取一批
>>> r.mget('a1','b1')
['12', '-12']
###取key
列出所有key
>>> r.keys()
['name', 'sex', 'level']
便利key获取value
for i in r.keys():
print r.get(i)
通配符
>>> r.keys('a*')
['a', 'a1', 'age']
随机
>>> r.randomkey()
'age'
# 查看一个数据有没有 有 1 无0
print 'existes:',r.exists('a')
# 删数据 1是删除成功 0和None是没这个东西
对象delete方法
>>> r.delete('sex')
1
>>> r.delete('sex')
0
del方式
>>> r.get('name')
'jin'
>>> del r['name']
>>> r.get('name')
# 其他
r.rename('name','uname') #改名
>>> r.expire('uname',10) #让数据10秒后过期
True
>>> r.exists('uname')
False
>>> r.ttl('level') #看剩余过期时间 不存在或者没有设置过期时间是没有任何返回的
55L
>>> r.ttl('uname')
>>> r.expire('a1',10)
True
>>> r.ttl('a1')
7L
>>> r.ttl('a1')
6L
>>> r.ttl('a1')
-2L
>>> r.exists('a1')
False
过期后没这个key了
整理:
添加K-V:
r.set('name','jin')
r.append('age',28)
r.getset('name','diege') 存新数据时将上次存储内容同时返回出来
r.incr('age',10) 递增赋值,每执行一次它自加一个步长(可以指定偏移)
r.decr('age',10) 递减赋值,每执行一次它自加一个步长(可以指定偏移)
获取value
r.get('name')
r['name']
同时取一批:r.mget('a1','b1')
删除:
对象delete方法 r.delete('sex')删数据1是删除成功 0和None是没这个东西
del方式 del r['name']
(二)、序列(list)操作
# 双向序列,两头通的
左塞
>>> r.lpush('b','b1')
1L
>>> r.lpush('b','b2')
2L
lpushx(self, name, value)
Push ``value`` onto the head of the list ``name`` if ``name`` exists
对象不存在的话,不会添加,返回0
# 看长度
>>> r.llen('b')
2
# 列出一批出来
>>> r.lrange('b',start=0,end=-1)
['b2', 'b1']
>>> r.lrange('b',start=0,end=2)
['b4', 'b5', 'b4']
包括end
q
右塞
>>> r.rpush('b','b3')
3L
>>> r.lrange('b',start=0,end=-1)
['b2', 'b1', 'b3']
# 取出一位
>>> r.lindex('b',0)
'b2'
>>> r.lindex('b',-1)
'b1'
# 修剪列表
#若start 大于end,则将这个list清空
>>> r.ltrim('b',start=0,end=2)
True
>>> r.lrange('b',start=0,end=-1)
['b4', 'b5', 'b4']
和切片还不一样,包括了end
# 排序
>>> r.lrange('c',start=0,end=-1)
['1', '3', '5', '3', '2']
>>> r.sort('c')
['1', '2', '3', '3', '5']
>>> r.lrange('d',start=0,end=-1)
['a1', 'a3', 'a2', 'b1', 'b3', 'b2']
>>> r.sort('d')
Traceback (most recent call last):
redis.exceptions.ResponseError: One or more scores can't be converted into double
#移除并返回r.rpop()
>>> r.lrange('a',start=1,end=-1)
['4', '2', '4', '2', '1', '1', '2', '3']
>>> r.rpop('a')
'3'
>>> r.lrange('a',start=1,end=-1)
['4', '2', '4', '2', '1', '1', '2']
删除列表元素lrem
| lrem(self, name, value, num=0)
| Remove the first ``num`` occurrences of elements equal to ``value``
| from the list stored at ``name``.
|
| The ``num`` argument influences the operation in the following ways:
| num > 0: Remove elements equal to value moving from head to tail.
| num < 0: Remove elements equal to value moving from tail to head.
| num = 0: Remove all elements equal to value.
>>> r.lrem('a',4)
2L
>>> r.lrange('a',start=1,end=-1)
['2', '2', '1', '1', '2']
num=0时删除所有匹配该值的元素
['2', '2', '1', '1', '2']
num>0时从头到尾的删除
>>> r.lrem('a',2,1)
1L
>>> r.lrange('a',start=1,end=-1)
['2', '1', '1', '2']
num<0时从尾到头的删除
>>> r.lrange('a',start=1,end=-1)
['2', '1', '1']
同时这个num也是要删除的个数
>>> r.lrem('a',1,2)
2L
>>> r.lrange('a',start=1,end=-1)
['2']
整理:
向序列添加数据
r.rpush('a',1) 右添加
r.lpush('a',3) 左添加
r.lpushx(name, value)对象不存在的话,不会添加,返回0
获序列长度 r.llen('b')
取出序列中制定位置的元素 r.lindex('b',2)
查看序列所有元素 r.lrange('a',start=1,end=-1)
修剪序列 r.ltrim('a',start=0,end=2) 得到剩下的,包含end位置的元素。若start 大于end,则将这个序列清空
排序 r.sort('a') #序列是字符串没有成功
从序列中删除元素并返回 r.rpop()
从序列中删除元素 r.lrem(name, value, num) num是删除的个数,num = 0全部删除,num>0时从头到尾的删除,num<0时从尾到头的删除
清空序列:r.ltrim('a',start=1,end=0) 裁剪的特殊用法
(三)集合
# 塞数据 sadd
>>> r.sadd('b','b1')
1
>>> r.sadd('b','b2')
1
>>> r.sadd('b','b3')
1
# 获取集合元素个数,不存在的集合为0 scard
>>> r.scard('b')
3
>>> r.scard('c')
0
# 判断set中是否有元素 sismember
>>> r.sismember('b','b1')
True
>>> r.sismember('b','b5')
False
# 求交集 sinter
>>> r.sadd('d','d1')
1
>>> r.sadd('d','d2')
1
>>> r.sadd('d','d3')
1
>>> r.sadd('d','b2')
1
>>> r.sinter('b','d')
set(['b2'])
#求交集并将结果赋值 sinterstore
>>> r.sinterstore('newvar','b','d')
1
#赋值给的新对象还是一个set
# 看一个set对象
r.smembers('newvar')
# 求并集 sunion
>>> r.sunion('b','d')
set(['b1', 'b2', 'b3', 'd2', 'd3', 'd1'])
#求并集 并将结果赋给新的集合对象 sunionstore
>>> r.sunionstore('e','b','d')
6
给新集合e
确认
r.smembers('e')
>>> r.smembers('e')
set(['b1', 'b2', 'b3', 'd2', 'd3', 'd1'])
# 求两个集合的不同 sdiff
>>> r.sdiff('s1','s2') #在s1中有,在s2中没有的
set(['t5', 't1'])
>>> r.sdiff('s2','s1') #在s2中有,在s1中没有的
set([])
>>> r.sdiff('s1','s2','s3') # 在s1中有,但在s2和s3中都没有的数
set(['t5', 't1'])
将两和集合的不同赋给新的集合对象 sdiffstore
>>> r.sdiffstore('f','s1','s2')
2
>>> r.smembers('f')
set(['t5', 't1'])
# 取个随机数 srandmember
>>> r.srandmember('s1')
't2'
>>> r.srandmember('s1')
't3'
#从集合中删除元素 r.srem
>>> r.smembers('e')
set(['b1', 'b2', 'b3', 'd2', 'd3', 'd1'])
>>> r.srem('e','b3') #删除一个
1
>>> r.smembers('e')
set(['d3', 'd2', 'b1', 'b2', 'd1']
>>> r.srem('e','b1','b2') #删除多个
2
>>> r.smembers('e')
set(['d2', 'd3', 'd1'])
#整理
向集合添加元素 r.sadd('s','s1')
获取set的元素个数 r.scard('b') 不存在的集合为0
查看整个set的元素 r.smembers('s')
判断set中是否有某个元素 r.sismember('b','b1')
取个随机数 r.srandmember(s)
删除r.srem('s','s1','s2') 从s中删除s1和s2两个元素
求交集 r.sinter('b','d')
求交集并将结果赋值 r.sinterstore('newvar','b','d')
求并集 r.sunion('b','d','f')
求并集 并将结果赋给新的集合对象 r.sunionstore('e','b','d')
两个集合的不同 r.sdiff('s1','s2') #在s1中有,在s2中没有
两个集合的不同赋给新集合 r.sdiffstore('f','s1','s2')
(四)有序集合zset (方法不是很明白)
zadd 添加
zcard 数量
zincr 自加1
zrange 取数据
zrangebyscore 按照积分(范围)取数据
zrem 删除
zscore 取积分
添加
>>> r.zadd('my-key', 'name1', 1.1, 'name2', 2.2, name3=3.3, name4=4.4)
4
数量
>>> r.zcard('my-key')
4
取数据
>> r.zrange('my-key',start=0,end=-1)
['name1', 'name2', 'name3', 'name4']
import time
t1 = time.time()
import redis
r = redis.Redis("localhost")
for i in xrange(1):
a=r.set(i, i)
b=r.get(i)
print b
r.lpush('book','book1')
r.lpush('book','book2')
print 'list llen:',r.llen('book')
print 'list lrange:',r.lrange('book',start=0,end=-1)
print 'list index:',r.lindex('book',1)
r.sadd('xiaoming','song1')
r.sadd('xiaoming','song2')
print 'set scard:',r.scard('xiaoming')
print 'set sismember:',r.sismember('xiaoming','song1')
r.sadd('lily','song1')
print 'sinter:',r.sinter('xiaoming','lily')
print 'set smembers:',r.smembers('xiaoming')
r.zadd(u'zset','xiaoming',2)
r.zadd(u'zset','lily',1)
print 'zrange:',r.zrange('zset',0,-1)
print 'zrangebyscore:',r.zrangebyscore('zset',1,1)
print time.time()-t1
总结:
1)string类型
添加K-V:
r.set('name','jin')
r.append('age',28)
r.getset('name','diege') 存新数据时将上次存储内容同时返回出来
r.incr('age',10) 递增赋值,每执行一次它自加一个步长(可以指定偏移)
r.decr('age',10) 递减赋值,每执行一次它自加一个步长(可以指定偏移)
获取value
r.get('name')
r['name']
同时取一批:r.mget('a1','b1')
删除:
对象delete方法 r.delete('sex')删数据1是删除成功 0和None是没这个东西
del方式 del r['name']
2)list类型
向序列添加数据
r.rpush('a',1) 右添加
r.lpush('a',3) 左添加
r.lpushx(name, value)对象不存在的话,不会添加,返回0
获序列长度 r.llen('b')
取出序列中制定位置的元素 r.lindex('b',2)
查看序列所有元素 r.lrange('a',start=1,end=-1)
修剪序列 r.ltrim('a',start=0,end=2) 得到剩下的,包含end位置的元素。若start 大于end,则将这个序列清空
排序 r.sort('a') #序列是字符串没有成功
从序列中删除元素并返回 r.rpop()
从序列中删除元素 r.lrem(name, value, num) num是删除的个数,num = 0全部删除,num>0时从头到尾的删除,num<0时从尾到头的删除
清空序列:r.ltrim('a',start=1,end=0) 裁剪的特殊用法
3)set类型
向集合添加元素 r.sadd('s','s1')
获取set的元素个数 r.scard('b') 不存在的集合为0
查看整个set的元素 r.smembers('s')
判断set中是否有某个元素 r.sismember('b','b1')
取个随机数 r.srandmember(s)
删除r.srem('s','s1','s2') 从s中删除s1和s2两个元素
求交集 r.sinter('b','d')
求交集并将结果赋值 r.sinterstore('newvar','b','d')
求并集 r.sunion('b','d','f')
求并集 并将结果赋给新的集合对象 r.sunionstore('e','b','d')
两个集合的不同 r.sdiff('s1','s2') #在s1中有,在s2中没有
两个集合的不同赋给新集合 r.sdiffstore('f','s1','s2')
4)zset类型
zadd 添加
zcard 数量
zincr 自加1
zrange 取数据
zrangebyscore 按照积分(范围)取数据
zrem 删除
zscore 取积分
5)通用方法
所有对象:r.keys() 可是通配符 r.keys('a*')
随机获取key:r.randomkey()
对象是否存在:r.exists('a')
对象类型判断:r.type('a')
改名 r.rename('name','uname') 适用于各种类型
设置过期时间 r.expire('uname',10) 适用于各种类型
看剩余过期时间 r.ttl('uname') 适用于各种类型 不存在或者没有设置过期时间是没有任何返回的