3.redis淘汰策略和事务.md 3.1 KB

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

当数据达到限定大小后,会选择配置的策略淘汰数据

比如:maxmemory 300mb。

通过配置 设置Redis的淘汰策略。

比如:maxmemory-policy volatile-lru

image-20220519161138514

Redis中的自动过期机制

实现需求:处理订单过期自动取消,比如下单30分钟未支付自动更改订单状态

实现方案1:

  1. 使用Redis Key自动过期出发事件通知
原理:
1. 创建订单的时候绑定一个订单的token, 存放在redis中(有效期30分钟)
2. key=token value就是订单id
3. 对该key绑定过期事件回调,执行回调方法:传递key
  1. 使用定时任务30分钟后检查

  2. 按照每分钟轮训检查

使用Redis Key自动过期机制

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

需要在Redis中配置:

notify-keyspace-events "Ex"

Redis事务操作

# 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队列