redis进阶手册

redis 哈希表、订阅发布、积分板功能使用手册

Redis进阶手册

哈希表

HashTable : key-value的映射,根据key就能快速找到value,并且无论多少键值对,查询时间始终不变,Python字典就是基于哈希表实现的

哈希表可以保存大量数据,一个哈希表可以存储43亿个键值对

  • 官方说,哈希表储存内容相同的情况下,内存占比比字符串小很多推荐使用

常用语法

语法 描述
r.hset('表名key', 字段, 值) 添加hash值
r.hmset('表名key', {字段1:值1,字段2:值2}) 添加多个hash值
r.hdel('表名key', 字段 删除hash
r.hvals('表名key') 返回一个包含哈希表中所有值的表
r.hkeys('表名key') 所有字段的字段名
r.hget('表名key', 字段名) 取一个字段值
r.hmget('表名key', [字段1, 字段2]) 一次性取多个值
r.hgetall('表名key') 全表中所有字段于值
r.hlen('表名key') 查询表内字段总数,没有表返回0
r.hexists('表名key', 字段) 查询key是否存在

插入、删除、查重

案例1

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import redis

pool = redis.ConnectionPool(decode_responses=True)
r = redis.Redis(connection_pool=pool)

# 插入
r.hset('online_status', 'user1', 1)

# 删除
r.hdel('online_status', 'user1')

# 查重
ret = r.hexists('online_status', 'user1')

print(ret)

案例2

单个参数 + 批量插入 Demo

1
2
3
4
5
6
7
8
9
10
11
12
13
14
import redis
import json
pool = redis.ConnectionPool(decode_responses=True)
r = redis.Redis(connection_pool=pool)

"""单个插入信息"""
r.hset('user_info', '小张', json.dumps({'age': 18, 'address': '重庆'}))

"""批量插入信息"""
other_people = {
'老王': json.dumps({'age': 18, 'address': '重庆'}),
'小李': json.dumps({'age': 18, 'address': '上海'}),
}
r.hmset('user_info', other_people)

发布消息/订阅频道

该模式是一种消息通讯模式,实现了一堆多的消息实时发布功能,

优势:

  • 不浪费系统监听资源
  • 不会轮询带来的消息延迟
  • 自动解决字符串通讯问题。
  • 代码更简洁

在python中实现 redis的 发布订阅功能是非常的简单

服务端

1
2
3
4
import redis
r = redis.Redis(decode_responses=True)

r.publish('频道1', '是这条消息')

向一个指定频道发送一个消息

客户端订阅频道

1
2
3
4
5
6
7
import redis
r = redis.Redis(decode_responses=True)

listener = r.pubsub()
listener.subscribe('频道1')
for message in listener.listen():
print(message)

运行结果

key位置

注意链接上会自动打印一条链接频道的提示信息!

积分功能

redis 利用有序集合可以实现积分排行功能,做到实时排名快速归类等特点

添加数据

方法1(可以用变量):

1
2
3
4
5
6
r.zadd('集合名',值1,分数1,值2,分数2)
```

方法2:
```python
r.zadd('集合名',值1=分数1,值2=分数2)

修改评分

1
r.zincrby('有序集合名', 值, 新分数)

注意! 新版redis该命令修改为如下

1
r.zincrby('有序集合名', 分数加减, 值)

排序

按评分排序

规则 语法
zrangebyscore 分数从小到大排序
zrevrangebyscore 分数从大到小排序
1
2
3
4
5
6
r.zrangebyscore('有序集合名', 查找分上线,查找分下限,结果切片起始,结果数量,withscores=False)

r.zrevrangebyscore('有序集合名', 查找分上线,查找分下限,结果切片起始,结果数量,withscores=False)

"""取积分在10~100内倒序取前三个"""
r.zrevrangebyscore('rank', 100, 10,0,3)

按位置排序

基于位置顺序进行排序, 支持-1这样的语法

规则 语法
zrange 分数从小到大排序
zrevrange 分数从大到小排序

上述根据0开始的索引找到需要排序的元素范围,然后对这个范围内的数据进行排序

例如

1
2
r.zrange('有序集合名', 开始位置, 结束位置,desc=False, withscores=False)
r.zrevrange('有序集合名', 开始位置, 结束位置, withscores=False)

  • desc=True zrange的属性,底层会调用reverange方法,作用是取最大值的x个元素,而不是取最小的x个元素再倒序
  • withscores为False,返回结果会排序,否则返回元祖

取出分数最高的5个

1
r.zrange('rank',0,4,withscores=True)

查排名,查评分

可以查询一个值在列表中的排名

规则 语法
zrank 值存在返回排名(从0开始)0为最小分的下标,不存在返回None
zrevrank 值存在返回排名(从0开始)0为最大分的下标,不存在返回None
zscore 查询指定值的评分
zcard 查询值总数
zcount 查询评分范围内多少值