1.Redis为什么快
1.基于内存存储
2.高效的数据结构
3.IO多路复用模型
4.单线程
IO多路复用
应用程序从磁盘中读取数据,经过了两个阶段,第一个阶段,使用recvform命令,尝试从内核中加载数据,如果没有数据,那么内核操作硬件拿到数据,这个过程需要等待;第二个阶段,内核把数据加载之后再写给用户的缓存区
如果是阻塞IO,那么从用户发起请求到读取数据,都会处于阻塞状态。
阻塞IO
非阻塞IO,在使用recvfrom加载数据时候,会立即返回结果而不会阻塞用户进程,如果没有加载到数据会继续发起请求。但是这种方式会发起多次recvfrom命令,造成cpu空转。
IO多路复用,当用户读取数据,不会去调用recvfrom函数,而是调用epoll函数,这个函数会将需要监听的数据交给内核,由内核检查这些数据是否就绪,如果数据就绪了,会通知应用程序来读取数据。这样可以避免发起多次recvfrom命令,降低CPU的压力。
单线程为什么快
而Redis是基于内存操作,执行速度很快,性能瓶颈在于网络延迟而不是执行速度,因此多线程不会带来巨大的性能提升。
而且在多线程的情况下会导致频繁的上下文切换,带来不必要的开销;
同时引入多线程会带来线程安全问题,就必须会使用锁机制来保证安全,这样实现复杂度变高,同时性能也会打折扣。
2.Redis过期Key的删除策略
1.周期删除
设置定时任务,周期性的抽取部分过期的key,然后删除
2.惰性删除
即并不是该key到期了就删除,而是该key过期后,redis查询该key发现过期了,就会把他删除掉
3.Redis内存回收策略
noevction:不淘汰,内存满的时候不允许加入新数据