Redis无论在实际运用中和面试提问中都十分重要,本文将带大家一起整理一下Redis的重要知识点和常用方法。
一. 数据类型
- Redis有哪些数据类型?
String, Hash, List, Set, Zset. (相比Memcached优势是拥有丰富的数据类型)。
- Redis有哪些数据类型?
-
Zset底层实现?
底层采用跳表实现,和树有相同的操作(查询,更新,删除)效率,比树实现起来更简单。基于简单的链表结构,分层加速索引效率。
-
- 键过期删除策略?
惰性删除+定期删除
- 键过期删除策略?
二. 操作注意项
- keys * (查询所有键值),会阻塞整个服务,用scan代替。
- lpop非阻塞式pop,在处理消费者问题时建议用blpop阻塞式pop。
- Redis支持事务吗?
支持。MULTI开启事务,EXEC提交事务,DISCARD回滚事务。
- Redis支持事务吗?
- 高并发如何保证数据一致性?
采用分布式锁,SET key value [ NX|XX]。
- 高并发如何保证数据一致性?
三. 持久化
- rdb, 采用save(阻塞服务)或bgsave(默认同步方式,fork复制子进程时短暂阻塞服务) ,对内存进行快照保存。
优点:dump文件较小,数据恢复快。
缺点:可能在宕机时未触发bgsave从而丢失数据。bgsave fork子进程,会占用大量内存。
- rdb, 采用save(阻塞服务)或bgsave(默认同步方式,fork复制子进程时短暂阻塞服务) ,对内存进行快照保存。
- aof,采用增量式保存插入和更新命令。
优点:数据完整性高。
缺点:恢复文件可能很大。
- aof,采用增量式保存插入和更新命令。
四. 集群
- 主从模式(保证高可用加上哨兵机制)。
-
集群模式。
a. 官方推出基于CRC16 算法将key分布于1684个hash槽中。
b. 实际生产中常用Redis Sharding 客户端分片技术,采用一致性hash算法,将key分布于集群node中。
-
五. 其它
- 如何保证缓存和数据库数据一致性?
简单情况下:先删缓存后更新数据库。
复杂情况下(高并发):请求串行化(引入队列解决)。
- 如何保证缓存和数据库数据一致性?
- 如何处理热点key?
a. 可以预计热点key时: key + randomValue
b. 无法预计热点key时:需要对key监控,发现热点key,采用a方案
c. 采用进程缓存
d. 最差情况下,限流,拒绝服务
- 如何处理热点key?
- 缓存穿透,雪崩?
a. 穿透:DB返回null,redis不进行缓存,从而导致该key请求直接打到DB上。
解决方案:对于无效值提前过滤,或加入缓存。
b. 雪崩:key设置相同过期时间,大量key同时过期,导致请求打到DB上。
解决方案:设置随机过期时间。
- 缓存穿透,雪崩?