Redis作为Key - Value形态的内存数据库,一提到它,大家首先想到的就是数据缓存。这可是个超实用的点,然而在应用中也不是说毫无注意事项的。
String类型的应用特点
org.springframework.session
spring-session-data-redis
Redis是分布式的独立服务,可以多应用共享。String类型在存储对象上很方便,只要序列化后存储就好。从Redis 2.6.12版本开始,string的set命令增加了参数。这一变化影响着数据存储时的一些情况,比如操作返回false就意味着key添加不成功,可能存在资源被占用的情况。我们在实际项目中,要根据不同的需求合理利用这种特性。比如说在缓存一些用户操作记录时,搞清楚key的占用情况很关键。一些网站的计数器功能中,也要依据这种状态变化来确保计数准确。
计数功能发挥Redis优势
set lock_key locked NX EX 1
计数功能是Redis很适合的应用场景。高频率读写操作对于Redis这样的内存数据库来说正是优势所在。像文章阅读量、微博点赞数这些场景,允许有一定延迟的话,可以先写入Redis再定时同步到数据库。Redis的数据结构中像string、hash和sorted set都有incr方法用于原子性自增操作。以网站的访问者计数为例,以访问者的ip和其他信息作为key,每访问一次就增加一次计数,超过设定次数返回false,这就很好地利用了其计数特性。
List数据结构的消息队列
Redis中list的数据结构是双向链表,这使得它能很便捷地应用于消息队列也就是生产者 / 消费者模型。消息的生产者把消息用lpush放入list,消费者通过rpop就能取出消息且能保证消息的有序性。比如在一些新闻类的网站后台,每天有大量文章需要处理,由编辑作为生产者将文章相关消息放入消息队列,审核人员作为消费者从队列中取出内容进行审核,很是高效。
带有优先级的消息队列
set k1 a
setbit k1 6 1
setbit k1 7 0
get k1
/* 6 7 代表的a的二进制位的修改
a 对应的ASCII码是97,转换为二进制数据是01100001
b 对应的ASCII码是98,转换为二进制数据是01100010
因为bit非常节省空间(1 MB=8388608 bit),可以用来做大数据量的统计。
*/
如果需要实现带有优先级的消息队列,sorted set就可以派上用场了。这是考虑到它不同于普通消息队列的特殊情况。在企业内部的审批流程中,不同等级的审批任务就可以按照优先级放入这个消息队列。紧急的审批可以优先被处理,而不是像无优先级队列那样,按先后顺序处理。
pub / sub功能的消息发布订阅
pub / sub功能用于发布者 / 订阅者模型的消息。在电商平台中,当有新商品上架时,商家可以作为发布者发布消息,而对该商品感兴趣的用户可以作为订阅者接收消息。而且由于Redis拥有持久化功能,即使服务器故障也不用担心消息丢失,这给系统的稳定性提供了重要保障。
set结构的特殊应用场景
set结构具有无序性,Spop命令可移除集合中的指定key的元素并返回移除的元素。例如微博中的一些随机推荐功能就可以借助这个来实现。像微博可能会从用户关注的集合里随机抽取部分用户来进行新功能推荐等。还有之前看到的微博应用中Redis用在计数和好友关系方面,其中好友关系方面就涉及到利用set解决传统数据库无法快速计算集合交集的功能。
大家有没有在自己的项目中使用过Redis?欢迎在评论区分享,觉得文章有用的话点赞和分享。
redis> SADD myset "one"
(integer) 1
redis> SADD myset "two"
(integer) 1
redis> SADD myset "three"
(integer) 1
redis> SPOP myset
"one"
redis> SMEMBERS myset
1) "three"
2) "two"
redis> SADD myset "four"
(integer) 1
redis> SADD myset "five"
(integer) 1
redis> SPOP myset 3
1) "five"
2) "four"
3) "two"
redis> SMEMBERS myset
1) "three"
redis>