Redis 功能原理分析
过时时间设置redis
- EXPIRE key seconds
- EXPIRE命令的seconds命令必须是整数,因此最小单位是1秒
- PEXPIRE命令的单位是毫秒
- 一个键还有多久时间被删除,可使用TTL命令
- TTL key
- 当键不存在时,TTL命令会返回-2
- 没设置过时时间,-1
过时删除的原理算法
- 消极方法(passive way)
- 积极方法(active way)
- 周期性地从设置了失效时间的主键中选择一部分失效的主键删除
- Redis每秒会进行10次操做,具体的流程:
- 随机测试 20 个带有timeout信息的key;
- 删除其中已通过期的key;
- 若是超过25%的key被删除,则重复执行步骤1;
- 这是一个简单的几率算法(trivial probabilistic algorithm),
- 基于假设咱们随机抽取的key表明了所有的key空间。
Redis发布订阅设计模式
- Redis提供了一组命令可让开发者实现“发布/订阅”模式(publish/subscribe)
- 值得注意的是消息发送出去不会持久化,
- 若是发送以前没有订阅者,
- 那么后续再有订阅者订阅该频道,以前的消息就收不到了
- 结构图
- channel分两类,
- 一个是普通channel、
- 另外一个是pattern channel(规则匹配),
- producer1发布了一条消息【publish abc hello】,
- redis server发给abc这个普通channel上的全部订阅者,
- 同时abc也匹配上了pattern channel的名字,
- 因此这条消息也会同时发送给pattern channel *bc上的全部订阅者

Redis内存回收策略缓存
- Redis中提供了多种内存回收策略,当内存容量不足时,
- 就不得不淘汰内存中的一些对象,释放这些对象占用的空间
- 默认的策略为noeviction策略,
- 当内存使用达到阈值的时候,全部引发申请内存的命令会报错
- allkeys-lru:从数据集(server.db[i].dict)中挑选最近最少使用的数据淘汰
- 适合的场景: 若是咱们的应用对缓存的访问都是相对热点数据,那么能够选择这个策略
- allkeys-random:随机移除某个key。
- 适合的场景:若是咱们的应用对于缓存key的访问几率相等,则可使用这个策略
- volatile-random:从已设置过时时间的数据集(server.db[i].expires)中
- volatile-lru:从已设置过时时间的数据集(server.db[i].expires)中挑选
- volatile-ttl:从已设置过时时间的数据集(server.db[i].expires)中挑选
- 适合场景:这种策略使得咱们能够向Redis提示哪些key更适合被淘汰,咱们能够本身控制
总结安全
- 实际上Redis实现的LRU并非可靠的LRU
- 若是须要在全部的数据中搜索最符合条件的数据,那么必定会增长系统的开销,
- 早期的Redis版本是基于采样的LRU
- Redis3.0版本以后,Redis做者对于基于采样的LRU进行了一些优化
- 目的是在必定的成本内让结果更靠近真实的LRU。
Redis是单进程单线程?性能为何这么快服务器
- Redis采用了一种很是简单的作法
- Redis把任务封闭在一个线程中从而避免了线程安全问题;
- redis为何是单线程?
- 官方的解释是,CPU并非Redis的瓶颈所在,
- Redis的瓶颈主要在机器的内存和网络的带宽。
- 那么Redis能不能处理高并发请求呢?
- 固然是能够的,至于怎么实现的,咱们来具体了解一下。
- 【注意并发不等于并行,
- 并发性I/O流意味着可以让一个计算单元来处理来自多个客户端的流请求。
- 并行性,意味着服务器可以同时执行几个事情,具备多个计算单元】
- 多路复用
- Redis 是跑在单线程中的,全部的操做都是按照顺序线性执行的,
- 可是因为读写操做等待用户输入或输出都是阻塞的,
- 因此 I/O 操做在通常状况下每每不能直接返回,
- 这会致使某一文件的 I/O 阻塞致使整个进程没法对其它客户提供服务,
- 而 I/O 多路复用就是为了解决这个问题而出现的。
几种I/O模型网络
- 同步阻塞IO(Blocking IO):即传统的IO模型。
- 同步非阻塞IO(Non-blocking IO):
- 默认建立的socket都是阻塞的,
- 非阻塞IO要求socket被设置为NONBLOCK。
- IO多路复用(IO Multiplexing):
- 即经典的Reactor设计模式,也称为异步阻塞IO,
- Java中的Selector和Linux中的epoll都是这种模型。
- 异步IO(Asynchronous IO):即经典的Proactor设计模式,也称为异步非阻塞IO。
- 同步和异步,指的是用户线程和内核的交互方式
- 阻塞和非阻塞,指用户线程调用内核IO操做的方式是阻塞仍是非阻塞
欢迎关注本站公众号,获取更多信息