数据结构:

底层的数据结构:

String:适用分布式锁,共享信息等

Hash:适用购物车场景

List:适用消息队列

Set:适用点赞场景

Zset:适用与排序场景

线程模型:

redis为什么快:

1:redis大部分操作都是在内存中进行的

2:redis采用了单线程模型避免了多线程的竞争,省去了多线程切换带来时间和性能上的开销

3:采用了io多路复用机制处理大量的客户端请求

redis哪里使用了多线程:

redis会启动后台线程进行【关闭文件,AOF刷盘,释放内存】

6.0以后多线程来处理网络I/O但是执行命令仍然是单线程

事务:

如何实现redis的原子性:

lua脚本

日志:

redis的持久化方法:

AOF日志+RDB快照

AOF日志:每次写操作都追加到日志中,缺点:消耗大

RDB快照:把某一时刻内存中的数据写到磁盘中,缺点:两次快照之间的数据读写会丢失

场景:

内存淘汰和过期删除:

过期删除:

redis选择【定期删除和惰性删除】,定期删除:每个一段时间检查一下删除过期数据,惰性删除:当请求访问数据时先判断是否过期,如果过期就删除并返回Null

内存淘汰:

不进行:不再进行服务

进行:优先淘汰快过期的和最近最少访问的

缓存雪崩,击穿,穿透:

穿透:访问不存在的key在redis和mysql里都没有,等同于没有经过redis直接发到mysql 解决方案:针对查询的数据,可以在缓存中设置一个默认值

击穿:某个key突然失效,大量请求发送到mysql上 解决方案:不给热点数据设置过期时间

雪崩:多个key同时失效,大量请求发送到mysql上 解决方案:均匀设置过期时间避免大量数据同时过期

缓存一致性:

写策略:

1:更新数据库的数据

2:删掉缓存

读策略:

1:缓存未命中

2:从数据库中读数据

3:把数据写到缓存里