redis若干问

一. redis 为什么要采用单进程单线程?

对于redis来说,单线程效率更高。
redis是基于内存的操作,内存是快设备,不需要像I/O操作那样,等待I/O就绪,用单线程操作,避免了线程上下文的切换,效率更高。

二. Redis单线程的优劣势 ?
(1)  代码更清晰,处理逻辑更简单 。省去了锁和上下文切换的开销。
(2) 无法发挥多核CPU性能,开启多个Redis实例可以改进。为了减少切换的开销,有必要为每个实例指定其所运行的CPU内核。

三. 什么场景下用多线程?

假设有任务A和任务B,如下两种执行方式
方式一:  两个线程,一个线程执行A,另一个线程执行B。
方式二:  一个线程,先执行A,执行完以后继续执行B。
请问,哪种方式执行更快?
对于快设备来说单线程更快,对于慢设备来说多线程更快。

在I/O(磁盘或网络)操作都时候,要用多线程。I/O操作:1. I/O等待(等待机械寻址成功,等待消息送达) 2. I/O操作。
在"I/O等待"时间段内,线程是在“阻塞”着等待磁盘,此时操作系统可以将那个空闲的CPU核心用于服务其他线程。
Redis不涉及I/O操作,因此设计为单线程是效率最高的。

四. redis 性能瓶颈在哪?
1.内存大小,关系到Redis存储的数据量
2. 网络带宽,吞吐量。
Redis客户端执行一条命令分为四个过程:发送命令、命令排队、命令执行、返回结果
而其中发送命令+返回结果这一过程被称为Round Trip Time(RTT,往返时间)
Redis的客户端和服务端可能部署在不同的机器上。例如客户端在北京,Redis服务端在上海,两地直线距离约为1300公里,那么1次RTT时间=1300×2/(300000×2/3)=13毫秒(光在真空中传输速度为每秒30万公里,这里假设光纤为光速的2/3),那么客户端在1秒内大约只能执行80次左右的命令,这就和Redis的高并发高吞吐特性背道而驰啦!所以一般情况下,都是就近部署!

五. 使用redis需要注意的问题?
1. key命名的规范性。
2. 数据一致性问题。
3. 缓存穿透,击穿,雪崩问题。
4. key的并发竞争问题。
5. 过期key的回收。

六. redis 过期策略和内存淘汰机制。
过期策略:定期删除(定时间段删除过期的key)+惰性删除(使用时,删除过期的key),大量过期的优化--(内存满时,触发定期删除)
内存淘汰机制: redis内存块耗尽了,怎么办?
volatile-lru(默认):在设置了过期时间的键空间中,优先移除最近未使用的key。(可能未过期,只是最近最久未使用)
allkeys-lru:在主键空间中,优先移除最近未使用的key。

原文地址:https://www.cnblogs.com/shijianchuzhenzhi/p/13122200.html