Redis 数据类型

107 阅读11分钟

1、String

String:Redis 中最常用的数据类型,可以存储字符串或数字。

String 结构: String 底层使用 SDS 实现。

1.1 使用

命令语法说明
SETSET [key] [value]设置 key 的值为 value
GETGET [key]获取 key 的值
DELDEL [key]删除 key
SETEXSETEX [key] [seconds] [value]设置 key 的值为 value,且过期时间为 seconds 秒
EXPIREEXPIRE [key] [seconds]设置 key 的过期时间为 seconds 秒- key 不存在,expire 命令执行失败
TTLTTL [key]以 s 为单位,返回 key 的剩余存活时间。
若 key 无过期时间,返回 -1。
若 key 不存在,返回 -2
PTTLPTTL [key]以 ms 为单位,返回 key 的剩余存活时间。
key 无过期时间,返回 -1。
key 不存在,返回 -2
INCRINCR [key]将 key 的 value 递增 1- key 不存在,会将 key 设置为 0,再递增 1
DECRDECR [key]将 key 的 value 递减 1- key 不存在,会将 key 设置为 -1,再递减 1
INCRBYINCRBY [key] [increment]将 key 的 value 递增 increment- increment 可以是任意整数
DECRBYDECRBY [key] [decrement]将 key 的 value 递减 decrement- decrement 可以是任意整数
MSETMSET [key1] [value1] ...设置一个或多个 key-value- key 已存在,则会覆盖旧值
MGETMGET [key1] ...获取所有指定的 key 的值
APPENDAPPEND [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 使用

命令语法说明
HSETHSET key field value [field value ...]设置 key 中 field 为 value。
HSETNXHSETNX key field value当 key 中 field 不存在时,才会设置 field 的 value。
HGETHGET key field获取 key 中 field 的 value。
HINCRBYHINCRBY key field increment为 key 中的 field 的 value 增加 increment。若 field 不存在,则会创建并初始化为 0,再加 increment。
HINCRBYFLOATHINCRBYFLOAT key field increment与 HINCRBY 一致,但 increment 可以为浮点数。
HDELHDEL key field [field ...]删除 key 中一个或多个 field。
HEXISTSHEXISTS key field检查 key 中 field 是否存在。
HLENHLEN key返回 key 中 field 的个数。
HKEYSHKEYS key返回 key 中所有的 field。
HVALSHVALS key返回 key 中所有的 value。
HGETALLHGETALL key返回 key 中所有的 field 和 value。
HSCANHSCAN 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 使用

命令语法说明
LPUSHLPUSH key element [element ...]将一个或多个 element 添加到 key 的左侧。
RPUSHRPUSH key element [element ...]将一个或多个 element 添加到 key 的右侧。
LPOPLPOP key [count]在 key 的左侧弹出 count 个 element 并返回。
RPOPRPOP key [count]在 key 的右侧弹出 count 个 element 并返回。
LRANGELRANGE key start stop返回 key 中 start 到 stop 的元素列表。
LLENLLEN key返回 key 中包含 element 的个数。
LINDEXLINDEX key index返回 key 中索引位置为 index 的 element。
LSETLSET key index element将 key 中索引位置为 index 的元素设置为 element。
LREMLREM key count element移除 key 中 count 个与 element 相等的元素。
LTRIMLTRIM key start stop对 key 进行剪裁,只保留 start 到 stop 范围内的元素。
LINSERT`LINSERT key <BEFOREAFTER> pivot element`在 key 中 pivot 前/后插入 element。
BLPOPBRPOP key [key ...] timeout阻塞的从 key 的左侧弹出一个 element,若 key 为空,则等待直到超时。
BRPOPBRPOP key [key ...] timeout阻塞的从 key 的右侧弹出一个 element,若 key 为空,则等待直到超时。
RPOPLPUSHRPOPLPUSH 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 使用

命令语法说明
SADDSADD key member [member ...]向 key 中添加一个或多个 member,若存在,则忽略。
SREMSREM key member [member ...]从 key 中删除一个或多个 member,若元素不存在,则忽略。
SISMEMBERSISMEMBER key member判断 key 中是否存在 member,若存在,则返回 1,否则返回 0。
SCARDSCARD key获取 key 中 member 的个数。
SMEMBERSSMEMBERS key返回 key 中所有 member 的列表。
SRANDMEMBERSRANDMEMBER key [count]返回 key 中随机 count 个 member。
SPOPSPOP key [count]从 key 中移除一个或多个 member。
SMOVESMOVE source destination member将 member 从 source 移动到 destination 中。若 member/source 不存在,则命令失败。
SDIFFSDIFF key [key ...]返回 key 和其余 key 的差集。
SDIFFSTORESDIFFSTORE destination key [key ...]返回 key 和其余 key 的差集,并将结果保存到 destination 中。
SINTERSINTER key [key ...]返回 key 和其余 key 的交集。
SINTERSTORESINTERSTORE destination key [key ...]返回 key 和其余 key 的交集,并将结果保存到 destination 中。
SUNIONSUNION key [key ...]返回 key 和其余 key 的并集。
SUNIONSTORESUNIONSTORE destination key [key ...]返回 key 和其余 key 的并集,并将结果保存到 destination 中。
SSCANSSCAN 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 [NXXX] [INCR] score member [score member ...]`向 key 中添加一个或多个 member 和 score。
ZREMZREM key member [member ...]从 key 中移除一个或多个 member。
ZSCOREZSCORE key member返回 key 中 member 的 score。
ZCARDZCARD key返回 key 中 member 的个数。
ZCOUNTZCOUNT key min max返回 key 中 score 在 min 和 max 之间的 member 的个数。
ZRANGEZRANGE key start stop返回 key 中 score 从低到高的排名在 start 到 stop 之间的 member。
ZREVRANGEZREVRANGE key start stop返回 key 中 score 从高到低的排名在 start 到 stop 之间的 member。
ZRANKZRANK key member返回 key 中 member 从小到大的排名。
ZINCRBYZINCRBY key increment member为 key 中 member 的 score 增加 increment,并返回新 score。
ZREMRANGEBYRANKZREMRANGEBYRANK key start stop删除 key 中从小到大排名在 start 到 stop 的 member。
ZREMRANGEBYSCOREZRANGEBYSCORE key min max删除 key 中分数在 min 到 max 之间的 member。
ZSCANZSCAN 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 使用

命令语法说明
XADDXADD key id field value向流中添加新消息,如果流不存在则自动创建。- id 为 * 表示自动生成。
XRANGEXRANGE key start end [COUNT count]根据消息 id 范围读取流中的消息,可以指定返回消息数量。
XREADXREAD [COUNT count] [BLOCK milliseconds] STREAMS key [key ...] id从流中读取消息,支持阻塞读取以等待新消息的到来。
XGROUP CREATEXGROUP CREATE key groupname id-or-$ [MKSTREAM]创建消费者组,以便多个消费者可以共享消息流的消费。
XGROUP DESTORYXGROUP DESTROY key group销毁消费者组。
XREADGROUPXREADGROUP GROUP groupname consumer [COUNT count] [BLOCK milliseconds] STREAMS key id [id ...]从消费者组中读取消息,支持阻塞读取。
XACKXACK key group id [id ...]确认消息已被消费。
XPENDINGXPENDING key group start end count [consumer]]获取待处理的消息列表,包括消息的闲置时间和重试次数。
XTRIMXTRIM key MAXLEN [~] count对流进行修剪,限制长度,超出长度的消息将被删除。
XINFOXINFO [CONSUMERS] [GROUPS] [STREAM key]获取流、消费者组或消费者的详细信息。
XDELXDEL key id [id ...]从流中删除特定 id 的消息。
XLENXLEN 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 使用

命令语法说明
SETBITSETBIT key offset value设置 key 中偏移量为 offset 上的位为 value。
key 不存在:生成一个新的字符串值。
offset 超出范围:将中间位置补零后设置值。
GETBITGETBIT [key] [offset]返回给定 HyperLogLog 集合的近似基数。
BITCOUNTBITCOUNT key [start end]计算 key 中偏移量从 start 到 end 中为 1 的数量。
BITOPBITOP [oper] [destkey] [key ...]对一个或多个 key 进行 oper 操作,并将结果保存到 destkey 中,oper 的取值:AND:并、OR:或、XOR:异或、NOT:取反
BITPOSBITPOS [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 使用

命令语法说明
PFADDPFADD [key] [element ...]向 HyperLogLog 集合添加元素。
PFCOUNTPFCOUNT [key ...]返回给定 HyperLogLog 集合的近似基数。
PFMERGEPFMERGE [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