Redis流行的原因( 二 )

  • NULL 用多行字符串表示 , 不过长度要写成-1 。 $-1\r\n
  • 空串 用多行字符串表示 , 长度填 0 。 $0\r\n\r\n
  • 注意这里有两个\r\n 。 为什么是两个?因为两个\r\n之间,隔的是空串.
    5. 丰富的数据类型常用的几种数据类型
    • string
    • list
    • set
    • zset
    • hash
    • HyperLogLog
    • bitmap
    • Geo
    6. 数据过期淘汰策略懒性删除
    • 触发机制当访问redis中键值对时会判断这个键值对是否过期,如果过期的话就会删除这个键值对并返回nil
    优点:对CPU友好,不用执行与当前命令无关的操作缺点:对内存不友好,当大量过期的键值对不被访问时会浪费大量内存空间
    定期删除
    为了弥补惰性删除对于内存的不友好,redis中还有一种过期策略即定期删除 。
    • 触发机制当一个键值对设置expire后 , redis中会维护一个过期字典 。 这个过期字典在redis中会使用serverCron时间事件轮询 , 轮询过期键值对进行释放 。 (redis.conf配置文件中hz配置项配置 , serverCron每秒执行次数, 默认10表示每100ms执行一次serverCron)
    【Redis流行的原因】redis中限制每次过期key清理时间不超过CPU时间的25% , 这段时间内会执行如下步骤操作:
    1. 随机选取过期字典中的100个key
    2. 淘汰所有的过期key
    3. 如果过期key超过25个则重复步骤1
    主动删除
    物理机的内存空间是有限的 , 当所有内存被占满以后redis接收到写操作命令应该怎么处理?此时就会触发主动删除
    • 触发机制redis.conf配置文件中maxmemory参数设置redis占用内存的大小 , 当超过这个值限定以后将会根据maxmemory-policy设置清理redis内存对象有关这个maxmemory提醒一点:集群环境下适当调低maxmemory配置,给output buffer预留空间 。 因为output buffer空间并不包括在maxmemory中
    • 清理策略清理策略划分可以分为两个维度与三个方面两个维度分别是过期键中筛选、所有键中筛选三个方面分别是 lru、ttl、random
    • volatile-lru:过期键中最长时间未调用的键值对
    • volatile-ttl:过期键中即将过期的键值对
    • volatile-random:过期键中随机删除
    • allkeys-lru:所有键中最长时间未调用的键值对
    • allkeys-random:所有键中随机删除
    • noevication:不清理,返回异常
    7. 持久化目前 , 分为3种持久化方式
    1. RDB
    2. AOF
    3. 混合模式(RDB+AOF)
    RDB(Redis DataBase)
    • 开启方式redis.conf配置save
    #save ""# 关闭RDBsave 900 1# after 900 sec (15 min) if at least 1 key changedsave 300 10# after 300 sec (5 min) if at least 10 keys changedsave 60 10000# after 60 sec if at least 10000 keys changed功能核心函数:rdbSave() / rdbLoad()
    Redis流行的原因文章插图
    • RDB触发场景:
    1. 执行 SHUTDOWN 命令(未配置AOF)
    2. 执行 SAVE/BGSAVE 命令
    127.0.0.1:6379> BGSAVE21499:M 08 Jun 2020 17:53:18.596 * Background saving started by pid 21528Background saving started127.0.0.1:6379> 21528:C 08 Jun 2020 17:53:18.601 * DB saved on disk21528:C 08 Jun 2020 17:53:18.601 * RDB: 0 MB of memory used by copy-on-write21499:M 08 Jun 2020 17:53:18.681 * Background saving terminated with successSAVE/BGSAVE区别SAVE :使用主进程进行RDB快照数据的持久化(会阻塞Redis其他操作)BGSAVE :fork()出来子进程进行RDB快照数据的持久化(推荐)