python之redis
redis是一个key-value存储系统。和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sorted set –有序集合)和hash(哈希类型)。这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。在此基础上,redis支持各种不同方式的排序。与memcached一样,为了保证效率,数据都是缓存在内存中。区别的是redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。
1.连接redis
# -*- coding:utf-8 -*-
import redis
conn = redis.Redis(host='127.0.0.1',port=6379,db=0)
print(conn.keys('*'))
连接池连接redis
# -*- coding:utf-8 -*-
import redis
pool = redis.ConnectionPool(host='127.0.0.1', port=6379,db=0)
conn = redis.Redis(connection_pool=pool)
print(conn.keys('*'))
redis操作
1.字符串操作
#在Redis中设置值,默认不存在则创建,存在则修改 使用set设置
conn.set('name', 'zhangsan')
参数: set(name, value, ex=None, px=None, nx=False, xx=False)
ex,过期时间(秒)
px,过期时间(毫秒)
nx,如果设置为True,则只有name不存在时,当前set操作才执行,同setnx(name, value)
xx,如果设置为True,则只有name存在时,当前set操作才执行
#mset可以一次设置多个值
conn.mset(name1='zhangsan',name2='lisi')
#使用get获取对应的键值
s= conn.get('name1')
print(s)
使用mget获取多个键值
s= conn.mget('name1','name2')
print(s)
2、Hash 操作
redis中的Hash 在内存中类似于一个name对应一个dic来存储
hset(name, key, value) 设置
conn.hset('person','name','zhangsan')
hget(name,key)获取
print(conn.hget("person","name"))#
hgetall(name)
#获取name对应hash的所有键值
print(r.hgetall("
person"))
hmset(name, mapping)
#在name对应的hash中批量设置键值对,mapping:字典
dict_info ={
'name':'zhangsan',
'age':18
}
conn.hmset('person1',dict_info)
hmget(name, keys, *args)
# 在name对应的hash中获取多个key的值
s= conn.hmget('person1','name','age')
print(s)
hlen(name)、hkeys(name)、hvals(name)
#hlen(name) 获取hash中键值对的个数
print(conn.hlen('person1'))
#hkeys(name) 获取hash中所有的key的值
print(con.hkeys("person1"))
#hvals(name) 获取hash中所有的value的值
print(conn.hvals("person1"))
hexists(name, key)
#检查name对应的hash是否存在当前传入的key
print(conn.hexists("person1","age"))#输出:True
hdel(name,*keys)
#删除指定name对应的key所在的键值对
conn.hdel("person","age")
3、List 操作
redis中的List在在内存中按照一个name对应一个List来存储
lpush(name,values)
# num对应的list中添加元素,每个新的元素都添加到列表的最左边
conn.lpush('num',1,2,3,4,5,6)
rpush(name,values)
#同lpush,但每个新的元素都添加到列表的最右边
lpushx(name,value)
#在name对应的list中添加元素,只有name已经存在时,值添加到列表的最左边
rpushx(name,value)
#在name对应的list中添加元素,只有name已经存在时,值添加到列表的最右边
llen(name)
# name对应的list元素的个数
print(conn.llen('num'))
# 在name对应的列表的某一个值前或后插入一个新值
conn.linsert("num","BEFORE","3","18")#在列表内找到第一个元素3,在它前面插入18
'''参数:
name: redis的name
where: BEFORE(前)或AFTER(后)
refvalue: 列表内的值
value: 要插入的数据'''
conn.lset(name, index, value)对该索引重新赋值
conn.lset('num',2,19) 把索引为2的改为19
#删除name对应的list中的指定值
conn.lrem("num","19",num=0)
''' 参数:
name: redis的name
value: 要删除的值
num: num=0 删除列表中所有的指定值;
num=2 从前到后,删除2个19;
num=-2 从后向前,删除2个19'''
lpop(name)
#移除列表的左侧第一个元素,返回值则是第一个元素
print(conn.lpop("num"))
lindex(name, index)
#根据索引获取列表内元素
print(conn.lindex("num",1))
lrange(name, start, end)
#分片获取元素
print(conn.lrange("num",0,-1))
ltrim(name, start, end)
#移除列表内没有在该索引之内的值
conn.ltrim("num",0,2) 0-2
rpoplpush(src, dst)
# 从一个列表取出最右边的元素,同时将其添加至另一个列表的最左边
#src 要取数据的列表
#dst 要添加数据的列表
4、Set 操作
Set集合就是不允许重复的列表
sadd(name,values)
#给name对应的集合中添加元素
conn.sadd('num2',11,22)
smembers(name)
#获取name对应的集合的所有成员
s= conn.smembers('num2')
print(s)
scard(name)
#获取name对应的集合中的元素个数
conn.scard("num2")
sismember(name, value)
#检查value是否是name对应的集合内的元素
s= conn.sismember('num2',22)
print(s) true
smove(src, dst, value)
#将某个元素从一个集合中移动到另外一个集合
spop(name)
#从集合的右侧移除一个元素,并将其返回
srem(name, values)
#删除name对应的集合中的某些值
conn.srem('num2','11')
其他常用操作
delete(*names)
#根据name删除redis中的任意数据类型
exists(name)
#检测redis的name是否存在
keys(pattern=’*’)
#根据* ?等通配符匹配获取redis的name
expire(name ,time)
# 为某个name设置超时时间
rename(src, dst)
# 重命名
move(name, db))
# 将redis的某个值移动到指定的db下
type(name)
# 获取name对应值的类型
redis pipline
使用pipline实现一次请求指定多个命令
pipe = r.pipeline(transaction=True)
conn.set('name', 'zhangsan')
conn.set('name', 'lisi')
pipe.execute()
redis发布订阅
首先定义一个RedisHelper类,连接Redis,定义频道为monitor,定义发布(publish)及订阅(subscribe)方法。
#!/usr/bin/env python
#-*- coding:utf-8 -*-
import redis
class RedisHelper(object):
def __init__(self):
self.__conn = redis.Redis(host='127.0.0.1',port=6379)#连接Redis
self.channel = 'monitor' #定义名称
def publish(self,msg):#定义发布方法
self.__conn.publish(self.channel,msg)
return True
def subscribe(self):#定义订阅方法
pub = self.__conn.pubsub()
pub.subscribe(self.channel)
pub.parse_response()
return pub
发布者
#!/usr/bin/env python
# -*- coding:utf-8 -*-
#发布
from RedisHelper import RedisHelper
obj = RedisHelper()
obj.publish('hello')#发布
订阅者
#!/usr/bin/env python
# -*- coding:utf-8 -*-
#订阅
from RedisHelper import RedisHelper
obj = RedisHelper()
redis_sub = obj.subscribe()#调用订阅方法
while True:
msg= redis_sub.parse_response()
print (msg)
订阅者必须先启动 否则无法收听