-->

Redis数据类型和应用场景

一、Redis常用的5种数据类型

  1. 字符串(String):最基本的数据类型,可以存储字符串、整数或浮点数。
  2. 哈希(Hash):键值对的集合,可以在一个哈希数据结构中存储多个字段和值。
  3. 列表(List):按照插入顺序存储一组有序的值,可以在列表的两端执行插入、删除和访问操作。
  4. 集合(Set):无序的唯一值的集合,支持对集合执行添加、删除和集合间的交集、并集、差集等操作。
  5. 有序集合(Sorted Set):也叫Zset,类似于集合,但每个成员都关联着一个分数(score),可以根据分数对成员进行排序,同时保持唯一性。

除了以上5种数据类型,还提供了Bitmap和HyperLogLog。

  1. 位图(Bitmap):使用字符串来表示位数组,可以对位进行逻辑操作,例如AND、OR、XOR等。
  2. HyperLogLog:用于进行基数估算的数据结构,可以快速估计集合中不重复元素的数量。

二、String类型

常用操作

  1. SET key value:设置指定 key 的值为给定的 value。
  2. GET key:获取指定 key 的值。
  3. DEL key:删除指定的 key。
  4. MSET key value [key value ...]:批量设置key value。
  5. MGET key [key ...]:批量获得key value。
  6. SETEX key seconds value:设置指定 key 的值,并指定过期时间(以秒为单位)。
  7. SETNX key value:设置 key 不存在的key value,如果key存在,那么当前value不会覆盖已存在key的value。
  8. STRLEN key:返回指定 key 的值的长度。

原子加减操作:

  1. INCR key:将指定 key 的值加 1。
  2. DECR key:将指定 key 的值减 1。
  3. INCRBY key increment:将指定key的value与increment相加,只针对数字类型。
  4. DECEBY key decrement:将指定key的value减去decrement,只针对数字类型。
  5. APPEND key value:将指定 value 追加到指定 key 的值末尾。
  6. GETSET key value:设置指定 key 的新值,并返回旧值。

单值缓存操作:

  1. SET key value
  2. GET key

对象缓存操作:

  1. SET user:1 value(value是一个JSON字符串)
  2. MSET user:1:name zhangsan user:1:age 18

分布式锁操作:

  1. SETNX lock_key 1 (lock_key:要锁的键, 1: 可以是任意非空的值,用于表示锁的存在。结果返回0表示false,1表示true)
  2. DEL lock_key //执行完业务逻辑释放锁
  3. SETEX lock_key expiration_time 1(设置有时效的锁)

Sting类型适用场景

  1. 例如统计一篇文章的阅读量,在业务场景上来说用户打开一篇文章则+1,那么可以使用redis的计数器。使用incr article:readcount:1000,每执行一次表示文章ID为1000的累加一次。article:readcount是我们自定义的前缀,为了更好的见名识义
  2. Web集群session共享,spring session + redis实现session共享
  3. 分布式全局序列号,使用redis批量生成序列号提升性能,INCRBY orderId 1

三、Hash类型

常用操作

  1. HSET key field value:设置 Hash 中指定键的字段和值。
  2. HGET key field:获取 Hash 中指定键的字段的值。
  3. HDEL key field1 [field2 ...]:删除 Hash 中指定键的一个或多个字段。
  4. HEXISTS key field:检查 Hash 中指定键是否存在指定字段。
  5. HKEYS key:获取 Hash 中指定键的所有字段名。
  6. HVALS key:获取 Hash 中指定键的所有字段值。
  7. HGETALL key:获取 Hash 中指定键的所有字段和值。
  8. HINCRBY key field increment:将 Hash 中指定键的字段值按给定增量递增。
  9. HLEN key:获取 Hash 中指定键的字段数量。

对象缓存操作

  1. HMSET key field1 value1 [field2 value2 ...]:同时设置 Hash 中指定键的多个字段和值。
  2. HMGET key field1:获取 Hash 中指定键的字段值。

Hash应用场景

电商系统购物车数据存储,存储的结构为:

用户ID为key ,例如:cart:userId
商品ID为field,例如:10000
商品数量为value,例如:1

下面举例说明:

商品加入购物车使用:HMSET key field1 value1 [field2 value2 ...]

购物车商品数量+1使用HINCRBY key field increment

由上图可知购物车的商品总数是3条,使用HLEN key 获得

如果要删除一个商品,使用HDEL key

获得购物车所有商品

不要使用大key存储,如果大key存储需要分段存储。

优点:同类数据归类存储方便管理。从底层结果来说,比string操作消耗内存更小,也比string存储更节省空间。

缺点:有效时间只能设置在key上,不能设置在field字段上。Redis集群架构下不适合大规模使用。

四、List类型

