【day15】Redis - 大厂程序员是怎么用的 | 青训营笔记

62 阅读3分钟

这是我参与「第五届青训营」伴学笔记创作活动的第 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)使用缓存集群,避免单机宕机造成缓存雪崩