当前位置: 首页 > wzjs >正文

做网站可能存在的问题营业推广方案

做网站可能存在的问题,营业推广方案,自己能搞定吗?,手机怎么用wordpress一文详解事务和lua脚本的区别 核心问题: 为什么 Redisson 在实现分布式锁、信号量等复杂对象时,倾向于使用 Lua 脚本,而不是 Redis 内建的事务 (MULTI/EXEC)? 结论概览: Lua 脚本为 Redisson 提供了更强的原子性保证、…

一文详解事务和lua脚本的区别

核心问题: 为什么 Redisson 在实现分布式锁、信号量等复杂对象时,倾向于使用 Lua 脚本,而不是 Redis 内建的事务 (MULTI/EXEC)?

结论概览: Lua 脚本为 Redisson 提供了更强的原子性保证、更复杂的服务器端逻辑处理能力,以及更低的通信开销,这使得实现健壮且高效的分布式对象成为可能。

Lua 脚本的执行具有原子性,这意味着:

  1. 阻塞性: 一旦一个 Lua 脚本开始执行,Redis 服务器会阻塞所有其他客户端的命令(除了 SCRIPT KILL 和 SHUTDOWN NOSAVE 等少数命令),直到该脚本执行完毕。

  2. 隔离性: 在脚本执行期间,它所操作的数据就像被“冻结”了一样,不会受到来自其他并发命令的影响。脚本看到的是它开始执行那一刻的数据快照(对于它读取的键)。

详细解释:

  1. Redis 事务 (MULTI/EXEC) 的特点与局限性:

    • 工作原理: 使用 MULTI 开始一个事务块,后续命令进入队列,直到遇到 EXEC 命令才会被服务器依次执行。WATCH 命令用于监视某些键,如果在 EXEC 执行前这些键被修改,事务将被打断 (EXEC 返回 Null Reply)。

    • 原子性: Redis 事务的原子性指的是执行原子性。一旦 EXEC 被触发,队列中的所有命令要么全部被服务器接受并执行,要么一个都不执行(如果 WATCH 的键被修改)。但它不是严格的事务原子性:如果队列中的命令本身有错误(如对字符串键执行列表操作),这些错误会在执行阶段才被发现,错误命令会失败,但队列中的其他命令仍然会执行(取决于错误类型和 Redis 版本,但与传统数据库的严格 ACID 原子性不同)。

    • 逻辑能力弱: 事务块内的命令是简单的顺序执行。无法根据前一个命令的执行结果来决定后续命令的行为(没有 if/else 分支)。复杂的逻辑判断必须在客户端完成,这意味着需要多次网络往返。

    • 通信开销: 执行一个包含复杂逻辑的事务可能需要:WATCH -> GET (客户端获取状态) -> (客户端根据状态判断) -> MULTI -> SET/INCR/... -> EXEC。至少需要 3-4 次网络往返,效率较低。

    • WATCH 的限制 WATCH 只能检测键 是否被修改,不能执行更精细的条件判断(例如,“如果键的值小于某个数”)。如果 WATCH 失败,客户端需要重试整个操作流程,增加了客户端的复杂性和潜在的竞争。

  2. Redis Lua 脚本的特点与优势:

    • 工作原理: 使用 EVAL script numkeys key [key ...] arg [arg ...] 将整个 Lua 脚本发送到 Redis 服务器执行。脚本在服务器端运行。

    • 强原子性: Lua 脚本的执行是完全原子性的。一个脚本在执行期间,不会被任何其他命令打断。脚本要么完整执行成功,要么在出错时停止,所有操作是原子的(从外部看,就像一个命令)。

    • 逻辑能力强: Lua 是一种功能完整的脚本语言,支持条件判断 (if/else)、循环 (for/while)、变量、函数调用等。这使得可以在服务器端实现复杂的业务逻辑,根据实时获取的键值进行判断和操作,无需客户端多次介入。

    • 通信开销低: 整个复杂操作的逻辑都封装在一个脚本中。客户端只需要发送一次 EVAL 命令(或使用 SCRIPT LOAD 预加载脚本后发送 EVALSHA),就可以执行整个操作。通常只需要一次网络往返(除了第一次加载脚本)。

    • 性能优势: 减少了客户端与服务器之间的频繁通信,降低了延迟,提高了吞吐量。

    • 脚本缓存: Redis 会缓存执行过的脚本,后续可以使用脚本的 SHA1 哈希值来快速执行,进一步节省带宽。

    • 服务器端执行: 逻辑在靠近数据的地方执行,避免了数据在客户端与服务器之间来回传输进行判断。

  3. Redisson 的需求与 Lua 脚本的契合:

    • Redisson 实现了分布式锁、信号量、队列、Map、Set 等复杂的分布式数据结构。

    • 这些结构的很多操作(如获取锁、释放锁、向容量受限的队列添加元素)都需要原子地执行一系列命令,并且包含复杂的条件判断(例如:锁是否存在?是我的锁吗?重入次数是多少?队列满了吗?有等待的线程吗?)。

    • 使用事务难以实现这些复杂且带条件的原子操作,或者实现起来需要非常多的客户端逻辑和重试机制,性能和健壮性都不理想。

    • 使用 Lua 脚本则完美契合了这些需求:可以将获取锁、判断锁状态、设置过期时间、增加重入次数等一系列操作封装在一个 Lua 脚本中,在服务器端原子地执行。释放锁、公平锁的排队机制、信号量的增减等同样可以高效且原子地通过 Lua 脚本实现。

