1. Redis 是单线程还是多线程,为什么Redis快

单工作线程,高版本出现多IO 线程, epoll

原来工作线程就是串行执行,输入+计算+输出。 现在提升性能,输入输出都用了多线程,只有计算在工作线程中串行。增加吞吐量。Redis 内部肯定是线程安全的,但是外部程序调用没办法保障,所以需要外部调用程序去保障。

旧版本执行

brpop redis 多线程 redis多线程原理_数据库

新版本执行过程

brpop redis 多线程 redis多线程原理_数据库_02

 为什么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解决

brpop redis 多线程 redis多线程原理_redis_03