Redis 功能原理分析

过时时间设置redis

  • EXPIRE key seconds
    • EXPIRE命令的seconds命令必须是整数,因此最小单位是1秒
    • PEXPIRE命令的单位是毫秒
      • PTTL以毫秒单位获取键的剩余有效时间
  • 一个键还有多久时间被删除,可使用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是单线程的,因此耗时的操做会谨慎一些
    • 早期的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操做的方式是阻塞仍是非阻塞
相关文章
相关标签/搜索