1、String
String:Redis 中最常用的数据类型,可以存储字符串或数字。
String 结构:
String 底层使用 SDS 实现。
1.1 使用
| 命令 | 语法 | 说明 |
|---|---|---|
| SET | SET [key] [value] | 设置 key 的值为 value |
| GET | GET [key] | 获取 key 的值 |
| DEL | DEL [key] | 删除 key |
| SETEX | SETEX [key] [seconds] [value] | 设置 key 的值为 value,且过期时间为 seconds 秒 |
| EXPIRE | EXPIRE [key] [seconds] | 设置 key 的过期时间为 seconds 秒- key 不存在,expire 命令执行失败 |
| TTL | TTL [key] | 以 s 为单位,返回 key 的剩余存活时间。 若 key 无过期时间,返回 -1。 若 key 不存在,返回 -2 |
| PTTL | PTTL [key] | 以 ms 为单位,返回 key 的剩余存活时间。 key 无过期时间,返回 -1。 key 不存在,返回 -2 |
| INCR | INCR [key] | 将 key 的 value 递增 1- key 不存在,会将 key 设置为 0,再递增 1 |
| DECR | DECR [key] | 将 key 的 value 递减 1- key 不存在,会将 key 设置为 -1,再递减 1 |
| INCRBY | INCRBY [key] [increment] | 将 key 的 value 递增 increment- increment 可以是任意整数 |
| DECRBY | DECRBY [key] [decrement] | 将 key 的 value 递减 decrement- decrement 可以是任意整数 |
| MSET | MSET [key1] [value1] ... | 设置一个或多个 key-value- key 已存在,则会覆盖旧值 |
| MGET | MGET [key1] ... | 获取所有指定的 key 的值 |
| APPEND | APPEND [key] [val] | 向 key 的 value 后添加 val- key 不存在,则将 key 的 value 设置为 val |
1.2 应用
1)缓存
缓存单值:
- 缓存库存:
SET stock 1000 - 获取库存:
GET stock
缓存对象:
- 缓存用户:
MSET user:1:name zhangsan user:1:sex "男" - 获取用户:
MGET user:1:name user:1:sex
2)计数
增加文章阅读量:INCR article:readCount:1
获取文章阅读量:GET article:readCount:1
3)分布式锁
获取分布式锁:SETNX lock:product:1 "true"
释放分布式锁:DEL lock:product:1
4)共享 Session
存储 Session:SET session:<session_id> serialized_session_object
获取 Session:GET session:<session_id>
2、Hash
Hash:Redis 中提供的存储键值对的集合。
Hash 结构:
Hash 底层使用 HashTable 或 ZipList 实现:
- 若元素个数 < hash-max-ziplist-entries(默认:512) && 元素值 < hash-max-ziplist-value(默认:64 Byte):ZipList
- 其余情况:HashTable
2.1 使用
| 命令 | 语法 | 说明 |
|---|---|---|
| HSET | HSET key field value [field value ...] | 设置 key 中 field 为 value。 |
| HSETNX | HSETNX key field value | 当 key 中 field 不存在时,才会设置 field 的 value。 |
| HGET | HGET key field | 获取 key 中 field 的 value。 |
| HINCRBY | HINCRBY key field increment | 为 key 中的 field 的 value 增加 increment。若 field 不存在,则会创建并初始化为 0,再加 increment。 |
| HINCRBYFLOAT | HINCRBYFLOAT key field increment | 与 HINCRBY 一致,但 increment 可以为浮点数。 |
| HDEL | HDEL key field [field ...] | 删除 key 中一个或多个 field。 |
| HEXISTS | HEXISTS key field | 检查 key 中 field 是否存在。 |
| HLEN | HLEN key | 返回 key 中 field 的个数。 |
| HKEYS | HKEYS key | 返回 key 中所有的 field。 |
| HVALS | HVALS key | 返回 key 中所有的 value。 |
| HGETALL | HGETALL key | 返回 key 中所有的 field 和 value。 |
| HSCAN | HSCAN key cursor [MATCH pattern] [COUNT count] [NOVALUES] | 迭代哈希表中的字段和值,支持模式匹配和限制返回数量。 |
2.2 应用
1)缓存对象
缓存用户对象:HSET user:1001 name "Jame" sex "男" phone "13604321168"
读取用户对象:HGET user:1001
2)购物车
添加商品:hset cart:用户id 商品id 1
增加数量:hincrby cart:用户id 商品id 1
商品总数:hlen cart:用户id
删除商品:hdel cart:用户id 商品id
获取购物车中所有商品:hgetall cart:用户id
3、List
List:Redis 中提供的有序的字符串列表。
List 结构:
List 底层使用 QuickList 实现。
3.1 使用
| 命令 | 语法 | 说明 | |
|---|---|---|---|
| LPUSH | LPUSH key element [element ...] | 将一个或多个 element 添加到 key 的左侧。 | |
| RPUSH | RPUSH key element [element ...] | 将一个或多个 element 添加到 key 的右侧。 | |
| LPOP | LPOP key [count] | 在 key 的左侧弹出 count 个 element 并返回。 | |
| RPOP | RPOP key [count] | 在 key 的右侧弹出 count 个 element 并返回。 | |
| LRANGE | LRANGE key start stop | 返回 key 中 start 到 stop 的元素列表。 | |
| LLEN | LLEN key | 返回 key 中包含 element 的个数。 | |
| LINDEX | LINDEX key index | 返回 key 中索引位置为 index 的 element。 | |
| LSET | LSET key index element | 将 key 中索引位置为 index 的元素设置为 element。 | |
| LREM | LREM key count element | 移除 key 中 count 个与 element 相等的元素。 | |
| LTRIM | LTRIM key start stop | 对 key 进行剪裁,只保留 start 到 stop 范围内的元素。 | |
| LINSERT | `LINSERT key <BEFORE | AFTER> pivot element` | 在 key 中 pivot 前/后插入 element。 |
| BLPOP | BRPOP key [key ...] timeout | 阻塞的从 key 的左侧弹出一个 element,若 key 为空,则等待直到超时。 | |
| BRPOP | BRPOP key [key ...] timeout | 阻塞的从 key 的右侧弹出一个 element,若 key 为空,则等待直到超时。 | |
| RPOPLPUSH | RPOPLPUSH source destination | 从 source 的右侧弹出一个 element,添加到 destination 的左侧。 |
3.2 应用
1)栈
添加元素:LPUSH
获取元素:LPOP
2)队列
添加元素:LPUSH
获取元素:RPOP
3)阻塞队列
添加元素:LPUSH
获取元素:BRPOP
4、Set
Set:Redis 中提供的无序的字符串集合。
Set 结构:
Set 底层使用 HashTable 或 IntSet 实现:
- 若集合元素都是整数 && 元素个数 <
set-maxintset-entries(默认:512):IntSet - 其余情况:HashTable
4.1 使用
| 命令 | 语法 | 说明 |
|---|---|---|
| SADD | SADD key member [member ...] | 向 key 中添加一个或多个 member,若存在,则忽略。 |
| SREM | SREM key member [member ...] | 从 key 中删除一个或多个 member,若元素不存在,则忽略。 |
| SISMEMBER | SISMEMBER key member | 判断 key 中是否存在 member,若存在,则返回 1,否则返回 0。 |
| SCARD | SCARD key | 获取 key 中 member 的个数。 |
| SMEMBERS | SMEMBERS key | 返回 key 中所有 member 的列表。 |
| SRANDMEMBER | SRANDMEMBER key [count] | 返回 key 中随机 count 个 member。 |
| SPOP | SPOP key [count] | 从 key 中移除一个或多个 member。 |
| SMOVE | SMOVE source destination member | 将 member 从 source 移动到 destination 中。若 member/source 不存在,则命令失败。 |
| SDIFF | SDIFF key [key ...] | 返回 key 和其余 key 的差集。 |
| SDIFFSTORE | SDIFFSTORE destination key [key ...] | 返回 key 和其余 key 的差集,并将结果保存到 destination 中。 |
| SINTER | SINTER key [key ...] | 返回 key 和其余 key 的交集。 |
| SINTERSTORE | SINTERSTORE destination key [key ...] | 返回 key 和其余 key 的交集,并将结果保存到 destination 中。 |
| SUNION | SUNION key [key ...] | 返回 key 和其余 key 的并集。 |
| SUNIONSTORE | SUNIONSTORE destination key [key ...] | 返回 key 和其余 key 的并集,并将结果保存到 destination 中。 |
| SSCAN | SSCAN key cursor [MATCH pattern] [COUNT count] | 迭代地返回Set中的元素,支持模式匹配和限制返回数量。 |
4.2 应用
1)抽奖
参与抽奖:SADD key userID
查看抽奖所有用户:SMEMBERS key
抽取 count 名中奖者(不删除中奖者):SRANDMEMBER key count
抽取 count 名中奖者(删除中奖者):SPOP key count
2)文章点赞/收藏
点赞:SADD like:文章id 用户id
取消点赞:SREM like:文章id 用户id
检查是否点赞过:SISMEMBER like:文章id 用户id
获取点赞用户列表:SMEMBERS like:文章id
获取点赞用户数:SCARD like:文章id
3)关注模型
关注:ZADD 用户id 关注的人id
共同关注:SINTER 用户id 关注的人id
可能认识的人:SDIFF 用户id 关注的人id
5、ZSet
ZSet:Redis 中提供的支持排序的集合。
ZSet 结构:
ZSet 底层使用 ZipList 或 SkipList 实现:
- 若集合元素 < 128 && 每个元素值 < 64 Byte:ZipList
- 其余情况:SkipList
在 Redis 7.0 后,ZipList 被 ListPack 代替。
5.1 使用
| 命令 | 语法 | 说明 | |
|---|---|---|---|
| ZADD | `ZADD key [NX | XX] [INCR] score member [score member ...]` | 向 key 中添加一个或多个 member 和 score。 |
| ZREM | ZREM key member [member ...] | 从 key 中移除一个或多个 member。 | |
| ZSCORE | ZSCORE key member | 返回 key 中 member 的 score。 | |
| ZCARD | ZCARD key | 返回 key 中 member 的个数。 | |
| ZCOUNT | ZCOUNT key min max | 返回 key 中 score 在 min 和 max 之间的 member 的个数。 | |
| ZRANGE | ZRANGE key start stop | 返回 key 中 score 从低到高的排名在 start 到 stop 之间的 member。 | |
| ZREVRANGE | ZREVRANGE key start stop | 返回 key 中 score 从高到低的排名在 start 到 stop 之间的 member。 | |
| ZRANK | ZRANK key member | 返回 key 中 member 从小到大的排名。 | |
| ZINCRBY | ZINCRBY key increment member | 为 key 中 member 的 score 增加 increment,并返回新 score。 | |
| ZREMRANGEBYRANK | ZREMRANGEBYRANK key start stop | 删除 key 中从小到大排名在 start 到 stop 的 member。 | |
| ZREMRANGEBYSCORE | ZRANGEBYSCORE key min max | 删除 key 中分数在 min 到 max 之间的 member。 | |
| ZSCAN | ZSCAN key cursor [MATCH pattern] [COUNT count] | 迭代有序集合中的元素,支持模式匹配和限制返回数量。 |
5.2 应用
1)排行榜
点击文章:ZINCRBY key 1 文章标题
展示当日排行前十:ZREVRANGE key 0 9 WITHSCORES
七日搜索榜单计算:ZUNIONSTORE new-key 7 key-0,...,key-6
展示七日排行前十:ZREVRANGE new-key 0 9 WITHSCORES
6、Stream
Stream:Redis 中提供用于消息传递的数据结构。
6.1 使用
| 命令 | 语法 | 说明 |
|---|---|---|
| XADD | XADD key id field value | 向流中添加新消息,如果流不存在则自动创建。- id 为 * 表示自动生成。 |
| XRANGE | XRANGE key start end [COUNT count] | 根据消息 id 范围读取流中的消息,可以指定返回消息数量。 |
| XREAD | XREAD [COUNT count] [BLOCK milliseconds] STREAMS key [key ...] id | 从流中读取消息,支持阻塞读取以等待新消息的到来。 |
| XGROUP CREATE | XGROUP CREATE key groupname id-or-$ [MKSTREAM] | 创建消费者组,以便多个消费者可以共享消息流的消费。 |
| XGROUP DESTORY | XGROUP DESTROY key group | 销毁消费者组。 |
| XREADGROUP | XREADGROUP GROUP groupname consumer [COUNT count] [BLOCK milliseconds] STREAMS key id [id ...] | 从消费者组中读取消息,支持阻塞读取。 |
| XACK | XACK key group id [id ...] | 确认消息已被消费。 |
| XPENDING | XPENDING key group start end count [consumer]] | 获取待处理的消息列表,包括消息的闲置时间和重试次数。 |
| XTRIM | XTRIM key MAXLEN [~] count | 对流进行修剪,限制长度,超出长度的消息将被删除。 |
| XINFO | XINFO [CONSUMERS] [GROUPS] [STREAM key] | 获取流、消费者组或消费者的详细信息。 |
| XDEL | XDEL key id [id ...] | 从流中删除特定 id 的消息。 |
| XLEN | XLEN key | 获取流中消息的数量。 |
6.2 应用
1)消息队列
生产者:XADD order-stream * order_id 12345 status shipped customer_id 6789
消费者:XREADGROUP GROUP order-handlers CONSUMER_NAME BLOCK 5000 STREAMS order-stream 0
确认消息:XACK order-stream order-handlers <message_id>
2)日志收集
日志生成:XADD log_stream * service "user_service" log_level "error" message "xxx"
日志处理:XREADGROUP GROUP log_processor CONSUMER COUNT 10 BLOCK 100 STREAMS log_stream 0
日志修剪:XTRIM log_stream MAXLEN ~ 1000
7、BitMap
BitMap:是一串连续的二进制(0 或 1)组成的数组。
BitMap 结构:
BitMap 底层使用 String 实现,会将二进制位保存到字节数组中。
7.1 使用
| 命令 | 语法 | 说明 |
|---|---|---|
| SETBIT | SETBIT key offset value | 设置 key 中偏移量为 offset 上的位为 value。 key 不存在:生成一个新的字符串值。 offset 超出范围:将中间位置补零后设置值。 |
| GETBIT | GETBIT [key] [offset] | 返回给定 HyperLogLog 集合的近似基数。 |
| BITCOUNT | BITCOUNT key [start end] | 计算 key 中偏移量从 start 到 end 中为 1 的数量。 |
| BITOP | BITOP [oper] [destkey] [key ...] | 对一个或多个 key 进行 oper 操作,并将结果保存到 destkey 中,oper 的取值:AND:并、OR:或、XOR:异或、NOT:取反 |
| BITPOS | BITPOS [key] [bit] [start end] | 返回位图中第一个值为bit的二进制位的位置。- 若没有找到,则返回 -1。 |
7.2 应用
1)用户在线状态跟踪
使用 BitMap 的一位表示一个用户是否在线(1:在线,0:离线)。
设置用户 1010 在线:SETBIT online_users 1010 1
设置用户 1010 离线:SETBIT online_users 1010 0
查询用户 1010 是否在线:GETBIT online_users 1010
获取在线用户总数:BITCOUNT online_users
8、HyperLogLog
HyperLogLog:Redis 中提供用于基数统计的数据结构。
8.1 使用
| 命令 | 语法 | 说明 |
|---|---|---|
| PFADD | PFADD [key] [element ...] | 向 HyperLogLog 集合添加元素。 |
| PFCOUNT | PFCOUNT [key ...] | 返回给定 HyperLogLog 集合的近似基数。 |
| PFMERGE | PFMERGE [destkey] [sourcekey ...] | 将多个 HyperLogLog 集合合并到 destkey 中,基数接近于所有输入集合的并集基数。 |
8.2 应用
1)统计独立 IP 数
添加独立 IP 地址:PFADD server:ip "123.123.0.1"
统计独立 IP 个数:PFCOUNT server:ip
2)页面 UV 计数
有访客访问商品 1010 时:PFADD visit:product:1010 user:5
统计商品 1010 的访问量:PFCOUNT visit:product:1010
3)统计每天搜索词条
添加搜索词:PFADD search_keywords:20240701 "汽车" "服饰"
统计不同词条个数:PFCOUNT search_keywords:20240701
合并多个日期数据:PFMERGE search_ketwords_week search_keywords:20240701 ...
9、Geo
Geo:Redis 中提供用于存储和查询地理空间的数据结构。
9.1 使用
GEOADD
- 语法:
GEOADD [key] [NX|XX] [longitude] [latitude] [member] - 说明:向 key 中添加数据。
GEOPOS
- 语法:
GEOPOS [key] [member [member ...]] - 说明:返回 key 中一个或多个 member 的坐标(经度和纬度)。
GEODIST
- 语法:
GEODIST [key] [member1] [member2] [M|KM|FT|MI] - 说明:返回 key 中 member1 和 member 之间的距离。
GEORADIUS
- 语法:
GEORADIUS [key] [longitude] [latitude] [radius] [M|KM|FT|MI] [WITHCOORD] [WITHDIST] [WITHHASH] [COUNT count] [ASC | DESC] [STORE key | STOREDIST key] - 说明:根据给定的经纬度中心点和半径,返回范围内的 member。
GEOHASH
- 说明:
GEOHASH key [member [member ...]] - 说明:返回 key 中一个或多个 member 的 GeoHash 表示。
9.2 应用
1)附近地点搜索
添加知名景点地址:GEOADD places 116.388339.9289"故宫"116.287039.6572"天坛"
用户搜索 5km 内景点:GEORADIUS places 116.437539.92895 km WITHCOORD WITHDIST
2)附近的人
添加用户位置:GEOADD users -73.935242 40.730610 user1 -73.944348 40.719278 user2
搜索附近的人:GEORADIUS users -73.935242 40.730610 1 km WITHDIST