redis事务-pipeline-lua三者区别简单概括

文章对比了Redis中的事务、Lua脚本和Pipeline的特性。Redis事务具有原子性,但可能在部分命令失败后仍继续执行。Lua脚本提供原子性执行,适合复杂逻辑,但长时间运行会阻塞其他操作。Pipeline用于批量处理,一次性返回结果,但在执行时可能会插入其他命令。建议根据需求选择适当工具,并注意性能优化。

6.1pipeline、lua、redis事务区别以及应用场景_哔哩哔哩_bilibili

https://www.bilibili.com/video/BV1PV4y1h7Y3/

一、redis事务

原子性:

一旦提交,所有该事务里面所有的命令都会被执行,可能有些命令执行失败,但是剩下的命令依旧会被执行。

个人感觉比MySQL的原子性差了一些。

二、lua脚本

一般我会用lua脚本来代替。

官方默认lua脚本是原子性的,应该是和MySQL的原子行差不多的。

lua脚本的所有命令要么全部执行成功要么全部执行失败。

一般是做一些逻辑比较严密的处理。

阻塞其他redis操作,直到lua脚本完全执行完毕才会执行其他命令。

我认为lua可以执行批量处理

如果lua脚本执行的时间太长,那么要优化下lua脚本,因为lua会阻塞其他操作,所以说lua脚本不适合执行太长时间。

三、pipeline

1、批量处理数据,一次性返回所有结果集。就可以对这个结果集进行处理,考验处理结果集的能力。

一个pipeline的命令集被redis服务器执行的时候,有可能redis服务器会执行其他客户端传来的redis命令。

一些异常情况尽可能发生,所以说使用pipeline一般会做一些异常捕获和处理。

其他的参考以及学习:
https://blog.youkuaiyun.com/ws_please/article/details/131623599

其他类似的文章:

(108条消息) springboot+redis+mysql+quartz-通过Java操作redis的KEYS*命令获取缓存数据定时更新数据库_xin麒的博客-优快云博客

(108条消息) springboot+redis+mysql+quartz-通过Java操作jedis定时使用lua脚本获取缓存数据并更新数据库_xin麒的博客-优快云博客

(108条消息) lua脚本获取table类型-Java使用lua脚本操作redis获取zset元素的集合_xin麒的博客-优快云博客

(108条消息) springboot+redis+mysql+quartz-通过Java操作jedis使用pipeline获取缓存数据定时更新数据库_xin麒的博客-优快云博客

(108条消息) springboot+redis+mysql+quartz-通过Java操作jedis的scan命令获取缓存数据定时更新数据库_xin麒的博客-优快云博客

(108条消息) redis事务-pipeline-lua三者区别简单概括_xin麒的博客-优快云博客

### RedisLuaPipeline事务区别Redis 的上下文中,Lua 脚本、Pipeline事务(Transaction)是三种不同的机制,用于实现高效的数据操作和逻辑控制。以下是它们的具体区别和适用场景: --- #### 1. **Lua 脚本** Lua 脚本是一种直接嵌入到 Redis 的脚本语言,允许用户编写复杂的逻辑并在服务器端执行。通过将多个命令封装到一个 Lua 脚本中,Redis 可以保证脚本的原子性执行[^3]。 - **特点**: - 原子性:Lua 脚本在 Redis 中以原子方式运行,这意味着在脚本执行期间,其他客户端无法中断或修改其状态。 - 高效性:由于脚本在服务器端执行,减少了网络往返的开销。 - 复杂逻辑:可以实现比事务更复杂的逻辑,例如条件判断、循环等。 - **示例代码**: ```lua local current = tonumber(redis.call('GET', KEYS[1])) if current + ARGV[1] > tonumber(ARGV[2]) then return 0 else redis.call('INCRBY', KEYS[1], ARGV[1]) return 1 end ``` 上述脚本实现了库存秒杀的功能,确保每次调用都满足库存限制[^3]。 --- #### 2. **Pipeline(管道)** Pipeline 是一种优化机制,允许客户端一次性发送多个命令给 Redis,并在最后统一读取结果。这种方式减少了客户端与服务器之间的网络延迟[^4]。 - **特点**: - 非原子性:Pipeline 中的命令是按顺序执行的,但不具有事务的原子性。如果某个命令失败,后续命令仍会继续执行。 - 性能提升:通过减少网络往返次数,显著提高了批量操作的性能。 - 简单性:Pipeline 不涉及复杂的逻辑控制,仅用于优化命令的传输效率。 - **示例代码**: ```python import redis r = redis.Redis(host='localhost', port=6379, db=0) pipeline = r.pipeline() # 添加多个命令到 Pipeline pipeline.set('key1', 'value1') pipeline.set('key2', 'value2') pipeline.get('key1') # 执行所有命令并获取结果 results = pipeline.execute() print(results) # 输出: [True, True, b'value1'] ``` --- #### 3. **事务(Transaction)** Redis事务通过 `MULTI`、`EXEC`、`WATCH` 等命令实现,允许多个命令作为一个整体提交或回滚[^5]。 - **特点**: - 原子性:一旦事务开始执行,所有命令都会被执行,即使某些命令失败也不会中断整个事务- 条件控制:通过 `WATCH` 命令,可以在事务提交前监控某些键的变化。如果这些键被其他客户端修改,则事务会失败。 - 简单性:事务支持的基本操作有限,无法实现复杂的逻辑控制。 - **示例代码**: ```python import redis r = redis.Redis(host='localhost', port=6379, db=0) # 开始事务 pipe = r.pipeline() pipe.watch('key1') current_value = int(r.get('key1') or 0) if current_value < 10: pipe.multi() pipe.incr('key1') pipe.incr('key2') pipe.execute() else: pipe.unwatch() ``` --- ### 对比总结 | 特性 | Lua 脚本 | Pipeline | 事务 | |------------------|-----------------------------|--------------------------|------------------------------| | **原子性** | 是 | 否 | 是 | | **复杂逻辑** | 支持 | 不支持 | 不支持 | | **性能优化** | 减少网络往返 | 减少网络往返 | 无明显优化 | | **错误处理** | 脚本失败时停止执行 | 单个命令失败不影响其他 | 事务失败时全部不执行 | --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值