Redis应用场景
String 字符串
字符串类型是redis最基础的数据结构,首先键是字符串类型,而且其他几种结构都是在字符串类型基础上构建的,所以字符串类型能为其他四种数据结构的学习尊定基础。字符串类型实际上可以是字符串(简单的字符串、复杂的字符串(xml、json)、数字(整数、浮点数)、二进制(图片、音频、视频)),但最大不能超过512M。
浏览量(计数器)
比如一篇文章我们想记录它的阅读量,无疑查看的人比较多,我们可以通过redis的原子加来实现。每次有人点击文章,阅读量就增1。设计key可以设置成 {文章}:{阅读量}:{文章id}
incr 原子加
分布式锁
https://www.cnblogs.com/wlwl/p/11651409.html
订单超卖
比如总共10件商品,现在抢购的有100个人,不允许卖出超出库存总件数,我们就可以通过redis的原子减来实现。
decr 原子减, if( jedisUtil.decr(key) > 0){// 下单}
Hash 哈希
哈希结构相对于字符串序列化缓存信息更加直观,并且在更新操作上更加便捷。所以常常用于用户信息等管理,但是哈希类型和关系型数据库有所不同,哈希类型是稀疏的,而关系型数据库是完全结构化的,关系型数据库可以做复杂的关系查询,而redis去模拟关系型复杂查询,开发困难,维护成本高。
购物车
给某个用户购物车添加商品,可以增加、减少数量,以及查看用户购物车所有商品和数量。key可以设计成 {购物车}:{用户车} {商品id}
hset 添加key(加入商品)
hincrby 增加或减少指定数量
hlen 查看key的所有子key个数
hgetall 查看key下所有子key和value(查看所有商品和数量)
hdel 删除key(移除购物车)
List 列表
列表类型是用来储存多个有序的字符串,列表中的每个字符串成为元素(element),一个列表最多可以储存2的32次方-1个元素,在redis中,可以队列表两端插入(pubsh)和弹出(pop),还可以获取指定范围的元素列表、获取指定索引下表的元素等,列表是一种比较灵活的数据结构,它可以充当栈和队列的角色,在实际开发中有很多应用场景。
公众号消息推送
比如现在给id为10的用户推送了几条消息,然后按照顺序读取最新的几条消息。
lpush 从表头插入数据(左边)
rpush 从表尾插入数据(右边)
lrange 返回key指定区间内的数据
消息队列
注:基于list实现的只能被1个订阅者消费到
redis也可以实现消息队列的。比如我们lpush往队列里面放入n个数据,然后可以通过lpop/rpop来顺序取出消息。可是这样的话,就需要while(true){}来做,这样就比较浪费性能。可是我们每阻塞一段时间监听一次又失去了实时性。于是redis提供了 blpop/brpop来监听数据。
lpush 从表头插入数据(左边)
rpush 从表尾插入数据(右边)
lpop 移除并返回表头数据
rpop 移除并返回表尾数据
blpop 移除并返回表头数据,若列表没有元素则阻塞指定秒,为0则一直阻塞,直到取出元素为止
brpop 移除并返回表尾数据,若列表没有元素则阻塞指定秒,为0则一直阻塞,直到取出元素为止
消息队列2
注:pub/sub模型下订阅的客户端都能消费到
Set 集合
集合类型也是用来保存多个字符串的元素,但和列表不同的是集合中不允许有重复的元素,并且集合中的元素是无序的,不能通过索引下标获取元素,redis除了支持集合内的增删改查,同时还支持多个集合取交集、并集、差集,并合理的使用好集合类型,能在实际开发中解决很多实际问题。
抽奖活动
n个人参与抽奖活动,然后抽出几个幸运儿。
sadd 将元素加入到集合key当中,已经存在于集合的元素将被忽略。
smembers 返回集合key中的所有成员。
sismember 判断元素是否集合 key 的成员。
srandmember 从集合取出n个数,元素不会从集合中删除
spop 从集合取出n个数,元素从集合中删除
点赞收藏
一篇文章的点赞收藏如何实现
sadd 将元素加入到集合key当中,已经存在于集合的元素将被忽略。
srem 将元素从集合key中移除,不存在于集合的元素将被忽略。
smembers 返回集合key中的所有成员。
scard 返回集合中元素个数
微博等关注模型
根据我关注的人,找到我身边共同关注的人,以及我可能认识的人
sadd 将元素加入到集合key当中,已经存在于集合的元素将被忽略。
sdiff 返回一个集合的全部成员,该集合是所有给定集合之间的差集
sismember 判断元素是否集合 key 的成员。
sinter 返回一个集合的全部成员,该集合是所有给定集合的交集。
sorted set 有序集合
排行版
比如现在输入5个人的评分,然后查看前3名。再更新某人评分后,再次刷新排行版。
ZADD 将一个或多个 member 元素及其 score 值加入到有序集 key 当中。如果元素存在,则更新值。
zrevrange 返回有序集 key 中,指定区间内的成员
ZRANGE 递增排序
ZREVRANGE 递减排序