精华内容
下载资源
问答
  • Redis缓存过期策略

    2018-11-14 20:56:34
    设置缓存过期策略,有6种选择:(LRU算法最近最少使用) volatile-lru:使用LRU算法移除key,只对设置了过期时间的key; allkeys-lru:使用LRU算法移除key,作用对象所有key; volatile-random:在过期集合key中随机...

    设置缓存过期策略,有6种选择:(LRU算法最近最少使用)

    volatile-lru:使用LRU算法移除key,只对设置了过期时间的key;

    allkeys-lru:使用LRU算法移除key,作用对象所有key;

    volatile-random:在过期集合key中随机移除key,只对设置了过期时间的key;

    allkeys-random:随机移除key,作用对象为所有key;

    volarile-ttl:移除哪些ttl值最小即最近要过期的key;

    noeviction:永不过期,针对写操作,会返回错误信息。

    展开全文
  • redis缓存过期策略与内存淘汰机制redis缓存过期策略redis内存淘汰机制开启内存淘汰机制如何选择淘汰策略 redis缓存过期策略 在设置了expire的key缓存过期了,但是服务器的内存还是被占用,不会被立即被释放,这是...

    redis缓存过期策略

    在设置了expire的key缓存过期了,但是服务器的内存还是被占用,不会被立即被释放,这是因为redis所基于的两种删除策略。

    1. (主动)定时删除
      定时随机的检查过期的KEY,如果过期则清理删除,释放被占用的内存。(每秒检查的次数在redis.cof中的hz配置)
    2. (被动)惰性删除
      当客户端请求一个已经过期的key的时候,那么reids会检查这个key是否过期,如果过期了,则删除,然后返回一个null。这种策略对CPU比较友好,不会有太多的损耗,但是内存占用会比较高。虽然key过期了,但是只要没有被redis清理,那么其实内存还是会被占用。

    redis内存淘汰机制

    结合定期删除+惰性删除 Redis 实现了key的过期时间机制,但还是会有一些key会没有被定期删除掉,也没有被查询,就遗留在了内存中,当数据量大到一定程度后,会导致内存的堆积。这就涉及到了内存淘汰机制。

    • volatile-lru -> 在设置了expire过期的缓存中,清除最少使用的旧缓存,然后保存新的缓存
    • allkeys-lru -> 清除最近最少使用的数据,基于访问时间(推荐使用)
    • volatile-lfu -> 在设置了expire过期的缓存中,清除最近最少使用的数据,基于访问时间
    • allkeys-lfu ->清除最不经常使用的数据,基于访问次数
    • volatile-random -> 在设置了expire过期的缓存中,清除最不经常使用的数据,基于访问次数
    • allkeys-random ->随机删除一些缓存
    • volatile-ttl -> 在那些设置了expire过期时间的缓存中,根据过期时间的先后顺序进行删除
    • noeviction -> 旧缓存永不过期,新缓存设置不了,返回错误

    备注:
    LRU(Least Recently Used) : 淘汰最近最少使用的数据,基于访问时间;
    LFU(Least Frequently Used): 淘汰最不经常使用的数据,基于访问次数;

    开启内存淘汰机制

    在redis.conf中

    • 配置 maxmemory ,设置Redis的最大内存空间,当内存已使用率到达,则开始清理缓存;
    • 配置maxmemory-policy noeviction,设置淘汰策略,默认为 noeviction;

    如何选择淘汰策略

    1. allkeys-lru 和 allkeys-lfu 适用于存在热点数据的情况。明确有一部分数据访问频率较高,其余数据访问频率较低或者无法预测使用频率。
    2. allkeys-random 适用于所有数据访问概率大致相等。
    3. volatile-ttl 根据过期时间的先后顺序进行删除。
    4. volatile-lru ,volatile-lru 和volatile-random 适用于希望一些数据能被保存,则可以从设置了过期时间的数据中进行删除。
    5. 至于LRU与LFU的选择,则需要根据业务权衡到底是选择 淘汰最近最少使用(LRU) 还是选择最不经常使用(LFU)。

    总的来说,无论是 LRU LFU TTL 还是Random 都是几近算法来实现的,在可靠性和性能上做了一定的平衡。还是应该在业务中主动删除没有价值的数据,或者更新某些key的过期时间等来提高Redis的性能和空间,不能过分依赖于淘汰策略。

    展开全文
  • redis缓存过期策略,监听redis缓存

    千次阅读 2018-12-28 15:56:16
    redis缓存中的缓存过期了,但是还需要用到他,然而如果设置缓存为永不过期的话,数据会越堆越多,严重占用空间。所以需要对过期缓存进行监听。在缓存过期的时候进行处理。如果还需要用到就重新加载缓存,用不到了...

    场景:​​​​​​

    redis缓存中的缓存过期了,但是还需要用到他,然而如果设置缓存为永不过期的话,数据会越堆越多,严重占用空间。所以需要对过期缓存进行监听。在缓存过期的时候进行处理。如果还需要用到就重新加载缓存,用不到了可以不用处理。解决了有用缓存过期的尴尬,又不会造成数据堆积。

    过期事件通过Redis的订阅与发布功能(pub/sub)来进行分发。

    配置文件

    而对超时的监听呢,并不需要自己发布,只有修改配置文件redis.conf中的:notify-keyspace-events Ex,默认为notify-keyspace-events "" 

    # K    键空间通知,以__keyspace@<db>__为前缀
    # E    键事件通知,以__keysevent@<db>__为前缀
    # g    del , expipre , rename 等类型无关的通用命令的通知, ...
    # $    String命令
    # l    List命令
    # s    Set命令
    # h    Hash命令
    # z    有序集合命令
    # x    过期事件(每次key过期时生成)
    # e    驱逐事件(当key在内存满了被清除时生成)
    # A    g$lshzxe的别名,因此”AKE”意味着所有的事件
     

    监听器:

    package connect.listen;
    
    import org.springframework.data.redis.connection.MessageListener;
    import org.springframework.data.redis.listener.KeyExpirationEventMessageListener;
    import org.springframework.data.redis.listener.PatternTopic;
    import org.springframework.data.redis.listener.RedisMessageListenerContainer;
    import org.springframework.data.redis.listener.Topic;
    
    /**
     * @author wm
     */
    public class KeyExpirationEvent5MessageListener extends KeyExpirationEventMessageListener {
    
    
        private static final Topic KEYEVENT5_EXPIRED_TOPIC = new PatternTopic("__keyevent@*__:expired");
    
        /**
         * Creates new {@link MessageListener} for {@code __keyevent@*__:expired} messages.
         *
         * @param listenerContainer must not be {@literal null}.
         */
        public KeyExpirationEvent5MessageListener(RedisMessageListenerContainer listenerContainer) {
            super(listenerContainer);
        }
    
        @Override
        public void doRegister(RedisMessageListenerContainer listenerContainer) {
            listenerContainer.addMessageListener(this, KEYEVENT5_EXPIRED_TOPIC);
        }
    }
    
    过期监听的管道默认是__keyevent@0__:expired,@后面的0表示第几个数据库,redis默认的数据库是0~15一共16个数据库,根据需求修改@后的数字。expired监听过期redis,可以换成*,监听所有。

    配置bean:

       @Bean
        public RedisMessageListenerContainer container(JedisConnectionFactory jedisConnectionFactory, ApplicationContext context) {
            RedisMessageListenerContainer container = new RedisMessageListenerContainer();
            container.setConnectionFactory(jedisConnectionFactory);
            KeyExpirationEvent5MessageListener listener = new KeyExpirationEvent5MessageListener(container);
            listener.doRegister(container);
            listener.setApplicationEventPublisher(context);
            return container;
        }

    监听:

    @EventListener(classes = RedisKeyExpiredEvent.class)
        @Override
        public void event(RedisKeyExpiredEvent event) {
            String expiredKey = new String(event.getSource());
            System.out.println(expiredKey);
            //expiredKey监听到的过期redis,根据业务要求进行操作
    }

    启动项目就可以监听redis了。

     

    本人菜鸟一只,如有大佬发现错误或有更好的方法,跪请不吝赐教!!!
     

     

    展开全文
  • redis缓存中的缓存过期了,但是还需要用到他,然而如果设置缓存为永不过期的话,数据会越堆越多,严重占用空间。所以需要对过期缓存进行监听。在缓存过期的时候进行处理。如果还需要用到就重新加载缓存,用不到了...

    https://blog.csdn.net/weixin_41497481/article/details/85322794

     

    场景:​​​​​​

    redis缓存中的缓存过期了,但是还需要用到他,然而如果设置缓存为永不过期的话,数据会越堆越多,严重占用空间。所以需要对过期缓存进行监听。在缓存过期的时候进行处理。如果还需要用到就重新加载缓存,用不到了可以不用处理。解决了有用缓存过期的尴尬,又不会造成数据堆积。

    过期事件通过Redis的订阅与发布功能(pub/sub)来进行分发。

    配置文件

    而对超时的监听呢,并不需要自己发布,只有修改配置文件redis.conf中的:notify-keyspace-events Ex,默认为notify-keyspace-events "" 

    # K    键空间通知,以__keyspace@<db>__为前缀
    # E    键事件通知,以__keysevent@<db>__为前缀
    # g    del , expipre , rename 等类型无关的通用命令的通知, ...
    # $    String命令
    # l    List命令
    # s    Set命令
    # h    Hash命令
    # z    有序集合命令
    # x    过期事件(每次key过期时生成)
    # e    驱逐事件(当key在内存满了被清除时生成)
    # A    g$lshzxe的别名,因此”AKE”意味着所有的事件
     

    监听器:

    
     
    1. package connect.listen;

    2.  
    3. import org.springframework.data.redis.connection.MessageListener;

    4. import org.springframework.data.redis.listener.KeyExpirationEventMessageListener;

    5. import org.springframework.data.redis.listener.PatternTopic;

    6. import org.springframework.data.redis.listener.RedisMessageListenerContainer;

    7. import org.springframework.data.redis.listener.Topic;

    8.  
    9. /**

    10. * @author wm

    11. */

    12. public class KeyExpirationEvent5MessageListener extends KeyExpirationEventMessageListener {

    13.  
    14.  
    15. private static final Topic KEYEVENT5_EXPIRED_TOPIC = new PatternTopic("__keyevent@*__:expired");

    16.  
    17. /**

    18. * Creates new {@link MessageListener} for {@code __keyevent@*__:expired} messages.

    19. *

    20. * @param listenerContainer must not be {@literal null}.

    21. */

    22. public KeyExpirationEvent5MessageListener(RedisMessageListenerContainer listenerContainer) {

    23. super(listenerContainer);

    24. }

    25.  
    26. @Override

    27. public void doRegister(RedisMessageListenerContainer listenerContainer) {

    28. listenerContainer.addMessageListener(this, KEYEVENT5_EXPIRED_TOPIC);

    29. }

    30. }

    过期监听的管道默认是__keyevent@0__:expired,@后面的0表示第几个数据库,redis默认的数据库是0~15一共16个数据库,根据需求修改@后的数字。expired监听过期redis,可以换成*,监听所有。

    配置bean:

    
     
    1. @Bean

    2. public RedisMessageListenerContainer container(JedisConnectionFactory jedisConnectionFactory, ApplicationContext context) {

    3. RedisMessageListenerContainer container = new RedisMessageListenerContainer();

    4. container.setConnectionFactory(jedisConnectionFactory);

    5. KeyExpirationEvent5MessageListener listener = new KeyExpirationEvent5MessageListener(container);

    6. listener.doRegister(container);

    7. listener.setApplicationEventPublisher(context);

    8. return container;

    9. }

    监听:

    
     
    1. @EventListener(classes = RedisKeyExpiredEvent.class)

    2. @Override

    3. public void event(RedisKeyExpiredEvent event) {

    4. String expiredKey = new String(event.getSource());

    5. System.out.println(expiredKey);

    6. //expiredKey监听到的过期redis,根据业务要求进行操作

    7. }

    启动项目就可以监听redis了。

    展开全文
  • Redis缓存过期策略通常有三种: 一、定时过期 每个设置过期时间的key都需要创建一个定时器,到过期时间就会立即清除。 优点:该策略可以立即清除过期的数据,对内存很友好; 缺点:若过期key很多,删除这些key会会...
  • 设置了expire的key缓存过期了,但是服务器的内存还是会被占用,这是因为redis所基于的两种删除策略redis有两种策略: (主动)定时删除 定时随机的检查过期的key,如果过期则清理删除。(每秒检查次数在redis....
  • 缓存过期淘汰策略 从配置文件中看有8种 默认 三种不同删除策略 定时删除 总结: 惰性删除 总结 定期删除 内存淘汰策略 记忆图,第二种最长使用 最近最少使用,频率最少使用 配置文件设置: ...
  • Redis缓存过期策略 Redis是key-value数据库,我们可以设置Redis中缓存的key的过期时间。Redis的过期策略就是指当Redis中缓存的key过期了,Redis如何处理。 过期策略通常有以下三种: 定时过期:每个设置过期时间的...
  • Redis缓存过期,更新策略

    千次阅读 2018-04-08 21:56:49
    Redis缓存过期,更新策略 这是Redis系列第三篇,前两篇分别是 1. Linux(Ubuntu16.04)下redis的安装,helloworld及读懂配置文件 https://blog.csdn.net/qq_36521579/article/details/796850974 2. Redis集群...
  • 问题4:redis缓存淘汰策略? 问题5:redis的LRu了解过吗?可否手写一个LRu算法? redis默认内存多少?在哪里查看? 如何设置修改? 查看Redis最大占用内存 打开redis配置文件,设置maxmemory参数,maxmemory是...
  • Redis缓存过期和淘汰策略

    千次阅读 2020-07-22 10:07:36
    Redis缓存过期和淘汰策略 Redis性能高: 官方数据 读:110000次/s 写:81000次/s 长期使用,key会不断增加,Redis作为缓存使用,物理内存也会满。内存与硬盘交换(swap) 虚拟内存 ,频繁IO 性能急剧下降 一、...
  • 1.如何产科redis的最大占用内存? 打开redis配置文件,设置maxmemory参数,maxmemory单位是bytes字节类型,注意单位转换 如果不设置最大内存大小或者设置最大内存大小为0,在64位操作系统下不限制内存大小,在32位...
  • Redis缓存过期策略 redis对于过期策略中,有以下几种设置策略(可以在配置文件中查看 maxmemory-policy 内容): volitale lru: 使用LRU算法移除key,只对设置了过期时间的key有效(redis中默认的过期策略) all...
  • 缓存过期和淘汰策略 Redis性能高: 官方数据 读:110000次/s 写:81000次/s 长期使用,key会不断增加,Redis作为缓存使用,物理内存也会满 内存与硬盘交换(swap) 虚拟内存 ,频繁IO 性能急剧下降 maxmemory 不设置...
  • 一、前言 - 有效期 Redis作为当前最常用的开源内存数据库,性能十分高...二、Redis过期策略 过期策略有以下三种: 1. 定时过期 每个设置过期时间的key都需要创建一个定时器,到过期时间就会立即清除。该策略可以...
  • Redis缓存淘汰策略

    千次阅读 2020-04-16 15:55:17
    Redis缓存淘汰策略:永不回收策略(默认):保证已有的数据不丢失。 noeviction # 不删除策略, 达到最大内存限制时, 如果需要更多内存, 直接返回错误信息。 volatile策略:只会对带过期时间的key进行淘汰。 ...
  • Redis缓存过期淘汰机制 在我们对于存储的数据设置过期时间后,Redis会帮我们淘汰掉这些数据。 由于数据量可能比较大,我们如果需要扫描整个Redis存储的数据,会比较耗费时间。 所以,Redis采用的策略是: 定期删除...
  • Redis内存淘汰机制 ...Redis过期策略 Redis过期策略有三种方式: 定时删除 含义:在设置key的过期时间的同时,为该key创建一个定时器,让定时器在key的过期时间来临时,对key进行删除 优点:保...
  • Redis内存过期策略

    2018-09-18 08:28:34
    Redis内存过期策略Redis的内存回收机制,相关配置项
  • 一、redis过期策略redis过期策略是:定期删除+惰性删除 redis在存储数据时,可能会设置过期时间,而所谓的定期删除,指的是redis默认是每隔100ms就随机抽取一些设置了过期时间的key进行检查,如果过期了就...
  • 1、redis缓存过期机制 Redis可以通过设置一个过期时间expire来处理缓存,Redis删除过期缓存有两种方法: 定期删除:Redis会随机抽查key,如果过期则删除,默认配置为1秒10次,也可以提高频率,但是频率越高,cpu...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 35,802
精华内容 14,320
关键字:

redis缓存过期策略

redis 订阅