#### redis 事务/lua脚本/pipeline ####

事务

以下是一个事务的例子, 它先以 MULTI 开始一个事务, 然后将多个命令入队到事务中, 最后由 EXEC 命令触发事务, 一并执行事务中的所有命令:

redis 127.0.0.1:6379> MULTI
OK

redis 127.0.0.1:6379> SET book-name "Mastering C++ in 21 days"
QUEUED

redis 127.0.0.1:6379> GET book-name
QUEUED

redis 127.0.0.1:6379> SADD tag "C++" "Programming" "Mastering Series"
QUEUED

redis 127.0.0.1:6379> SMEMBERS tag
QUEUED

redis 127.0.0.1:6379> EXEC
1) OK
2) "Mastering C++ in 21 days"
3) (integer) 3
4) 1) "Mastering Series"
   2) "C++"
   3) "Programming"

(1)Redis事务 支持隔离性

Redis实现事务的隔离性,需要通过watch命令来支持事务隔离性。Watch的原理是,在事务执行前,监控一个或者多个键的变化时,当事务调用EXEC命令执行时,WATCH机制会先检查监控的键是否被其它客户端修改了。如果修改了监听的值,就放弃事务执行,避免事务的隔离性被破坏。

Watch的用法

Redis Watch 命令用于监视一个(或多个) key ,如果在事务执行之前这个(或这些) key 被其他命令所改动,那么事务将被打断。

redis Watch 命令基本语法:WATCH key [key ...]

实例:

redis> WATCH lock lock_times
OK

(2)Redis事务 分情况支持原子性

  • 情况一:执行事务在入队时就报错,那么Redis会放弃事务执行,从而保证事务原子性。
  • 情况二:命令在入队时没报错,但是实际执行时却报错,无法保证事务原子性。

(3)Redis事务 支持一致性

(4)Redis事务 不支持持久性

Redis的事务无法支持持久性,如果Redis使用了RDB模式,一个事务执行后,当下一次的RDB快照还未执行前,Redis发生了实例宕机,那么这种情况下,事务修改的数据是无法保证持久化的,如果Redis采用AOF模式,如论持久化配置为no、everysec和always都可能会存在数据丢失,所以,不管 Redis采用那种持久化模式,事务的持久性都无法支持。

(摘自 https://juejin.cn/post/7125820336104275982)

lua脚本

支持原子操作(指的是中间不会被其他请求插入)。Redis会将整个脚本作为一个整体执行,中间不会被其他请求插入。因此在脚本运行过程中无需担心会出现竞态条件,无需使用事务。

流程控制。例如:得到key=age1的数据,如果该数据存在且该数据为100,那么删掉该数据,否则不做操作。这类就只有使用lua。

减少网络开销。可以将多个请求通过脚本的形式一次发送,减少网络时延。

复用。客户端发送的脚本会永久存在redis中,这样其他客户端可以复用这一脚本,而不需要使用代码完成相同的逻辑。

pipeline

仅为多个命令可以只用一次网络读写。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Lua脚本是一种轻量级的脚本语言,常用于嵌入式系统和游戏开发中。它具有以下特点: 1. 简洁高效:Lua脚本语法简单,学习曲线低,执行速度快。 2. 可扩展性:Lua支持通过C/C++扩展其功能,可以方便地与其他语言进行交互。 3. 跨平台性:Lua脚本可以在多个操作系统上运行,包括Windows、Linux、Mac等。 管道(Pipeline)是一种用于在Redis数据库中执行多个命令的机制。它的优点包括: 1. 减少网络开销:通过将多个命令打包发送到Redis服务器,减少了网络通信的开销。 2. 原子性操作:Redis的管道可以保证多个命令的原子性执行,避免了并发操作带来的问题。 3. 提高性能:通过批量执行多个命令,可以提高Redis的性能。 事务(Transaction)是Redis中用于执行一系列命令的机制,它的优点包括: 1. 原子性操作:Redis事务可以保证一系列命令的原子性执行,要么全部执行成功,要么全部失败。 2. 高效性能:事务中的命令在提交之前不会立即执行,而是在提交时一次性执行,减少了网络通信的开销。 3. 锁定资源:在事务执行期间,Redis会对相关资源进行锁定,避免了其他客户端对同一资源的并发访问。 然而,管道和事务也存在一些缺点: 1. 管道的原子性:虽然管道可以批量执行多个命令,但无法保证这些命令的原子性执行,如果其中某个命令执行失败,后续命令可能会继续执行。 2. 事务的回滚:虽然事务可以保证一系列命令的原子性执行,但如果在事务执行过程中出现错误,整个事务会被回滚,导致之前执行的命令无效。 3. 网络延迟:由于管道和事务需要将多个命令打包发送到Redis服务器,如果网络延迟较高,可能会导致整体性能下降。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值