这是我参与「第五届青训营」伴学笔记创作活动的第15天
1.概述
- 为什么需要Redis,Redis的基本工作原理
- Redis应用案例
- 在字节跳动,使用Redis有哪些注意事项
2.Redis
2.1 熟悉Redis基本操作
2.1.1 熟悉以下命令的操作
- GET/SET/DEL/INCR/SETNX
- HSET/HGET/HINCRBY
- LPUSH/RPOP/LRANGE
- ZADD/ZRANGEBYSCORE/ZREVRANGE/ZINCRBY/ZSCORE
2.1.2 了解pipelining概念
2.1.3 复习数据结构
- 链表/FIFO
- Hash Tale
- Skip List
2.2 Redis基本工作原理
- Redis实现数据持久化的原理:AOF/RDB
- Redis单线程处理命令的概念
2.3 Redis应用案例
- 掘金连续签到,需要了解GET/SET,Key过期
- 掘金用户计数,使用到HASH
- 排行榜ZSET
- 积分变化时,排名要实时变更
- 结合dict后,实现跳表
- 限流
- 使用SETNX实现分布式锁
2.4 在字节跳动,使用Redis有哪些注意事项
-
大Key:Value大于10KB就是大Key,使用大Key将导致Redis系统不稳定
- 拆分:
- 压缩value
- 集合类结构hash、list、set - 拆分 - 区分冷热:如榜单列表场景使用zset,只缓存前10页数据,后续数据走db
- 拆分:
-
热Key:一个Key的QPS特别高,将导致Redis实例出现负载突增,负责均衡流量不均的情况。导致单实例故障
- 设置Localcache
- 在访问Redis前,在业务服务侧设置Localcache,降低访问Redis的QPS。Localcache中缓存过期或未命中,则从Redis中将数据更新到Localcache。
- Java:Guava; Golang: bigcache
- 拆分
- 将key:value这一个热key复制写入多份。例如key1:value,key2:value
- 使用Redis代理的热key承载能力
- 设置Localcache
-
慢查询:大Key、热Kye的读写;一次操作过多的Key(mset/hmset/sadd/zadd)
-
导致缓存穿透、缓存雪崩的场景及避免方案(还有缓存击穿)
-
-
缓存穿透避免
-
使用布隆过滤器:将查询的参数都存储到一个 bitmap 中,在查询缓存前,如果 bitmap 存在则进行底层缓存的数据查询,如果不存在则进行拦截,不再进行缓存的数据查询
-
缓存空对象:如果数据库查询的为空,则依然把这个数据缓存并设置过期时间,当多次访问的时候可以直接返回结果,避免造成多次访问数据库,但要保证当数据库有数据时及时更新缓存
-
-
缓存雪崩避免
-
在缓存失效后,通过加锁或者队列来控制读数据库写缓存的线程数量。比如对某个Key只允许一个线程查询和写缓存,其他线程等待
-
通过缓存 reload 机制,预先去更新缓存,在即将发生高并发访问前手动触发加载缓存
-
对于不同的key设置不同的过期时间,让缓存失效的时间点尽量均匀,比如我们可以在原有的失效时间基础上增加一个随机值,比如1~5分钟随机,这样每一个缓存的过期时间的重复率就会降低。
-
设置二级缓存,或者双缓存策略。
-
-