Redis
为什么需要Redis
因为
- 数据从单表,演进出了分库分表
- MySQL从单机演进出了集群
- 随着业务的扩展,数据量、读写操作不断增加
Redis怎么解决的
- 将数据分为冷数据、热数据,对于使用频率较高的数据存在内存中(热数据)
- 将热数据存储到内存当中去
-
那么Redis的工作原理
- 数据从内存中读写
- 数据保存到硬盘上防止重启数据丢失(持久化)
- 增量数据保存到AOF文件
-
- 全量数据RDB文件
-
- 单线程处理所有操作
Redis应用案例
-
连续签到
完成案例要使用 String数据结构
- 在Redis中 String数据结构是一个数据安全的二进制数据,可以存储字符串、数字、二进制数据,通常配合expire使用(应用场景存储计数、Session)
alloc表示buf有多少空间 len表示buf已经使用了多少空间
- 消息通知
-
用list作为消息队列(文章更新,将更新的文章推送到ES,用户就能看到了)
-
List数据结构
-
Quicklist(由一个双向链表和Listpack实现)
-
Listpack
-
- 计数 一个用户有多项计数需求,可通过hash结构储存(文章点赞、阅读、评论数、关注数)
- Hash数据结构
-
Rehash: rehash操作是将ht[0]中的数据全部迁移到ht[1]中。 数据量小的场景下直接将数据从ht[0]拷贝到ht[1]速度是较快的。 数据量大的场景,例如存有上百万的KV时,迁移过程将会明显阻塞用户请求。 渐进式Rehash: 为避免出现这种情况,使用了rehash方案。 基本原理就是,每次用户访问时都会迁移少量数据。将整个迁移过程, 平摊到所有的访问用户请求过程中。
-
-
排行榜 积分变化时,排名需要实时变化 (结合dict后可实现通过ket操作跳表功能)
Zset数据结构 zskiplist(跳跃表加哈希) 对于某些实时性比较高、数据量比较大的排行榜,如果采用MySQL的OrderBy命令对用户热度进行排序,再更新排行榜,那么服务器将不堪重负。对于这种场景,可以使用Redis中的ZSet数据结构
- 限流 要求1秒内放行的请求为N,超过N则禁止访问 (Key: comment freq_limit_1671356046对这个Key调用incr,超过限制N则禁止访问1671356046 是当前时间戳)
- 分布式锁
并发场景,要求一次只能有一个协程执行执行完成后,其它等待中的协程才能执行
- 可以使用redis的setnx实现,利用了两个特性Redis是单线程执行命令
- setnx只有未设置过才能执行成功