python/mq Redis
Posted ikct2017
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python/mq Redis相关的知识,希望对你有一定的参考价值。
简介
Redis是一个缓存数据库,但它的用处不仅仅是数据库,更多的是用来作为消息队列和缓存来使用。
和RabbitMQ一样,也是基于socket通信的,所以要注意数据的格式是byte。
基本
在Python中使用Redis其实很简单,用redis模块即可,使用连接池的方法可以降低频繁建立连接的开销。
import redis
pool = redis.ConnectionPool(host=‘localhost‘, port=6479)
cache = redis.Redis(connection_pool=pool)
操作
常用命令
delete(*names) # 删除任意数据类型
exists(name) # 检测是否存在
keys(patter=‘*‘) # 根据正则匹配name
expire(name, time)
rename(src, dst)
move(name, db) # 将name移到指定db
type(name)
scan(cursor, match=None, count=None)
String
就是key-value对的操作。
# ex过期时间秒,px过期时间毫秒,nx为True只有name不存在才执行,xxTrue只有name存在才执行
set(name, value, ex, px, nx, xx)
mset(key, value, key, value...)
getset(key, value) # 获取原来的并设置为新的value
getrange(key, start, end) # 对value切片
setbit(key, offset, value) # 对二进制的offset位修改为value值(0/1)
bitcount(key) # 计算二进制位1的个数
getbit(key, offset) # 获取指定offset位的value状态
append(key, value) # 在前value处追加value
Hash
相当于嵌套的字典,key-{key-value}。
# 一个name中可存200多亿个key
hset(name, key, value) # name是hash的key,key和value相当于hash的值
hgetall(name) # 获取所有key-value
hget(name, key) # 获取指定value
hkeys(name) # 获取所有key
hvals(name) # 获取所有value
hmset(name, {k1:v1, k2:v2}) # 设置多个
hlen(name) # 获取key个数
hdel(name, *key) # 删除key
hscan(name, cursor, match=None, count=None) # 从cursor指定的下标开始,匹配match正则,返回列表
hscan_iter(name, match=None, count=None) # 返回迭代器
List
就是列表,通过下标取值。
骚操作就是如rpoplpush和blpop这种操作。
lpush(name, values) # 从命名列表左侧存入多个值,LIFO
rpush(name, values) # 从命名列表右侧存入多个值,FIFO
lrange(names, start, end) # 取所有就是0,-1,l代表列表不是左
llen(name) # 获取列表长度
linsert(name, BEFORE|AFTER, pivot, value) # 在值pivot前后插入新值
lset(name, index, value) # 将指定下标的值修改为新值
lrem(name, count, value) # 删除指定的值,coutn为0删除所有,正负数代表前后n个
lpop(name) # 弹出第一个元素
lindex(name, index) # 获取指定index值
ltrim(name, start, end) # 移除指定范围外的所有元素
rpoplpush(n1, n2)
blpop(name, timeout=0) # 0为无限,从name列表左边取值,无值时阻塞指定延迟时间
brpop(name, timeout=0)
Set
相当于集合,交并差集,数据过滤。
sadd(name, values) # 集合添加值
scard(name) # 获取个数
sdiff(name, *names) # 差集,去除共有values
sdiffstore(store, name, *names) # 存入store
smembers(name) # 获取所有
sinter(name1, name2) # 求交集
sismember(name, value) # 检测是否存在
smove(name1, name2, value) # 从name1将value移动到name2
spop(name) # 尾部弹出
srandmembers(name, numbers) # 随机获取指定个数的value
srem(name, values) # 删除多个value
sunion(name, values) # 并集
sscan(name, cursor, match=None, count=None)
SortSet
有序集合,可以按权重分数来排序元素,同时也具备集合的过滤特性。
zadd(name, *args, **kwargs) # *args为权重-value,**kwargs为value=权重
zrange(name, start, end, withscores=False) # 获取指定
zcount(name, min, max) # 获取分数在范围内的个数
zrank(name, value) # 获取指定value的排名,从0开始
zremrangebyrank(name, min, max)
zscore(name, value) # 获取分数
zscan(name, cursor, match=None, count=None)
Pipe
管道操作,具有一定的事务能力。
pipe = r.pipline(transaction=True)
pipe.set(‘name‘, ‘tom‘)
time.sleep(30)
pipe.set(‘role‘, ‘engineer‘)
pipe.execute()
发布与订阅模式
既然是用来传递消息,那么就会有发布与订阅模式,而且相比RabbitMQ,Redis的发布与订阅模式更简单。
# 先了解Redis关于发布与订阅模式的几条命令
r.publish(channel, message) # 发布消息到指定频道
pub = r.pubsub() # 创建订阅对象,通过该对象可订阅频道
pub.subscribe(*args, **kwargs) # 订阅一个或多个频道
pub.psubscribe(*args, **kwargs) # 订阅模式频道,关键词参数:channel=pattern
pub.unsubscribe(*args) # 取消订阅,参数为空表示取消所有
pub.punsubscribe(*args) # 取消模式订阅
示例:
# 发布者
r.publish(channel, message)
# 订阅者
pub = r.pubsub() # 创建订阅者
pub.subscribe(channel) # 订阅频道
while True:
for item in pub.listen(): # 循环监听频道消息
print(item[‘channel‘], item[‘message‘])
以上是关于python/mq Redis的主要内容,如果未能解决你的问题,请参考以下文章