这是我参与「第五届青训营 」伴学笔记创作活动的第 9 天
Redis
Redis是远程字典服务器,他可以基于内存存取数据,也可以将数据持久化进行存储。通常和其他数据库配合进行使用。例如和MySQL集群进行持久化存储,访问时优先访问redis作为缓存。
基本原理
Redis默认从内存中读写。
如果需要进行持久化存储,Redis提供了两种方式来放置重启后数据丢失。
- 增量数据保存到AOF文件
- 全量数据RDB文件
单线程处理所有命令,这样Redis就能减少很多线程安全问题。
应用场景
连续签到
每日签到功能,用户每日有一次签到的机会,断签签到计数归零。
Key: cc_uid_132457879878 (用户UID)
value: 252 (连续签到天数)
expireAt: 后天的0点
消息通知
使用list作为消息队列
使用场景:消息通知。
每秒从队列中pop元素,当文章更新,将更新后的文章推送到ElasticSearch,用户就能搜索到新的文章数据。
计数
一个用户有多项计数需求,可通过hash结构存储。
例如点赞数,阅读数等等。
| key | value | 解释 |
|---|---|---|
| got_digg_count | 10693 | 文章被点赞数 |
| got_view_count | 2238438 | 文章被阅读数 |
| followee_count | 176 | 关注数 |
| follower_count | 9895 | 关注者 |
| ··· | ··· | ··· |
排行榜
积分变化时,排名要实时更新。
结合dict后,可以通过key操作跳表的功能。
- ZINCRBY myzset 2 "Alex"
- ZSCORE myzset "Alex"
限流
要求1秒内放行的请求为N,超过N禁止访问
Key: comment_freq_limit_xxxxx
对这个Key调用incr,超过限制N则禁止访问,xxxxx是时间戳。
分布式锁
并发场景,要求一次只有一个携程能执行。
可以使用redis的setnx来实现,利用的特性:
- Redis是单线程执行命令
- setnx只有未设置过才能执行成功
数据结构
-
String 数据结构-sds
-
- 可以存储字符串、数字、二进制数据
-
- 通常和expire配合使用
-
- 场景:存储计数、Session
-
QuickList quicklist有一个双向链表和listpack实现
-
listpack
-
hash
-
zskiplist 结合dict可以实现操作跳表