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的主要内容,如果未能解决你的问题,请参考以下文章

如何利用redis来进行分布式集群系统的限流设计

jedis连接redis

redis存储session配制方法

Redis实现分布式锁(设计模式应用实战)

Redis实现分布式锁(设计模式应用实战)

Redis缓存:java语言注释符号,附超全教程文档