常用操作

  1. LPUSH key element1 [element2 ...]:将一个或多个元素从左侧插入到列表中。
  2. RPUSH key element1 [element2 ...]:将一个或多个元素从右侧插入到列表中。
  3. LPOP key:从左侧移除并返回列表中的第一个元素。
  4. RPOP key:从右侧移除并返回列表中的最后一个元素。
  5. BRPOP key [key ...] timeout:从右侧移除一个元素,如果没有则等待,timeout是等待时长(秒),0则一直等待
  6. LINDEX key index:获取列表中指定索引位置的元素值。
  7. LRANGE key start stop:获取列表中指定范围内的元素列表。
  8. LLEN key:获取列表的长度(即列表中元素的数量)。
  9. LREM key count element:从列表中移除指定数量的匹配元素。
  10. LINSERT key BEFORE|AFTER pivot element:在列表中指定元素的前面或后面插入一个元素。
  11. LSET key index element:将列表中指定索引位置的元素替换为新的值。

应用场景:

1、实现常用的数据结构

使用LPUSH结合LPOP实现先进后出的stack栈结构

使用LPUSH结合RPOP实现后进先出的Queue队列结构

使用LPUSH结合BRPOPS实现阻塞队列BlockingMQ

2、微博、微信朋友圈、公众号等消息流

我们在发微博或者朋友圈时永远看到的都是最新时间发布的消息,也就是说是按照时间先后顺序展现的,最先发布的在最后面,最后发布的在最前面,那么这种就可以用List的LPUSH+RPOP队列结构来实现。比起数据库要简单很多了。

再比如我们关注了多个订阅号,当点开订阅号消息时,每个订阅号都会显示最近发表的前1~4条文章,在基于LPUSH+RPOP结构上,那么我们可以使用LRANGE key start stop 获得最近几条文章进行回显。

五、Set类型

常用操作

  1. SADD key member1 [member2 ...]:将一个或多个成员添加到集合中,成员存在则忽略,不存在则新建。
  2. SREM key member1 [member2 ...]:从集合中移除一个或多个成员。
  3. SISMEMBER key member:检查指定成员是否存在于集合中。
  4. SMEMBERS key:获取集合中的所有成员。
  5. SCARD key:获取集合中的成员数量。
  6. SPOP key [count]:从集合中随机移除并返回一个或多个成员。
  7. SRANDMEMBER key [count]:从集合中随机获取一个或多个成员,但不移除。
  8. SDIFF key1 [key2 ...]:获取多个集合的差集。(计算公式为:list1-(list2、list2、...的并集),第一个集合减去其他几个集合的并集。排除相同的元素,第一个集合剩下的就是并集)
  9. SINTER key1 [key2 ...]:获取多个集合的交集。
  10. SUNION key1 [key2 ...]:获取多个集合的并集。

应用场景:

1、抽奖活动

一次抽奖多个用户,例如参与抽奖的用户有10个,一次抽取2个用户作为中奖用户,使用SMEMBERS key查看所有抽奖成员,使用SRANDMEMBER key [count]抽取2个成员。

多次抽奖,被开奖的用户不可再次参与。使用SPOP key [count]抽取成员作为开奖用户,同时会移除已开奖的用户。

2、微信点赞、评论

存储的结构为:

消息ID为key ,例如:like:msgID
用户ID为field,例如:10000

朋友圈消息点赞时使用SADD key member添加一条记录,例如sadd like:1 1000。取消点赞srem like:1 1000。消息点赞后的图标高亮,使用SISMEMBER key member查询成员是否存在,存在则高亮。使用SCARD key获得点赞成员数量。

朋友圈消息点赞成员列表,在微信朋友圈当我点赞朋友的一条消息时,会在下方显示点赞成员列表,这个列表只显示与我是好友点赞成员,不是好友则不显示。那么此时可以使用交集查询。

3、电商系统购买电脑时配置选择

六、Sorted Set(Zset)

  1. ZADD key score1 member1 [score2 member2 ...]:将一个或多个成员及其分数添加到有序集合中。各参数的具体含义:key为键,score为member的分数,用于排序,member是key的值,可以批量添加。
  2. ZREM key member1 [member2 ...]:从有序集合中移除一个或多个成员。
  3. ZSCORE key member:获取有序集合中指定成员的分数。
  4. ZRANGE key start stop [WITHSCORES]:按照分数从小到大的顺序,获取有序集合中指定索引范围内的成员。
  5. ZREVRANGE key start stop [WITHSCORES]:按照分数从大到小的顺序,获取有序集合中指定索引范围内的成员。
  6. ZCARD key:获取有序集合中的成员数量。
  7. ZCOUNT key min max:计算有序集合中分数在给定范围内的成员数量。
  8. ZRANK key member:获取有序集合中指定成员的排名,排名从0开始。(按照分数从小到大的顺序)。
  9. ZREVRANK key member:获取有序集合中指定成员的排名(按照分数从大到小的顺序)。
  10. ZINCRBY key increment member:将有序集合中指定成员的分数增加给定的增量值。

应用场景

体育赛事排行榜、新闻热度排行榜。我们任意打开一个新闻网站,总有块区域显示排行前10的新闻,排行版一般都是根据点击数来排行的,这个点击数就可以使用ZINCRBY key increment member指令来实现。例如:zincrby hotNews:currentDate 1 newsTopic,每点击一次 newsTopic+1(新闻主题的分值+1)。

更多的Redis操作指令,请查看官方文档Commands

posted @ 2023-10-08 09:11  角刀牛Java  阅读(1598)  评论(0编辑  收藏  举报