总结原因:

Redisson 选择 Lua 脚本而非 Redis 事务,主要是因为 Lua 脚本提供了:

  1. 更强大的原子性保证:确保复杂的多步操作作为一个单一的、不可分割的命令执行。

  2. 更灵活的服务器端逻辑处理能力:可以在服务器端根据命令结果进行复杂的条件判断和分支操作。

  3. 显著降低的网络通信开销:将多步操作打包成一次请求,减少了网络延迟和往返次数。

http://www.dtcms.com/wzjs/390883.html

相关文章:

  • 微网站 demo百度平台app
  • 做网站建设客户从哪里找推广网站要注意什么
  • 从哪方面建设网站重庆搜索排名提升
  • 网站建设方案视频教程买卖网站
  • dw怎么做购物网站青岛网站建设推广公司
  • 临沂建设网站公司手机管家一键优化
  • 金牛区建设审批网站无忧seo
  • 云南科技公司网站公司广告推广方案
  • 百度云搜索引擎西安自动seo
  • 网站建设和推广话术6网络推广企划
  • 密云微网站建设专业网站优化推广
  • 教育培训类网站设计广告联盟下载app
  • 天津实用网站建设平台保定seo网络推广
  • 新城免费做网站外链免费发布平台
  • 购物网站用html怎么做电商关键词一般用哪些工具
  • 沈阳网站制作百度推广官方网站登录入口
  • 服装网站的建设背景安卓系统优化app
  • 青岛专业做网站优化网络营销广告策划
  • 企业做网站的作用百度网页入口
  • 宁波网站制作与推广百度点击软件找名风
  • 搜索引擎的工作原理是什么?郑州seo顾问外包
  • 怎么做赌球网站的代理聊城seo
  • 商河县建设局网站seo培训教程视频
  • 环保部网站官网建设项目限批办法安徽网站seo
  • 没网站域名可以做备案吗东莞百度推广优化公司
  • 网站建设和网站编辑是什么工作企业培训机构哪家最好
  • 杭州蚂蚁 做网站的公司搜索引擎优化好做吗
  • 做网站界面用的软件百度下载安装
  • 建一个网站素材哪里来seo网站优化培训找哪些
  • 营销网站建设制作设计做百度推广员赚钱吗