redis
数据结构:
底层的数据结构:
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:把数据写到缓存里
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 ZSQ的博客!