精华内容
下载资源
问答
  • redis过期策略

    万次阅读 2019-01-29 12:46:14
    redis过期策略有两种,一种是主动式过期,另一种是被动式过期,redis采用两者相结合的方式来处理,因为单纯采用主动式过期,会影响redis的性能,单纯采用被动式过期,可能会导致大量内存得不到释放。 主动式过期: ...

    最近在读redis深度历险,记录一下在读书的过程中一些重要的知识点,供以后查阅。

    redis过期策略有两种,一种是主动式过期,另一种是被动式过期,redis采用两者相结合的方式来处理,因为单纯采用主动式过期,会影响redis的性能,单纯采用被动式过期,可能会导致大量内存得不到释放。

    主动式过期:

        redis会将所有设置了过期时间的key放到一个独立的字典中,以后会定时扫描这个字典,将过期的key删除。redis默认每秒进行10次过期扫描,扫描不会扫描所有的key,而是采用一种贪心的策略来进行:

    1. 从过期字典中随机选择20个key。

    2. 将20个key中过期的key删除。

    3. 如果过期的key的比例超过1/4,redis认为过期的key相对较多,会再次从步骤1依次执行。

    同时为了保证扫描不会出现过度循环影响性能,redis会限制每次扫描的时间上限为25ms。

     

    被动式过期:

        redis定时扫描任务可能不会将过期的key完全删除,此时redis会用一种懒惰策略来被动式的更新过期的key,即当这个key被实际访问时,redis会检查这个key的过期状态,如果过期,那么将这个key删除。

    展开全文
  • Redis更新缓存策略

    千次阅读 2019-03-28 11:04:03
     [被动]由用户触发更新  [预加载]提前加载好数据 方案1 [主动]后台点击更新缓存按钮,从DB查找最新数据集合,删除原缓存数据,存储新数据到缓存; 问题:更新过程中删除掉缓存后刚好有业务在查询,那么这...

     [主动]需要操作人员去操作,或者定时调度

      [被动]由用户触发更新

      [预加载]提前加载好数据

    • 方案1

      • [主动]后台点击更新缓存按钮,从DB查找最新数据集合,删除原缓存数据,存储新数据到缓存;

      • 问题:更新过程中删除掉缓存后刚好有业务在查询,那么这个时候返回的数据会是空,会影响用户体验

    • 方案2

      • [被动]前台获取数据时发现没有缓存数据就会去数据库同步数据到缓存

      • 问题:当并发请求获取缓存数据不存在的时候,就会产生并发的查询数据的操作。

    • 方案3

      • [主动]后台点击更新缓存按钮,从DB查找最新数据集合,这里不删除缓存,通过遍历数据覆盖和删除掉无效的数据

      • 问题:逻辑相对麻烦,而且更新机制无法通用;

    推荐

      以上的几种更新方案我都遇到过,因为产生了各种问题,所以我想到了一个相对好的方案,类似预加载功能,先把数据加载到缓存中,缓存成功后再切换显示最新的数据,将旧数据设置过期;

    • 方案4

        [主动][预加载]前台获取缓存的时候需要先得到缓存数据对应的Redis Key(简称:[ShowingKey]),然后根据[ShowingKey]去读取缓存数据(简称:[缓存];

      • [ShowingKey](可以是最近一次更新缓存的时间戳或者根据自己规则自定义)

      • [缓存](需要缓存的数据,如:DB数据等)

      • 需要两块数据:

    • 举个栗子:

        我们现在有个业务需要缓存今日上新商品数据,缓存到Hash中

        更新逻辑:

        后台编辑人员操作完数据的时候点击更新按钮,获取服务器当前时间=1469938351000=[更新时间戳],然后获取DB数据,缓存到Goods:Todays:1469938351000中,添加缓存数据成功后,获取Goods:Todays:ing中的时间戳1449538371020=[上一次更新时间戳],更新Goods:Todays:ing值=[更新时间戳]=1469938351000,更新成功后可以把[上一次更新时间戳]对应的缓存设置过期时间,我一般是设置5秒后过期。(注意旧数据一定要设置过期时间,不能直接删除,因为在切换[ShowingKey]的过程中可能还有业务在使用)

      • Key string key=Goods:Todays:ing 内容=最近一次的更新时间戳

      • Hash Key=Goods:Todays:{0} {0}=时间戳

      • [缓存]对应Redis Key 规则

      • [ShowingKey]对应的Redis Key

    更新总结
    • 第1种更新方案影响用户体验一般不推荐使用

    • 第2种更新方案可以通过程序锁,锁住更新操作只能有一个进入DB查询,可以避免问题

    • 第3种更新方案不会有第1,2 的问题,但是更新逻辑写起来比较麻烦,而且更新方案不能抽象通用

    • 第4种更新方案使用提前加载到缓存,然后在切换需要显示的缓存数据,可以完美解决1,2,3中的问题

    redis内存不足,滥用
    • 问题

      1. 数据不断累加,无效数据未清理,缓存未设置过期时间

      2. 存储数据中包含未使用到字段,整个对象序列化到redis中

      3. 冷数据,或者根本不会再去使用的无效数据没有清理

    • 解决

      1. 数据区分无效时间,设置过期时间,使无效数据过期;(如:通过日期后缀命名Key)

      2. 区分冷数据,清理掉冷数据;

      3. 缓存数据从简,redis key命名从简,数据字段命名从简,无效字段不添加在缓存中;

    键命名规范
    • 内存数据库,键名长度影响有限内存空间,所以命名应该控制长度,简短易懂;

    • 大小写规范

    • 根据业务命名,相同业务统一的Key前缀

    其他经验
    • 数值累加,get,set+1并发导致累加不准确

      • 使用redis increment 自增数值的机制不会有累加不准确的问题

    • .net 类库 ServiceStack 3.9.71.0 的一个问题

        SetEntryInHash 返回 bool,只有第一次新增的时候返回的是true,后面修改成功了也都是返回false

        源码:SetEntryInHash 方法,读取hset的结果 判断是否等于1,返回bool

        

        我们通过命令: hset 第一次sflyq key不存在,添加成功返回的执行结果是:1 hset 第一次sflyq key已经存在,修改成功购返回结果:0

        

        所以结果很明显,通过SetEntryInHash 判断hash是否key value 是否设置成功是有问题的,只有第一次设置会返回 ture

    展开全文
  • Redis删除策略

    千次阅读 2020-07-07 22:38:31
    卑微小吴励志写博客第29天。 删除策略 过期删除 redis中的数据特征 redis是一种内存级数据库,所有的数据均存储在内存中,通过TTL指令可以查看数据的状态。...这就是redis的删除策略做的事,redis有三种删除策略.

    卑微小吴励志写博客第29天。

    删除策略

    过期删除

    redis中的数据特征
    • redis是一种内存级数据库,所有的数据均存储在内存中,通过TTL指令可以查看数据的状态。
      xx:具有时效性的数据
      -1:代表永久性数据
      -2:已经过期的数据 或 已经删除了的数据 或 未定义的数据

    已经过期的数据真的被删除了吗?
    在这里插入图片描述
    redis让cpu处理很多指令的时候,cpu一下子处理不过来,但是删除的操作又没那么重要。所以就先没删,继续保存在内存中,什么时候删除呢?这就是redis的删除策略做的事,redis有三种删除策略。

    时效性数据的存储结构
    在这里插入图片描述
    expires空间相当于是redis开辟的一个存放值的地址和对应过期时间的空间,删除策略相当于是维护下面这个空间中的东西,上面存的值不变。

    删除策略的目标
    在内存和cpu占用之间找到一个平衡,顾此失彼会造成整个redis的性能下降,甚至引发服务器宕机或者内存泄露。
    就是在cpu闲的时候把那些过期的数据删除,忙的时候就不占用cpu了。

    1、定时删除

    • 创建一个定时器,当key设置有过期时间,且过期时间到达时,由定时器立即执行对key的删除。
    • 在这里插入图片描述
      到点了就干掉expires中和上面的key值。用处理器性能换内存空间。

    优点:

    • 节约内存,到点了就立即释放掉不必要的内存空间。

    缺点

    • cpu的压力会很大,不会考虑删除的时候cpu是否空闲,会影响redis服务器的响应时间和吞吐量。

    2、惰性删除

    • 数据到达过期时间,不做处理。等下次访问该数据时,发现未过期,则返回值;发现已经过期,删除(删除expires空间和key值),并返回不存在。

    优点

    • 节约cpu性能,当数据必须删除的时候才删除。

    缺点

    • 内存压力很大,出现过期数据会长期占用内存的情况。

    其实就是拿内存换cpu性能。

    3、定期删除

    上面的两种方案都比较极端,要么牺牲空间,要么牺牲时间。有没有这种的方案?

    - 当redis服务器初始化的时,读取配置server.hz

    在这里插入图片描述

    • 周期性轮询redis库中的时效性数据,采用随机抽取策略,利用过期数据占比的方式控制删除的频度。

    特点
    1、CPU性能占用设置了峰值,检测频度可以自己配置。
    2、内存压力不是很大,长期占用内存的冷数据会被持续清理。

    总结:周期性抽查存储空间(随机抽查,重点抽查)。
    redis内部用的是惰性删除和定期删除。

    逐出算法

    新数据进入redis时,如果内存不足怎么办?

    redis使用内存存储数据,在执行每一条命令前,会调用freeMemoryIfNeeded()检测内存是否充足,如果内存不满足新加入数据的最低存储要求,redis要临时删除一些数据为当前指令清理存储空间。
    注意
    逐出数据的过程不是100%能成功,如果执行一次后内存任然无法到达要求,会再次执行,如果对所有数据尝试完毕后,还是不是达到内存的要求,会爆出错误。

    在这里插入图片描述

    影响数据逐出的相关配置

    在这里插入图片描述
    ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200707223220147.png

    数据逐出策略配置依据

    • 使用info命令输出监控信息,查询缓存hit和miss的次数,根据业务需求调优Redis配置。
      在这里插入图片描述
    展开全文
  • Redis淘汰策略

    千次阅读 2018-10-23 11:06:27
    用于解决什么问题呢?举个例子 1)我们都知道技术都是衍生于问题...2)解决上述的问题,我们就要引出一个redis策略,即是标题。 淘汰策略 1)voltile-lru:从已设置过期时间的数据集(server.db[i].ex...
    1. 用于解决什么问题呢?举个例子
      1)我们都知道技术都是衍生于问题的。那我们就来说说用来做什么吧。
      大家可以想想,当我们的物理服务内存只有8G,但是数据却有100G,如何慢慢的放在redis中呢?再加上公司近期资金不够,不能扩展机器怎么办?
      2)解决上述的问题,我们就要引出一个redis的策略,即是标题。

    2. 淘汰策略

    1)voltile-lru:从已设置过期时间的数据集(server.db[i].expires)中挑选最近最少使用的数据淘汰
    2)volatile-ttl:从已设置过期时间的数据集(server.db[i].expires)中挑选将要过期的数据淘汰
    3)volatile-random:从已设置过期时间的数据集(server.db[i].expires)中任意选择数据淘汰
    4)allkeys-lru:从数据集(server.db[i].dict)中挑选最近最少使用的数据淘汰
    5)allkeys-random:从数据集(server.db[i].dict)中任意选择数据淘汰
    6)no-enviction(驱逐):禁止驱逐数据

    解析

    使用淘汰策略是可以把上面的问题暂时顶过去,但是会出现一系列的问题。
    1.内存是腾出来了,但是这样缓存在其中的数据却出去了,万一我需要再次调用缓存中的数据又怎么解决?
    2.前段时间没有访问的,现在火起来了,我的缓存中没有,一下压力进入DB怎么办?
    3.使用上面的解决方式,会暴露出问题也是没办法的,毕竟鱼和熊掌不可兼得。我们得先解决当下的问题不是。上面会总结出一个词语缓存命中率

    1. 什么事缓存命中率?
      1)命中率就是缓存里可以查询到的记录数除以数据库里的总记录数。命中率越低性能越高,反之越差。(大白话就是直接去数据库查询而不走缓存,这样就增大了数据库的压力,查询到数据库中的值以后再存入缓存中。)
      命中率低下的原因也有很多,例如:
      1.内存不足,淘汰掉了;
      2.缓存服务器宕机;
    展开全文
  • Redis 缓存更新策略

    2020-03-30 18:19:19
    Redis缓存设计 一、缓存的收益与成本 1.1 收益 加速读写:因为缓存通常都是全内存的(例如Redis、Memcache),而存储层通常读写性能不够强悍(例如MySQL),内存读写的速度远远高于磁盘I/O。通过缓存的使用可以...
  • redis淘汰策略

    千次阅读 2020-09-21 08:10:33
    1淘汰策略的原因 在 redis 中,允许用户设置最大使用内存大小 server.maxmemory,在内存限定的情况...redis 提供 6种数据淘汰策略: volatile-lru:从设置了过期时间的数据集中,选择最近最久未使用的数据释放; a.
  • Redis——Redis删除策略和发布订阅

    千次阅读 2021-04-18 18:30:43
    Redis删除策略过期数据Redis中的数据特征时效性数据的存储结构数据删除策略定时删除惰性删除定期删除删除策略对比逐出算法新数据进入检测影响数据逐出的相关配置 过期数据 曾经设置过有效期的数据,到达了有效期,却...
  • Redis过期策略

    2021-03-12 09:39:06
    下面来谈谈Redis的两种删除策略。 两种删除策略 定时删除(集中处理) Redis会将每个设置了过期时间的key放入到一个独立的字典中,定时遍历这个字典来删除到期的key。 Redis默认每秒进行十次过期扫描,过期扫描不会...
  • Redis 过期策略

    千次阅读 2018-01-23 23:33:45
    redis设置过期时间 expire key time(以秒为单位)–这是最常用的方式 setex(String key, int seconds, String value)–字符串独有的方式 除了字符串自己独有设置过期时间的方法外,其他方法都需要依靠expire...
  • Redis是基于内存操作的非关系型数据库,Redis中提供了多种内存回收策略,当内存容量不足时,为了保证程序的运行,这时就不得不淘汰内存中的一些对象,释放这些对象占用的空间,那么选择淘汰哪些对象呢? Redis的...
  • redis缓存更新策略

    千次阅读 2018-09-10 08:21:30
    (1)LRU(最近最少使用 首先淘汰最长时间未被使用的页面)/LFU(最近不常用 淘汰一定时间内不常使用的页面)/FIFO(先进先出)算法的剔除:例如maxmemory-policy ...(3)主动更新:开发控制生命周期 使用建议: ...
  • redis删除策略

    千次阅读 2020-10-16 21:05:50
    定时删除:当键达到过期时间时,立即执行对键的删除操作 惰性删除:放任键过期不管,但在每次从键空间获取键时,都检查取得的键是否过期,如果过期的话,就删除该键, 定期删除:每隔一点时间,程序就对数据库进行...
  • redis缓存策略

    千次阅读 2020-10-17 10:15:11
    Cache-Aside Read-Through Write-Through Write-Behind
  • 本文大概讲一下redis六种淘汰策略 一、六种淘汰策略 1.noeviction(默认策略):对于写请求不再提供服务,直接返回错误(DEL请求和部分特殊请求除外) 2.allkeys-lru:从所有key中使用LRU算法进行淘汰 3.volatile-...
  • redis容灾策略

    千次阅读 2016-05-10 08:44:44
    基本的redis的容灾策略为: 1 采用master-slave方式 2 为了得到好的读写性能,master不做任何的持久化 3 slave同时开启Snapshot和AOF来进行持久化,保证数据的安全性 4 当master挂掉后,修改slave为master 5 ...
  • 一.前言 随着Redis越来越被广泛运用,在实际使用过程中,难免会遇到内存空间存储瓶颈,当Redis内存超出物理内存限制时,内存数据就会与磁盘产生频繁交换,使Redis性能急剧下降,因为内存满了,...建立缓存过期策略 ...
  • redis安全策略

    2017-02-24 14:57:28
    1,配置bind选项,限定可以连接Redis服务器的IP,修改Redis的默认端口;建议使用防火墙配置 关闭有风险的指令 rename-command FLUSHALL "" rename-command FLUSHDB "" rename-command ...
  • Redis 淘汰策略

    千次阅读 2019-05-30 13:19:58
    volatile-lru:从已设置过期时间的数据集(server. db[i]. expires)中挑选最近最少使用的数据淘汰。 volatile-ttl:从已设置过期时间的数据集(server. db[i].... ... volatile-random:从已设置过期时间的数据集...
  • redis过期策略及定期策略配置

    千次阅读 2019-06-26 16:45:29
    redis服务器实际使用的过期键删除策略有两种: 定期删除 惰性删除 redis 会将每个设置了过期时间的 key 放入到一个独立的字典中,以后会定时遍历这个字典来删除到期的 key。除了定时遍历之外,它还会使用惰性策略...
  • Redis过期策略以及内存淘汰机制

    万次阅读 多人点赞 2018-06-21 18:28:59
    如果你的 Redis 只能存10G数据,你写了12G,那么 Redis 会怎么淘汰那2G数据呢? 过期键删除策略 我们都知道,删除键的目的,就是释放内存占用。那么,当一个键过期了,Redis 什么时候会去删除她呢? 定时...
  • redis 置换策略

    千次阅读 2016-03-17 11:45:20
    noeviction : 不进行置换,表示即使内存达到上限也不进行置换,所有能引起内存增加的命令都会返回error allkeys-lru : 优先删除掉最近最不经常使用的key,...可以参考官方文档:http://redis.io/topics/lru-cache
  • Redis过期策略 实现原理

    万次阅读 2017-02-08 17:32:30
    当我们设置了过期时间,redis是如何判断是否过期,以及根据什么策略来进行删除的。 1.redis设置过期时间:  expire key time(以秒为单位)--这是最常用的方式  setex(String key, int seconds, String value)-...
  • redis缓存策略小结

    2019-01-04 09:48:27
    比较常用的缓存策略,同样这也是facebook的缓存策略:  1. 读:应用程序从cache中取数据,取到后返回。  2. 读:应用程序先从cache取数据,没有得到,则从数据库中取数据,成功后...比如(1)“先更新redis,然后...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 126,119
精华内容 50,447
关键字:

redis更新策略

redis 订阅