文章目录
😊 @ 作者:Lion J
💖 @ 主页: https://blog.csdn.net/weixin_69252724
🎉 @ 主题:Redis__事务
⏱️ @ 创作时间:2024年05月02日
————————————————
这里写目录标题
- 文章目录
- Redis事务:
- 开始Redis事务
- Redis 事务支持原子性吗?
- Redis 事务支持持久性吗?
Redis事务:
MySQL里的事务就是将多条语句看作是一个原子操作, 要么同时执行要么同时失败.
Redis事务是指将多条命令加入队列,一次批量执行多条命令,每条命令会按顺序执行,事务执行过程中不会受客户端传入的命令请求影响。
Redis事务就是一次性、顺序性、排他性的执行一个队列中的一系列命令。
既然提出来了MySQL事务, 那就看一下他和MySQL事务有什么区别:
Redis事务和关系型数据库的事务不太一样,它不保证原子性,也没有隔离级别的概念。
- Redis事务没有隔离级别的概念
批量操作在发送 EXEC 命令前被放入队列缓存,并不会被实际执行,也就不存在事务内的查询要看到事务里的更新,事务外查询不能看到。 - Redis不保证原子性
Redis中,单条命令是原子性执行的,但事务不保证原子性,且没有回滚。事务中任意命令执行失败,其余的命令仍会被执行。
在上面的例子中, Redis中的两个用户, 分别对同一个数据进行操作, 用户1 set 了name 这个值, 用户2 又对这个值进行操作, 如然后在客户1这边获取name值, 会发现不是自己设置的值, 值是用户2的值
对于这样的问题, 就提出来Redis事务
思考:
那么,我如果在用户1将他的操作作为一个整体, 有序的进行, 其他客户的命令不能插入到这个整体里, 那不就解决这个问题了吗?
确实, 是这样的
开始Redis事务
multi # 开启事务
set name jwq
get name
set name cxy
keys *
exec # 执行事务
如果你在写redis命令时候, 发现已经将错误的redis命令入队列了, 那么需要取消事务该怎么做?
discard # 取消事务
如图:
Redis相关的命令如下:
- MULTI:标识一个事务的开启,即开启事务;
- EXEC:执行事务中的所有命令,即提交;
- DISCARD:放弃事务;和回滚不一样,Redis事务不支持回滚。
- WATCH:监视Key改变,用于实现乐观锁。如果监视的Key的值改变,事务最终会执行失败。
- UNWATCH:放弃监视。
Redis 事务支持原子性吗?
Redis 事务在运行错误的情况下,除了执行过程中出现错误的命令外,其他命令都能正常执行。并且,Redis 事务是不支持回滚操作的。因此,Redis 事务其实是不满足原子性的。
Redis 事务支持持久性吗?
Redis 不同于 Memcached 的很重要一点就是,Redis 支持持久化,而且支持 3 种持久化方式:快照(snapshotting,RDB)只追加文件(append-only file, AOF)RDB 和 AOF 的混合持久化(Redis 4.0 新增)与 RDB 持久化相比,AOF 持久化的实时性更好。在 Redis 的配置文件中存在三种不同的 AOF 持久化方式( fsync策略),它们分别是:
appendfsync always #每次有数据修改发生时都会调用fsync函数同步AOF文件,fsync完成后线程返回,这样会严重降低Redis的速度
appendfsync everysec #每秒钟调用fsync函数同步一次AOF文件
appendfsync no #让操作系统决定何时进行同步,一般为30秒一次
在上一文 Reidis__持久化 有介绍到