这是我参与「第五届青训营」伴学笔记创作活动的第 15 天
要点:
1.为什么需要Redis,Redis的基本工作原理
Redis基本工作原理:
a.数据从内存中读写
b.数据保存到硬盘防止重启数据丢失【增量数据保存到AOF文件/全量数据RDB文件】
c.单线程处理所有操作命令
2.Redis应用案例
a.连续签到
sds:可以存储字符串、数字、二进制数据。通常和expire配合使用;
场景:存储技术、Session
b.消息通知
用list作为消息队列;
场景:消息通知。
例如当文字更新时,将更新后的文章推送到ES,用户就能搜索到最新的文章数据
List数据结构:QuickList由双向链表和listpack【一个结构里面放多个value】实现
c.计数
hash来存储
rehash:重新进行hash,避免有很多拉链;
渐进式rehash:为了避免大量数据进行rehash,因此将拷贝的开销平摊到每次访问
d.排行榜
zset,带有排序的hash结构
实现数据结构:跳表ZSkipList
e.限流
要求1s内放行的请求为N,超过N则禁止访问
用时间戳作为key,每个请求进行对该key加一
f.分布式锁
并发场景,要求一次只能有一个协程执行。执行完成之后,其他等待中的协程才能执行
可以使用Redis的setnx实现,利用了两个特性:
a.Redis时单线程执行命令
b.setnx只有未设置过才能执行成功
存在的问题:
a.业务锁超时
b.主从切换临界点问题
c.Redis集群出现多个主
防止误释放锁:使用lua脚本进行原子操作
3.在字节跳动,使用Redis有哪些注意事项
a.大key
危害:读取成本高;容易导致慢查询【过期、删除】;主从复制异常,服务阻塞,无法响应请求
业务测的大key表现:请求Redis超时错误
解决方法;
拆出大key:
1)拆分
2)压缩
3)集合结构hash、list、set、zset等【拆分:可以用hash取余,位掩码决定放在哪个key中;区分冷热:如榜单列表使用zset,只缓存前10页数据,后面的部缓存】
b.热key
用户访问该key的QPS非常高。
解决方法:
1)设置LocalCache:本地进行缓存
2)拆分:将这个热key复制写多份;但存在数据暂时不一致的风险
3)使用Redis代理的热key承载能力:使用Redis访问代理对LocalCache进行替代
c.慢查询
容易导致redis慢查询的操作:
1)批量操作时传入过多的key/value
2)Zset要小一点
3)大key避免
d.缓存穿透,缓存雪崩
缓存穿透:热点数据查询绕过缓存、直接查询数据库
原因:
1)查询一个一定不存在的数据
2)缓存过期时
避免:
1)缓存空值
2)布隆过滤器:存储合法的key
缓存雪崩:大量缓存同时过期
避免:
1)缓存空值
2)使用缓存集群,避免单机宕机造成缓存雪崩