1、redis 使用场景?
高并发、高性能
2、高并发场景,Redis 的优势和作用
redis 的所有操作都是在内存(主存)中进行,所以天然就有速度快的优势,而且吞吐量也很大,远远超过关系型数据库的吞吐量。而且 redis 在主存中是顺序执行的,所以无需考虑数据一致性。
redis 单机吞吐量 10 W,mysql 单机 吞吐量 8K 。
所以在高并发场景中,可以通过 redis 来减少后端关系型数据库的压力。
3、redis 如何提高性能?
将查询很耗时间的数据存于 redis,再次访问时直接从缓存获取,则可以提高响应速度
4、如何保证 redis 高可用?
生产者开启 ack 机制
redis 开启队列持久化和消息持久化
消费者 实行手动 ack 机制
5、缓存雪崩、缓存击穿、缓存穿透
-
缓存穿透:大量请求在缓存中未命中,大量请求到数据库
解决1:在大量请求缓存未命中时,在第一次请求到数据库时,将 null 存入缓存,避免后续请求到数据库
解决2:加过滤器,过滤器中保持 mysql 中所有ID,如果ID不在,打回,但是内存会占用过大,所有采用布隆算法(用容错率换取空间):将ID 使用多个哈希算法计算,将多个值存入 bit 数组下标位置,查询时,则先计算多个哈希值,在 bit 数组中进行查询,组合查询ID,都每个哈希值都查询到才算数据存在(多个哈希函数用于降低哈希碰撞)
-
缓存击穿:高并发热点key过期,导致瞬间大量访问数据库
解决1:热点key永不过期
解决2:使用分布式锁在 redis和MySQL之间,保证每次查询只有一个到数据库
-
缓存雪崩:redis 宕机导致大量请求到mysql,使mysql挂掉
解决:使用 redis 主从哨兵集群模式
6、缓存与数据库双写不一致
7、redis 数据丢失
redis 过期策略:定时删除 + 惰性删除
内部淘汰机制:按不同的机制来使内存不足时删除数据、自定义淘汰算法
8、如何保证 redis 高并发高可用?
高并发使用主从架构:一主多从,读写分离,主来写,从同步用于查询,
高可用使用主从架构加哨兵:服务宕机进行主备切换
9、redis 主从架构如何保证数据不丢失?
定时生成 RDB 快照文件: 数据恢复快,但是当快照大时,可能影响响应速度,最大丢失时间差数据,适合冷备
AOF:记录操作日志, 数据丢失少,数据恢复慢
10、redis 集群之分布式切片
优雅的一致性Hash 算法
-
定义哈希环,假设是 2^32
-
分片规则:(ip+id)% 哈希环 = num
num 的肯定在 [0,2^32-1] 之间,则每条数据在哈希环上都有一个坐标,按照哈希环进行顺时针寻找最近的 redis 数据库进行存储数据
-
数据迁移:
新增:如果在redis 2 和 3 之间新增 redis 4,则只需要将哈希环中redis 2 和 4之间的数据迁移到 redis 4
删除:如果删除 redis 3,则只需要将 redis3 迁移至 redis 1即可
-
缺点:数据倾斜