zoukankan      html  css  js  c++  java
  • 处理redis过期数据

    可以采用三种方法:

    定时删除、定期删除、惰性删除

    一、定时删除

    写一个定时器,将key的过期时间到达时,立刻将键删除

    优点:节约内存

    缺点:增加CPU压力,影响redis服务器响应时间和吞吐量

    二、定期删除

    activeExpireCycle()函数对每个expires(数据库)逐一进行检测
    对每个数据库检测时,随机挑选W个key检测
    1.如果key超时,删除key
    2.如果一轮中删除key的数量>W*25%,循环该过程(继续挑选w个key检测)
    3.如果一轮中删除key的数量<=W*25%,检查下一个数据库,一直这样循环
    4.W取值=ACTIVE_EXPIRE_CYCLE_LOOKUPS_PER_LOOP属性值
    参数current_db用于记录activeExpireCyle()进入哪个数据库执行,如果activeExpireCycle()执行时间到期,下次从current_db继续向下执行

    特点:随机抽查、重点抽查

    优点;检测频度可以自定义,内存占用不是很大

    缺点:清理不彻底

    三、惰性删除

    数据过期之后不处理,等下次查询的时候在删除

    优点:CPU占用不大

    缺点:内存占用很大,过期数据一直存在

    四、数据逐出策略

    执行所有命令的时候,都会检测内存是否充足

    不满足最低存储要求的时候,就会清理数据,清理数据的算法叫逐出算法

    如果逐出算法不能清理出足够的空间就会反复执行。当依然无法清理出空间的时候就会报错:

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

    相关的配置:

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

    删除方式:

    检测易失数据(可能会过期的数据集server.db[i].expires)
    1.volatile-lru:挑选最近最早使用的数据淘汰
    2.volatile-lfu:挑选最近使用次数最少的数据淘汰
    3.volatile-ttl:挑选将要过期的数据淘汰
    4.volatile-random:任意选择数据淘汰
    
    检测全库数据(所有数据server.db[i].dict)
    5.allkeys-lru:挑选最近最早使用的数据淘汰
    6.allkeys-lfu:挑选最近使用次数最少的数据淘汰
    7.allkeys-random:任意选择数据淘汰
    
    放弃数据驱逐
    8.no-enviction(驱逐):禁止驱逐数据(redis4.0中默认策略),会引发错误OOM
    
    maxmemory-policy  volatile-lru
    记录编程的点滴,体会学习的乐趣
  • 相关阅读:
    事务传播机制,搞懂。
    洛谷 P1553 数字反转(升级版) 题解
    洛谷 P1200 [USACO1.1]你的飞碟在这儿Your Ride Is Here 题解
    洛谷 P1055 ISBN号码 题解
    洛谷 P2141 珠心算测验 题解
    洛谷 P1047 校门外的树 题解
    洛谷 P1980 计数问题 题解
    洛谷 P1008 三连击 题解
    HDU 1013 题解
    HDU 1012 题解
  • 原文地址:https://www.cnblogs.com/AduBlog/p/14411960.html
Copyright © 2011-2022 走看看