这是我参与「第五届青训营 」伴学笔记创作活动的第31天。主要学习了Redis数据库的工作原理以及一些业务场景上的应用还有使用时需要考虑的问题。
Redis工作原理
- 数据从内存读写
- 数据持久化(增量数据保存到AOF文件、全量数据保存到RDB文件)
- 单钱程处理所有操作
Redis的工作流程如下:
Redis启动时先读取RDB文件,对比是否AOF上有未执行的指令,有则执行。
应用案例
连续签到
用户每日有一次签到机会,如果断签,连续签到(每天零点前签到)计数将归0。
- Key:cc_uid_11XXXXXXXX
- value: 252
- expireAt: 后天的0点
String数据结构:
- 存储字符串、数字、二进制
- 通常和expire配合使用
- 场景:存储计数、Session
消息通知
用list做消息队列,当文章更新时,将更新的文章最送到ES,用户就能搜索到最新的文章数据。
list数据结构:
有一个双向链表和listpack实现,listpack将多个数据压缩到一个节点,如图,有存元素个数以及每个元素。
计数
一个用户有多项计数需求,可通过hash结构存储。
pipeline: 一次如果需要set多get多个key时,可以采用pipeline的方式一批一批操作,减少网络传输。
hash数据结构:
采用拉链法解决冲突。当拉链很长时会扩容(rehash),redis的rehash过程采用渐进式,每次用户访问时会迁移少量数据,将整体迁移过程,平摊到所有访问用户请求的过程中。
排行榜
积分变化时,排名要实时变更。
- 结合dict后,可实现通过key操作跳表的功能
zset数据结构(zskiplist): 跳跃表结构如下:
和搜索树的区别?
zset数据结构如下:skiplist+hash
限流
要求1秒内放行的请求为N,超过N则禁止访问。
- Key:comment_freq_limit_时间戳 对key调incr,超过限制N则禁止访问。
分布式锁
并发场景,要求一次只能有一个协程执行,执行完成后,其他等待中的协程才能执行。
可以用redis的setnx实现,利用了两个特性:
- Redis是单线程执行命令
- setnx只有未设置过才能执行成功