• (四)Redis高级(删除策略、服务器配置、高级数据类型)



    一、 删除策略

    是一种加速运行速率的策略,目标就是为了减少无效key的存储或者为我们释放出有用的空间来,达到数据的快速操作与利用,但是配置这些策略时会占用内存空间同时也会消耗掉CPU的性能

    (一)、Redis中的数据特征

    Redis是一种内存级数据库,所有数据均存放在内存中,内存中的数据可以通过TTL指令获取其状态
     XX :具有时效性的数据
     -1 :永久有效的数据
     -2 :已经过期的数据 或 被删除的数据 或 未定义的数据

    (二)、时效性数据的存储结构

    在这里插入图片描述
    数据通过EXPIRE、EXPIREAT、 PEXPIRE 、 PEXPIREAT 这四个指令可以设置过期时间,设置的name值有一个存储地址,把这个数据找到后 会开放一个空间expires,空间里放数据的存储地址和它的过期时间

    (三)、数据删除策略的目标

    在内存占用与CPU占用之间寻找一种平衡,顾此失彼都会造成整体redis性能的下降,甚至引发服务器宕机或内存泄露

    (四)、数据删除策略

    1. 定时删除

     创建一个定时器,当key设置有过期时间,且过期时间到达时,由定时器任务立即执行对键的删除操作
    优点:节约内存,到时就删除,快速释放掉不必要的内存占用
    缺点:CPU压力很大,无论CPU此时负载量多高,均占用CPU,会影响redis服务器响应时间和指令吞吐量
     总结:用处理器性能换取存储空间(拿时间换空间)

    2. 惰性删除

     数据到达过期时间,不做处理。等下次访问该数据时, 如果未过期,返回数据
    ;发现已过期,删除,返回不存在
    优点:节约CPU性能,发现必须删除的时候才删除
    缺点:内存压力很大,出现长期占用内存的数据
     总结:用存储空间换取处理器性能 (拿时间换空间)

    注意:在调取任何获取的数据的操作前,内部都会执行expirelfNeeded()函数去判断是否过期

    3. 定期删除

     Redis启动服务器初始化时,读取配置server.hz(在server空间下,用info server就可以找到)的值,默认为10
     每秒钟执行server.hz次serverCron()–>databasesCron()–>activeExpireCycle()
    server.hz的值是控制频度的,对服务器进行定时轮训, 轮训去对databases里面的每个库进行轮训,
     activeExpireCycle()对每个expires[]逐一进行检测,每次执行250ms/server.hz
     对某个expires[
    ]检测时,随机挑选W个key检测
     如果key超时,删除key
     如果一轮中删除的key的数量>W25%,循环该过程
     如果一轮中删除的key的数量≤W
    25%,检查下一个expires[],0-15循环
     W取值=ACTIVE_EXPIRE_CYCLE_LOOKUPS_PER_LOOP属性值
     参数current_db用于记录activeExpireCycle() 进入哪个expires[
    ] 执行
     如果activeExpireCycle()执行时间到期,下次从current_db继续向下执行
    总结:
     周期性轮询redis库中的时效性数据,采用随机抽取的策略,利用过期数据占比的方式控制删除频度
     特点1:CPU性能占用设置有峰值,检测频度可自定义设置
     特点2:内存压力不是很大,长期占用内存的冷数据会被持续清理
     总结:周期性抽查存储空间
    (随机抽查,重点抽查)

    (五)、删除策略比对

    1. 定时删除: 节约内存,无占用 、不分时段占用CPU资源,频度高、拿时间换空间
    2. 惰性删除:内存占用严重、延时执行,CPU利用率高、拿空间换时间
    3. 定期删除:内存定期随机清理、每秒花费固定的CPU资源维护内存、随机抽查,重点抽查

    (六)、逐出算法(总共8种策略)

    当新数据进入redis时,如果内存不足(redis中的数据都是永久存在时,删除策略就不起作用了)怎么办?

     Redis使用内存存储数据,在执行每一个命令前,会调用freeMemoryIfNeeded()检测内存是否充足。如
    果内存不满足新加入数据的最低存储要求,redis要临时删除一些数据为当前指令清理存储空间。清理数据
    的策略称为逐出算法。
     注意:逐出数据的过程不是100%能够清理出足够的可使用的内存空间,如果不成功则反复执行。当对所
    有数据尝试完毕后,如果不能达到内存清理的要求,将出现错误信息。

    (error) OOM command not allowed when used memory >'maxmemory'
    
    • 1

    1、影响数据逐出的相关配置

     最大可使用内存:maxmemory (占用物理内存的比例,默认值为0,表示不限制。生产环境中根据需求设定,通常设置在50%以上)
     每次选取待删除数据的个数:maxmemory-samples( 选取数据时并不会全库扫描,导致严重的性能消耗,降低读写性能。因此采用随机获取数据的方式作为待检测删除数据)
     删除策略:maxmemory-policy ( 达到最大内存后的,对被挑选出来的数据进行删除的策略)

     检测易失数据(可能会过期的数据集server.db[i].expires )
    ① volatile-lru:挑选最近最少使用的数据淘汰
    ② volatile-lfu:挑选最近使用次数最少的数据淘汰
    ③ volatile-ttl:挑选将要过期的数据淘汰
    ④ volatile-random:任意选择数据淘汰
     检测全库数据(所有数据集server.db[i].dict )
    ⑤ allkeys-lru:挑选最近最少使用的数据淘汰
    ⑥ allkeys-lfu:挑选最近使用次数最少的数据淘汰
    ⑦ allkeys-random:任意选择数据淘汰
     放弃数据驱逐
    ⑧ no-enviction(驱逐):禁止驱逐数据(redis4.0中默认策略),会引发错误OOM(Out Of Memory)

    2、数据逐出策略配置依据

     使用INFO命令输出监控信息,查询缓存 hit (命中次数)和 miss(丢失次数) 的次数,根据业务需求调优Redis配置

    二、服务器配置-redis.conf配置

    (一)服务器基础配置

    1、对服务器端设定

     设置服务器以守护进程的方式运行:daemonize yes|no
     绑定可以访问的主机地址:bind 127.0.0.1 (只有绑定的ip可以访问)
     设置服务器端口号:port 6379
     设置数据库数量:databases 16

    2、日志配置

     设置服务器以指定日志记录级别:loglevel debug|verbose|notice|warning
     日志记录文件名:logfile 端口号.log
    注意:日志级别开发期设置为verbose即可,生产环境中配置为notice,简化日志输出量,降低写日志IO的频度

    3、对客户端的配置

     设置同一时间最大客户端连接数,默认无限制。当客户端连接到达上限,Redis会关闭新的连接:maxclients 0
     客户端闲置等待最大时长,达到最大值后关闭连接。如需关闭该功能,设置为 0:timeout 300

    4、多服务器快捷配置

    在生产环境中可能会配置多个redis服务,但是他们的配置都差不多,所以可以先写个公共的配置文件,然后在自己的配置文件中用include引入就可以

     导入并加载指定配置文件信息,用于快速创建redis公共配置较多的redis实例配置文件,便于维护:include /path/server-端口号.conf

    三、高级数据类型

    (一)、Bitmaps

    可以理解为:String中二进制位的操作接口,操作API有哪些
    在这里插入图片描述

    1、Bitmaps类型的基础操作

     获取指定key对应偏移量上的bit值:getbit key offset
     设置指定key对应偏移量上的bit值,value只能是1或0:setbit key offset value
    注:
    offfset:表示从什么位置改成值是什么,如setbit key 0 1 表示将key0位上的值改成1
    偏移量:表示对应的位置offset)

    2、Bitmaps类型的扩展操作

    业务场景
    电影网站
     统计每天某一部电影是否被点播
     统计每天有多少部电影被点播
     统计每周/月/年有多少部电影被点播
     统计年度哪部电影没有被点播
    业务分析
    在这里插入图片描述
    通过电影的名称获取到它对应的id,将id作为偏移量直接去拿就可以了

     对指定key按位进行交、并、非、异或操作,并将结果保存到destKey中
    bitop op destKey key1 [key2…]
     and:交
     or:并
     not:非
     xor:异或
     统计指定key中1的数量
    bitcount key [start end]
    Tips 21:
     redis 应用于信息状态统计

    (二)、HyperLogLog

    用途:统计不重复数据的数量

    1、统计独立UV

     原始方案:set
     存储每个用户的id(字符串)

     改进方案:Bitmaps
     存储每个用户状态(bit)

     全新的方案:Hyperloglog
    Hyperloglog是用来做基数统计的

    2、基数

     基数是数据集去重后元素个数
     HyperLogLog 是用来做基数统计的,运用了LogLog的算法
    例如
    {1, 3, 5, 7, 5, 7, 8} 基数集: {1, 3, 5 ,7, 8} 基数:5
    {1, 1, 1, 1, 1, 7, 1} 基数集: {1,7} 基数:2

    3、LogLog算法

    在这里插入图片描述

    4、HyperLogLog算法

    在这里插入图片描述

    5、LogLog算法底层

    在这里插入图片描述

    6、HyperLogLog类型的基本操作

     添加数据:pfadd key element [element …]
     统计数据:pfcount key [key …]
     合并数据:pfmerge destkey sourcekey [sourcekey…]
    如:
    在这里插入图片描述

    Tips 22:
     redis 应用于独立信息统计

    7、HyperLogLog相关说明

     用于进行基数统计,不是集合,不保存数据,只记录数量而不是具体数据
     核心是基数估算算法,最终数值存在一定误差
     误差范围:基数估计的结果是一个带有 0.81% 标准错误的近似值
     耗空间极小,每个hyperloglog key占用了12K的内存用于标记基数
     pfadd命令不是一次性分配12K内存使用,会随着基数的增加内存逐渐增大
     Pfmerge命令合并后占用的存储空间为12K,无论合并之前数据量多少

    三、GEO

    1、GEO类型的基本操作

     添加坐标点:geoadd key longitude latitude member [longitude latitude member …]
     获取坐标点:geopos key member [member …]
     计算坐标点距离:geodist key member1 member2 [unit]
     计算经纬度:geohash key member [member …]

    longitude:横坐标
    latitude :纵坐标
    member:地点的名称(如饭店名)
    unit:单位(m km等)
    例如
    在这里插入图片描述
    根据坐标求范围内的数据:
    georadius key longitude latitude radius m|km|ft|mi [withcoord] [withdist] [withhash] [count count]
    根据点求范围内的数据:
    georadiusbymember key member radius m|km|ft|mi [withcoord] [withdist] [withhash] [count count]

    如:
    在这里插入图片描述

    Tips 23
     redis 应用于地理位置计算

  • 相关阅读:
    1030 Travel Plan
    JVM之自动内存管理
    WebGL、canvas、svg
    Index Files and B+ Tree Refinements(听课笔记)
    【Selenium】Selenium绕过检测 & 隐藏特征
    布尔矩阵的奇偶性
    内网渗透之 windows 基础
    openGauss学习笔记- - -初始与使用技巧
    浅谈数据库分表
    解决跨域问题(vite、axios/koa)
  • 原文地址:https://blog.csdn.net/qq_45429856/article/details/127608453