1. Redis 是单线程还是多线程,为什么Redis快
单工作线程,高版本出现多IO 线程, epoll
原来工作线程就是串行执行,输入+计算+输出。 现在提升性能,输入输出都用了多线程,只有计算在工作线程中串行。增加吞吐量。Redis 内部肯定是线程安全的,但是外部程序调用没办法保障,所以需要外部调用程序去保障。
旧版本执行
新版本执行过程
为什么Redis快?
a 单线程使用epoll并实现多路复用,虽然是单线程,但是输入输出是可以做到多线程并发,只是处理数据的时候才是单线程。
b. 基于内存操作
c. 数据存储结构做了大量优化
d. 单线程减少了多线程上下文切换的时间和性能消耗
2. REDIS缓存穿透,缓存击穿,缓存雪崩原因+解决方案
穿透: 应用在高并发,本来redis 里面就没有,直接访问DB
击穿:应用在高并发,本来redis 里面有,但是过期了,直接访问DB
缓存血崩: 多个击穿/穿透产生
解决方案:
1.布隆过滤器:将可能存在的数据哈希到一个足够大的bitmap中,一定不存在的数据会被拦截掉
2.返回空数据
3 加互斥锁 (先抢锁再访问DB,避免穿透和击穿的出现)
3.Redis 如何回收和淘汰
3.1 回收
1.定时删除:在设置key的过期时间的同时,为该key创建一个定时器,让定时器在key的过期时间来临时,对key进行删除
2 定期删除: 回收已过期对象,后台轮询的方式删除,删除也不是全部删除。
3 惰性删除: 访问过程发现过期先删除后存储
单线程,所以回收删除key会对性能有影响
3.2 淘汰(由于内存不足,到达maxmemory 后触发淘汰机制)是对全部key进行的
策略
1)noeviction: 不删除,直接返回报错信息。
2)allkeys-lru:移除最久未使用(使用频率最少)使用的key。推荐使用这种。
3)volatile-lru:在设置了过期时间的key中,移除最久未使用的key。
4)allkeys-random:随机移除某个key。
6)volatile-ttl: 在设置了过期时间的key中,移除准备过期的key。
5)volatile-random:在设置了过期时间的key中,随机移除某个key。
7)allkeys-lfu:移除最近最少使用的key。
8)volatile-lfu:在设置了过期时间的key中,移除最近最少使用的key。
LRU : 最近最少使用,最近访问时间为判断 (最常用)
LFU : 最不经常使用,最近一段时间内访问次数 (考虑热点访问,可以一分钟内访问量少,但是前10分钟前访问量巨大)
4. 数据库和 redis 不一致用canal解决