• Redis入门到实战(四、原理篇)RESP协议


    Redis是一个CS架构的软件,通信一般分两步(不包括pipeline和PubSub):
    客户端(client)向服务端(server)发送一条命令
    服务端解析并执行命令,返回响应结果给客户端。
    因此客户端发送命令的格式、服务端响应结果的格式必须有一个规范,这个规范就是通信协议。

    而在Redis中采用的是RESP(Redis Serialization Protocol)协议:
    Redis 1.2版本引入了RESP协议
    Redis 2.0版本中成为与Redis服务端通信的标准,称为RESP2
    Redis 6.0版本中,从RESP2升级到了RESP3协议,增加了更多数据类型并且支持6.0的新特性–客户端缓存
    但目前,默认使用的依然是RESP2协议,也是我们要学习的协议版本(以下简称RESP)。

    在RESP中,通过首字节的字符来区分不同数据类型,常用的数据类型包括5种:
    单行字符串:首字节是 ‘+’ ,后面跟上单行字符串,以CRLF( “\r\n” )结尾。例如返回"OK": “+OK\r\n”

    错误(Errors):首字节是 ‘-’ ,与单行字符串格式一样,只是字符串是异常信息,例如:“-Error message\r\n”

    数值:首字节是 ‘:’ ,后面跟上数字格式的字符串,以CRLF结尾。例如:“:10\r\n”

    多行字符串:首字节是 ‘$’ ,表示二进制安全的字符串,最大支持512MB:

    如果大小为0,则代表空字符串:“$0\r\n\r\n”

    如果大小为-1,则代表不存在:“$-1\r\n”

    数组:首字节是 ‘*’,后面跟上数组元素个数,再跟上元素,元素数据类型不限:

    在这里插入图片描述

    2、Redis内存回收-过期key处理

    3、Redis内存回收-内存淘汰策略

    内存淘汰:就是当Redis内存使用达到设置的上限时,主动挑选部分key删除以释放更多内存的流程

    Redis支持8种不同策略来选择要删除的key:

    • noeviction: 不淘汰任何key,但是内存满时不允许写入新数据,默认就是这种策略。
    • volatile-ttl: 对设置了TTL的key,比较key的剩余TTL值,TTL越小越先被淘汰
    • allkeys-random:对全体key ,随机进行淘汰。也就是直接从db->dict中随机挑选
    • volatile-random:对设置了TTL的key ,随机进行淘汰。也就是从db->expires中随机挑选。
    • allkeys-lru: 对全体key,基于LRU算法进行淘汰
    • volatile-lru: 对设置了TTL的key,基于LRU算法进行淘汰
    • allkeys-lfu: 对全体key,基于LFU算法进行淘汰
    • volatile-lfu: 对设置了TTL的key,基于LFI算法进行淘汰
      比较容易混淆的有两个:
      • LRU(Least Recently Used),最少最近使用。用当前时间减去最后一次访问时间,这个值越大则淘汰优先级越高。
      • LFU(Least Frequently Used),最少频率使用。会统计每个key的访问频率,值越小淘汰优先级越高。
  • 相关阅读:
    解决Java 8 date/time type `java.time.LocalDateTime` not supported by default
    穿戴式心电信号采集系统设计(任务书+lunwen+答辩PPt+查重报告)
    【生成模型】解决生成模型面对长尾类型物体时的问题 RE-IMAGEN: RETRIEVAL-AUGMENTED TEXT-TO-IMAGE GENERATOR
    全面解析UDP协议(特点、报文格式、UDP和TCP的区别)
    速览muduo组成结构
    Actipro Editors for WPF高级数据输入组件
    小红书种草步骤:小红书种草怎么做?
    [Node]几个常用的node后端框架
    P2404 自然数的拆分问题
    webpack编译报错Cannot find module ‘@babel/core‘且无法识别es6的reset语法
  • 原文地址:https://blog.csdn.net/hc1285653662/article/details/133936482