Redis数据类型和应用场景
一、Redis常用的5种数据类型
- 字符串(String):最基本的数据类型,可以存储字符串、整数或浮点数。
- 哈希(Hash):键值对的集合,可以在一个哈希数据结构中存储多个字段和值。
- 列表(List):按照插入顺序存储一组有序的值,可以在列表的两端执行插入、删除和访问操作。
- 集合(Set):无序的唯一值的集合,支持对集合执行添加、删除和集合间的交集、并集、差集等操作。
- 有序集合(Sorted Set):也叫Zset,类似于集合,但每个成员都关联着一个分数(score),可以根据分数对成员进行排序,同时保持唯一性。
除了以上5种数据类型,还提供了Bitmap和HyperLogLog。
- 位图(Bitmap):使用字符串来表示位数组,可以对位进行逻辑操作,例如AND、OR、XOR等。
- HyperLogLog:用于进行基数估算的数据结构,可以快速估计集合中不重复元素的数量。
二、String类型
常用操作
- SET key value:设置指定 key 的值为给定的 value。
- GET key:获取指定 key 的值。
- DEL key:删除指定的 key。
- MSET key value [key value ...]:批量设置key value。
- MGET key [key ...]:批量获得key value。
- SETEX key seconds value:设置指定 key 的值,并指定过期时间(以秒为单位)。
- SETNX key value:设置 key 不存在的key value,如果key存在,那么当前value不会覆盖已存在key的value。
- STRLEN key:返回指定 key 的值的长度。
原子加减操作:
- INCR key:将指定 key 的值加 1。
- DECR key:将指定 key 的值减 1。
- INCRBY key increment:将指定key的value与increment相加,只针对数字类型。
- DECEBY key decrement:将指定key的value减去decrement,只针对数字类型。
- APPEND key value:将指定 value 追加到指定 key 的值末尾。
- GETSET key value:设置指定 key 的新值,并返回旧值。
单值缓存操作:
- SET key value
- GET key
对象缓存操作:
- SET user:1 value(value是一个JSON字符串)
- MSET user:1:name zhangsan user:1:age 18
分布式锁操作:
- SETNX lock_key 1 (lock_key:要锁的键, 1: 可以是任意非空的值,用于表示锁的存在。结果返回0表示false,1表示true)
- DEL lock_key //执行完业务逻辑释放锁
- SETEX lock_key expiration_time 1(设置有时效的锁)
Sting类型适用场景
- 例如统计一篇文章的阅读量,在业务场景上来说用户打开一篇文章则+1,那么可以使用redis的计数器。使用incr article:readcount:1000,每执行一次表示文章ID为1000的累加一次。article:readcount是我们自定义的前缀,为了更好的见名识义
- Web集群session共享,spring session + redis实现session共享
- 分布式全局序列号,使用redis批量生成序列号提升性能,INCRBY orderId 1
三、Hash类型
常用操作
- HSET key field value:设置 Hash 中指定键的字段和值。
- HGET key field:获取 Hash 中指定键的字段的值。
- HDEL key field1 [field2 ...]:删除 Hash 中指定键的一个或多个字段。
- HEXISTS key field:检查 Hash 中指定键是否存在指定字段。
- HKEYS key:获取 Hash 中指定键的所有字段名。
- HVALS key:获取 Hash 中指定键的所有字段值。
- HGETALL key:获取 Hash 中指定键的所有字段和值。
- HINCRBY key field increment:将 Hash 中指定键的字段值按给定增量递增。
- HLEN key:获取 Hash 中指定键的字段数量。
对象缓存操作
- HMSET key field1 value1 [field2 value2 ...]:同时设置 Hash 中指定键的多个字段和值。
- 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类型
常用操作
- LPUSH key element1 [element2 ...]:将一个或多个元素从左侧插入到列表中。
- RPUSH key element1 [element2 ...]:将一个或多个元素从右侧插入到列表中。
- LPOP key:从左侧移除并返回列表中的第一个元素。
- RPOP key:从右侧移除并返回列表中的最后一个元素。
- BRPOP key [key ...] timeout:从右侧移除一个元素,如果没有则等待,timeout是等待时长(秒),0则一直等待
- LINDEX key index:获取列表中指定索引位置的元素值。
- LRANGE key start stop:获取列表中指定范围内的元素列表。
- LLEN key:获取列表的长度(即列表中元素的数量)。
- LREM key count element:从列表中移除指定数量的匹配元素。
- LINSERT key BEFORE|AFTER pivot element:在列表中指定元素的前面或后面插入一个元素。
- 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类型
常用操作
- SADD key member1 [member2 ...]:将一个或多个成员添加到集合中,成员存在则忽略,不存在则新建。
- SREM key member1 [member2 ...]:从集合中移除一个或多个成员。
- SISMEMBER key member:检查指定成员是否存在于集合中。
- SMEMBERS key:获取集合中的所有成员。
- SCARD key:获取集合中的成员数量。
- SPOP key [count]:从集合中随机移除并返回一个或多个成员。
- SRANDMEMBER key [count]:从集合中随机获取一个或多个成员,但不移除。
- SDIFF key1 [key2 ...]:获取多个集合的差集。(计算公式为:list1-(list2、list2、...的并集),第一个集合减去其他几个集合的并集。排除相同的元素,第一个集合剩下的就是并集)
- SINTER key1 [key2 ...]:获取多个集合的交集。
- 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)
- ZADD key score1 member1 [score2 member2 ...]:将一个或多个成员及其分数添加到有序集合中。各参数的具体含义:key为键,score为member的分数,用于排序,member是key的值,可以批量添加。
- ZREM key member1 [member2 ...]:从有序集合中移除一个或多个成员。
- ZSCORE key member:获取有序集合中指定成员的分数。
- ZRANGE key start stop [WITHSCORES]:按照分数从小到大的顺序,获取有序集合中指定索引范围内的成员。
- ZREVRANGE key start stop [WITHSCORES]:按照分数从大到小的顺序,获取有序集合中指定索引范围内的成员。
- ZCARD key:获取有序集合中的成员数量。
- ZCOUNT key min max:计算有序集合中分数在给定范围内的成员数量。
- ZRANK key member:获取有序集合中指定成员的排名,排名从0开始。(按照分数从小到大的顺序)。
- ZREVRANK key member:获取有序集合中指定成员的排名(按照分数从大到小的顺序)。
- ZINCRBY key increment member:将有序集合中指定成员的分数增加给定的增量值。
应用场景
体育赛事排行榜、新闻热度排行榜。我们任意打开一个新闻网站,总有块区域显示排行前10的新闻,排行版一般都是根据点击数来排行的,这个点击数就可以使用ZINCRBY key increment member指令来实现。例如:zincrby hotNews:currentDate 1 newsTopic,每点击一次 newsTopic+1(新闻主题的分值+1)。
更多的Redis操作指令,请查看官方文档Commands
        我曾七次鄙视自己的灵魂:
  第一次,当它本可进取时,却故作谦卑;
  第二次,当它在空虚时,用爱欲来填充;
  第三次,在困难和容易之间,它选择了容易;
  第四次,它犯了错,却借由别人也会犯错来宽慰自己;
  第五次,它自由软弱,却把它认为是生命的坚韧;
  第六次,当它鄙夷一张丑恶的嘴脸时,却不知那正是自己面具中的一副;
  第七次,它侧身于生活的污泥中,虽不甘心,却又畏首畏尾。
时间仓促,如有错误欢迎指出,欢迎在评论区讨论,如对您有帮助还请点个推荐、关注支持一下
作者:博客园 - 角刀牛
出处:https://www.cnblogs.com/jiaodaoniujava/
该文章来源互联网,本博仅以学习为目的,版权归原作者所有。
若内容有侵犯您权益的地方,请公告栏处联系本人,本人定积极配合处理解决。