Redis深入了解内存淘汰与事务操作

目录
  • Redis内存淘汰策略
    • 六种淘汰策略
    • Redis中的自动过期机制
  • Redis中的事务操作
    • watch和Multi的区别

Redis内存淘汰策略

为什么要有淘汰策略?

答:将Redis用作缓存时,Redis数据存在内存中,如果内存空间用满,就会自动驱逐老的数据。

redis配置文件:可以配置redis存放数据的阈值(例如:100mb),再配置淘汰策略。

六种淘汰策略

  • noeviction:当内存使用达到阈值的时候,所有引起申请内存的命令会报错。
  • allkeys-lru:在主键空间中,优先移除最近未使用的key。(推荐)
  • volatile-lru:在设置了过期时间的键空间中,优先移除最近未使用的key。
  • allkeys-random:在主键空间中,随机移除某个key。
  • volatile-random:在设置了过期时间的键空间中,随机移除某个key。
  • volatile-ttl:在设置了过期时间的键空间中,具有更早过期时间的key优先移除。

如何配置淘汰策略?

在redis.conf文件中, 设置Redis 内存大小的限制,我们可以设置maxmemory ,当数据达到限定大小后,会选择配置的策略淘汰数据。

比如:maxmemory 300mb。

通过配置 maxmemory-policy 设置Redis的淘汰策略。比如:maxmemory-policy volatile-lru

Redis中的自动过期机制

首先需要配置redis配置文件,开启 key 失效监听。

当key失效时,可以执行我们的客户端回调监听的方法。

需要在Redis中配置:notify-keyspace-events “Ex”

代码在之前的基础上增加:Springboot整合key失效监听

RedisListenerConfig 配置类

@Configuration
public class RedisListenerConfig {
    @Bean
    RedisMessageListenerContainer container(RedisConnectionFactory connectionFactory) {
        RedisMessageListenerContainer container = new RedisMessageListenerContainer();
        container.setConnectionFactory(connectionFactory);
        return container;
    }
}

监听 key 的类

@Component
public class RedisKeyExpirationListener extends KeyExpirationEventMessageListener {
    public RedisKeyExpirationListener(RedisMessageListenerContainer listenerContainer) {
        super(listenerContainer);
    }
    @Override
    public void onMessage(Message message, byte[] pattern) {
        String expiraKey = message.toString();
        System.out.println("失效的key:" + expiraKey);
    }
}

注意:如果是多个springboot项目或者多个 jvm 服务监听同一个key的话,每一个 jvm 都会监听到这个key失效并且执行相应的逻辑代码。

多服务(jvm)监听Redis key失效通知,如何保证只有一个jvm是执行监听的代码?

答:可以使用 zookeeper 的选举机制,多个服务注册到zookeeper中,选举出一个leader,由为 leader 的jvm来执行监听代码。

Redis中的事务操作

  • Multi 开启事务
  • EXEC 提交事务
  • Watch 可以监听一个或者多个key,在提交事务之前是否有发生了变化 如果发生边了变化就不会提交事务,没有发生变化才可以提交事务 版本号码 乐观锁
  • Discard 取消提交事务

注意:Redis官方是没有提供回滚方法,只提供了取消事务。

Redis中本身就是单线程的能够保证线程安全问题,不需要考虑线程安全问题。

取消事务跟回滚有什么区别呢?为什么redis不支持回滚事务?

Mysql中开启了事务,对该行数据上行锁—,Commit 数据可以提交

回滚:对事务取消和行锁都会撤销

Redis没有回滚事务的概念,单纯取消事务(不提交事务) 不上锁

watch和Multi的区别

Watch相当于乐观锁,在事务提交之前没有发生变化才可以提交事务。

Multi 就是开启事务,操作数据之后可以提交事务或者取消提交事务。

