## Redis内存淘汰策略 将Redis用作缓存时,如果内存空间用满,就会自动驱逐老的数据。 ### Redis六种淘汰策略 - `noeviction`:当内存使用达到阈值的时候,执行命令直接报错 - `allkeys-lru`:在所有的key中,优先移除最近未使用的key。(推荐) - `volatile-lru`:在设置了过期时间的键空间中,优先移除最近未使用的key。 - `allkeys-random`:在所有的key中,随机移除某个key。 - `volatile-random`:在设置了过期时间的键空间中,随机移除某个key。 - `volatile-ttl`:在设置了过期时间的键空间中,具有更早过期时间的key优先移除。 ### 如何配置Redis淘汰策略 在redis.conf文件中, 设置Redis 内存大小的限制,我们可以设置maxmemory , ![image-20220519161122696](assets/image-20220519161122696.png) 当数据达到限定大小后,会选择配置的策略淘汰数据 比如:maxmemory 300mb。 通过配置 设置Redis的淘汰策略。 比如:maxmemory-policy volatile-lru ![image-20220519161138514](assets/image-20220519161138514.png) ## Redis中的自动过期机制 实现需求:处理订单过期自动取消,比如下单30分钟未支付自动更改订单状态 实现方案1: 1. 使用Redis Key自动过期出发事件通知 ```shell 原理: 1. 创建订单的时候绑定一个订单的token, 存放在redis中(有效期30分钟) 2. key=token value就是订单id 3. 对该key绑定过期事件回调,执行回调方法:传递key ``` 2. 使用定时任务30分钟后检查 3. 按照每分钟轮训检查 ### 使用Redis Key自动过期机制 当我们的key失效时,可以执行我们的客户端回调监听的方法。 需要在Redis中配置: ```shell notify-keyspace-events "Ex" ``` ## Redis事务操作 ```shell # watch 可以监听一个或者多个key,在提交事务之前是否有发生了变化 如果发生边了变化就不会提交事务,没有发生变化才可以提交事务 版本号码 乐观锁 watch name # Multi开启事务 multi set name xiaoxiao # EXEC提交事务 exec # 取消提交事务 Discard ``` > 注意:Redis官方是没有提供回滚方法,值提供了取消事务。 > > Redis中本身就是单线程的能够保证线程安全问题。 ## 思考:Redis与Mysql中的事务有那些区别? **mysql:** * mysql实现事务,是基于undo/redo日志 * undo记录修改前状态,rollback基于undo日志实现 * redo记录修改后的状态,commit基于redo日志实现 * 在mysql中无论是否开启事务,sql都会被立即执行并返回执行结果,只是事务开启后执行后的状态只是记录在redo日志,执行commit之后,数据才会被写入磁盘 **redis:** * redis实现事务,是基于commands队列 * 如果没有开启事务,command将会被立即执行并返回执行结果,并且直接写入磁盘 * 如果事务开启,command不会被立即执行,而是排入队列,并返回排队状态(具体依赖于客户端(例如:spring-data-redis)自身实现)。调用exec才会执行commands队列