Redis 考核查漏补缺
本文为笔者在学习过程中锁遗漏的部分,非完整的学习记录
一、位图
1.1 什么是位图?
位图是 Redis 中一种高效存储布尔值(0 或 1)的数据结构,通常用于记录状态信息,例如签到系统、用户活跃度统计等。
1.2 核心命令
SETBIT key offset value
:将位图中指定位置的值设置为 0 或 1。GETBIT key offset
:获取位图中指定位置的值。BITCOUNT key
:统计位图中值为 1 的位数。
1.3 实际应用
签到系统:
- 每个用户对应一个位图,位图的每个位表示一天的签到状态。
- 使用
SETBIT user:1 0 1
表示用户 1 在第 0 天签到。 - 使用
BITCOUNT user:1
统计用户 1 的总签到天数。
用户活跃度统计:
- 每天使用一个位图记录活跃用户,位图的每个位表示一个用户是否活跃。
- 使用
SETBIT day:20231001 12345 1
表示用户 12345 在 2023 年 10 月 1 日活跃。 - 使用
BITCOUNT day:20231001
统计当天的活跃用户总数。
二、位域
2.1 什么是位域?
位域是 Redis 中一种高效存储整数值的数据结构,通常用于计数器、资源分配等场景。
2.2 核心命令
BITFIELD key
:操作位域的核心命令,支持设置、获取和递增位域中的值。SET offset value
:将位域中指定位置的值设置为指定值。GET offset
:获取位域中指定位置的值。INCRBY offset increment
:将位域中指定位置的值递增。
2.3 实际应用
计数器:
- 使用位域存储每个用户的积分,位域的每个位置对应一个用户。
- 使用
BITFIELD user:points SET u32 0 100
将用户 0 的积分设置为 100。 - 使用
BITFIELD user:points INCRBY u32 0 10
将用户 0 的积分增加 10 分。
资源分配:
- 使用位域记录资源的分配状态,位域的每个位表示一个资源是否被占用。
- 使用
BITFIELD resources SET u1 0 1
表示资源 0 已被占用。 - 使用
BITFIELD resources GET u1 0
检查资源 0 是否被占用。
三、流
3.1 什么是流?
流是 Redis 中一种用于处理高吞吐量消息队列的数据结构,支持消息的存储、消费和分组。
3.2 核心命令
XADD key MAXLEN count * field value
:向流中添加一条消息,MAXLEN
用于限制流的长度。XREAD COUNT count STREAMS key ID
:读取消息,ID
指定从哪个消息开始读取。XGROUP CREATE key groupname id
:创建消费组,用于消息的分组消费。XREADGROUP GROUP groupname consumername COUNT count STREAMS key >
:从消费组中读取消息。
3.3 实际应用
聊天系统:
- 使用
XADD chat:room1 * user "Alice" message "Hello"
向房间 1 发送消息。 - 使用
XREAD COUNT 1 STREAMS chat:room1 0
读取房间 1 的所有消息。
日志收集系统:
- 使用
XADD logs:* * level "ERROR" message "System failure"
记录日志。 - 使用
XREAD COUNT 10 STREAMS logs 0
读取最近 10 条日志。
四、地理空间
4.1 什么是地理空间?
Redis 的地理空间功能允许存储和查询地理位置信息,支持基于经纬度的存储和范围查询。
4.2 核心命令
GEOADD key longitude latitude member
:将地理位置信息添加到指定键中。GEORADIUS key longitude latitude radius unit
:查询指定范围内的地理位置。GEODIST key member1 member2 unit
:计算两个地理位置之间的距离。
4.3 实际应用
LBS(基于位置的服务):
- 使用
GEOADD restaurants 116.4 39.9 "McDonald's"
存储餐厅的地理位置。 - 使用
GEORADIUS restaurants 116.4 39.9 5 km
查询距离用户 5 公里内的餐厅。 - 使用
GEODIST restaurants "McDonald's" "KFC" km
计算两家餐厅之间的距离。
五、集合随机返回数据
5.1 什么是集合?
集合是 Redis 中一种无序的字符串集合,支持添加、删除和随机返回元素。
5.2 核心命令
SADD key member
:向集合中添加一个元素。SREM key member
:从集合中删除一个元素。SRANDMEMBER key [count]
:随机返回一个或多个元素,count
为负数时会移除返回的元素。
5.3 实际应用
抽奖系统:
- 使用
SADD prizes "iPhone" "iPad" "AirPods"
存储奖品。 - 使用
SRANDMEMBER prizes 1
随机抽取一个奖品。 - 使用
SRANDMEMBER prizes -1
随机抽取并移除一个奖品。
六、SCAN 命令
6.1 什么是 SCAN?
SCAN
是 Redis 中用于遍历键空间的命令,相比传统的 KEYS
命令,SCAN
更加高效且不会阻塞服务器。
6.2 核心命令
SCAN cursor [MATCH pattern] [COUNT count]
:遍历键空间,cursor
是游标,MATCH
用于指定匹配模式,COUNT
用于指定每次迭代返回的元素数量。
6.3 实际应用
遍历所有键:
- 使用
SCAN 0
开始遍历,直到返回的游标为 0。 - 示例:
SCAN 0 MATCH user:* COUNT 10
查找特定模式的键:
- 使用
SCAN
配合MATCH
查找符合特定模式的键。 - 示例:
SCAN 0 MATCH "log:2023*" COUNT 100