到此这篇关于Redis深入了解内存淘汰与事务操作的文章就介绍到这了,更多相关Redis内存淘汰与事务操作内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 浅谈Redis中的内存淘汰策略和过期键删除策略

    目录 8种淘汰策略 过期键的删除策略 总结 redis是我们现在最常用的一个工具,帮助我们建设系统的高可用,高性能. 而且我们都知道redis是一个完全基于内存的工具,这也是redis速度快的一个原因,当我们往redis中不断缓存数据的时候,其内存总有满的时候(而且内存是很贵的东西,尽量省着点用),所以尽可能把有用的数据,或者使用频繁的数据缓存在redis中,物尽其用. 那么如果正在使用的redis内存用完了,我们应该怎么取舍redis中已存在的数据和即将要存入的数据呢,我们要怎么处理呢? re

  • redis中的事务操作案例分析

    本文实例讲述了redis中的事务操作.分享给大家供大家参考,具体如下: redis与mysql的事务 Redis支持简单的事务 简单使用 讲张三的100圆钱转账给lisi: set zhangsan 800 set lisi 100 multi decrby zhangsan 100 incrby lisi 100 exec 失败的两种情况 在mutil后面的语句中, 语句出错可能有2种情况,还是以转账的情况来分析: (1)语法就有问题 127.0.0.1:6379> multi OK 127.

  • Redis 的内存淘汰策略和过期删除策略的区别

    目录 前言 过期删除策略 如何设置过期时间? 如何判定 key 已过期了? 过期删除策略有哪些? Redis 过期删除策略是什么? 内存淘汰策略 如何设置 Redis 最大运行内存? Redis 内存淘汰策略有哪些? LRU 算法和 LFU 算法有什么区别? 总结 前言 Redis 是可以对 key 设置过期时间的,因此需要有相应的机制将已过期的键值对删除,而做这个工作的就是过期键值删除策略. Redis 的「内存淘汰策略」和「过期删除策略」,很多小伙伴容易混淆,这两个机制虽然都是做删除的操作,

  • 深入理解Redis内存淘汰策略

    目录 一.内存回收 二.设置内存 三.内存淘汰策略 四.LRU 4.1 LRU算法 4.2 redis中的LRU算法 五.LFU 一.内存回收 长时间不使用的缓存 降低IO性能 物理内存不够 很多人了解了Redis的好处之后,于是把任何数据都往Redis中放,如果使用不合理很容易导致数据超过Redis的内存,这种情况会出现什么问题呢? Redis中有很多无效的缓存,这些缓存数据会降低数据IO的性能,因为不同的数据类型时间复杂度算法不同,数据越多可能会造成性能下降 随着系统的运行,redis的数据

  • 浅谈Redis 中的过期删除策略和内存淘汰机制

    目录 前言 Redis 中 key 的过期删除策略 1.定时删除 2.惰性删除 3.定期删除 Redis 中过期删除策略 从库是否会脏读主库创建的过期键 内存淘汰机制 内存淘汰触发的最大内存 有哪些内存淘汰策略 内存淘汰算法 LRU LFU 为什么数据删除后内存占用还是很高 内存碎片如何产生 碎片率的意义 如何清理内存碎片 总结 参考 前言 Redis 中的 key 设置一个过期时间,在过期时间到的时候,Redis 是如何清除这个 key 的呢? 这来分析下 Redis 中的过期删除策略和内存淘

  • Redis深入了解内存淘汰与事务操作

    目录 Redis内存淘汰策略 六种淘汰策略 Redis中的自动过期机制 Redis中的事务操作 watch和Multi的区别 Redis内存淘汰策略 为什么要有淘汰策略? 答:将Redis用作缓存时,Redis数据存在内存中,如果内存空间用满,就会自动驱逐老的数据. redis配置文件:可以配置redis存放数据的阈值(例如:100mb),再配置淘汰策略. 六种淘汰策略 noeviction:当内存使用达到阈值的时候,所有引起申请内存的命令会报错. allkeys-lru:在主键空间中,优先移除

  • 浅谈Redis缓存有哪些淘汰策略

    目录 Redis过期策略 定时删除 惰性删除 定期删除 Redis的内存淘汰机制 LRU和LFU的区别 LRU LFU Redis重启如何恢复数据呢? 总结 Redis过期策略 我们首先来了解一下Redis的内存淘汰机制. 定时删除 概述     redis默认是每隔 100ms 就随机抽取一些设置了过期时间的key,检查其是否过期,如果过期就删除.注意这里是随机抽取的.为什么要随机呢?你想一想假如 redis 存了几十万个 key ,每隔100ms就遍历所有的设置过期时间的 key 的话,就会

  • 浅谈Redis 中的过期删除策略和内存淘汰机制

    目录 前言 Redis 中 key 的过期删除策略 1.定时删除 2.惰性删除 3.定期删除 Redis 中过期删除策略 从库是否会脏读主库创建的过期键 内存淘汰机制 内存淘汰触发的最大内存 有哪些内存淘汰策略 内存淘汰算法 LRU LFU 为什么数据删除后内存占用还是很高 内存碎片如何产生 碎片率的意义 如何清理内存碎片 总结 参考 前言 Redis 中的 key 设置一个过期时间,在过期时间到的时候,Redis 是如何清除这个 key 的呢? 这来分析下 Redis 中的过期删除策略和内存淘

  • Redis过期删除策略与内存淘汰策略

    目录 过期删除策略 设置Redis中key的过期时间 (单位:秒) 常见的三种过期删除策略 Redis使用用的过期删除策略 Redis的定期删除的流程 内存淘汰策略 设置Redis最大运行内存 Redis 内存淘汰策略有哪些? LRU 算法和 LFU 算法有什么区别? Redis 是如何实现 LRU 算法的? 什么是 LFU 算法? Redis 是如何实现 LFU 算法的? 过期删除策略 过期删除策略: redis可以对key设置过期时间,因此要有相应的机制将已过期的键值对删除. 设置Redis

  • python实现redis三种cas事务操作

    cas全称是compare and set,是一种典型的事务操作. 简单的说,事务就是为了存取数据库中同一数据时不破坏操作的隔离性和原子性,从而保证数据的一致性. 一般数据库,比如MySql是如何保证数据一致性的呢,主要是加锁,悲观锁.比如在访问数据库某条数据的时候,会用SELECT FOR UPDATE ,这MySql就会对这条数据进行加锁,直到事务被提交(COMMIT),或者回滚(ROLLBACK).如果此时,有其他事务对被加锁的数据进行写入,那么该事务将会被阻塞,直到第一个事务完成为止.它

随机推荐