当前位置: 首页 > 网络应用技术

Redis的事务,Go+Lua真的很香

时间:2023-03-08 23:01:40 网络应用技术

  Redis是一种常用的工具来处理高分子,并讨论了共同的缓存技能中的相关技术。

  以库存示例,通常两个步骤:

  但是,这两个步骤是分开的,并且在扣除时可能会成功,但是当它们增加时失败,导致库存不一致。

  另一个解决方案是:

  但是这两个步骤也分开,T1和T2具有时间差异。当T2始终扣除库存时,真正的库存和T1不再相同。

  Redis是否解决了此问题,例如MySQL原子质?

  为了解决扣除库存的问题,您可以使用Redis的交易功能。

  REDIS的基本事务(基本事务)需要使用多命令和EXEC命令,该命令允许客户端执行多个命令而不会被其他客户中断。

  与可以在执行过程中可以回滚的关系不同,所有被多命令和EXEC命令包围的命令在Redis中均一执行,直到执行所有命令。执行事务后,REDIS将处理其他命令。客户。

  当Redis Transactions在执行中间遇到错误时,它们不会回滚,而是继续执行后续命令;

  另外,查询在REDIS中的交易中间散布,结果不会返回。如下所示,只有EXEC的执行才能返回查询结果:

  对于交易,简单摘要:

  当执行REDIS事务时,它不会被其他客户端中断,因此可以将多个命令打包为命令执行。目前,我们可以使用LUA脚本。

  在Redis 2.6(新功能)之后,我们可以通过Redis的LUA脚本操作Redis。

  该脚本将使用多个命令和操作作为在REDIS中执行的命令,这意味着在执行脚本期间,它不会被任何其他脚本或命令中断。

  对于这种原子,LUA脚本可以替换多和执行的交易功能。在同一时间,在LUA脚本中执行过多的费用是不合适的,以避免影响其他后续请求的正常执行。

  使用LUA脚本的好处:

  LUA脚本如下图所示:

  实例

  尖峰系统已在尖峰系统中绘制。

  可以看出,库存首先增加,然后与尖峰总数相比。如果超过范围,则需要减少库存。该分离的操作增加了失败的可能性。脱离商品库存也是相似的逻辑。

  使用LUA脚本以Go语言扣除库存操作。我们可以首先查询,然后比较,最后扣除,该脚本将包装操作,代码为:

  客户端将lua加载到redis,脚本由redis执行:

  如果扣除设置为25,则执行后,返回值为负,但是查询不会再次更改。

  e myproject go run main.go

  当前值为10

  数量不足以扣除

  结果-15

  e myproject redis -cli -p 6379 -a 111111

  127.0.0.1:6379>获取库存

  “ 10”

  如果扣除设置为6,则扣除额成功减少,在执行后

  e myproject go run main.go

  当前值为10

  剩余的值为4

  结果4

  e myproject redis -cli -p 6379 -a 111111

  127.0.0.1:6379>获取库存

  “ 4”

  多次执行脚本时,请考虑使用Scriptload和Evalsha而不是运行以保存带宽。

  该方案仅由标识符SHA1通过网络传输,而不是传输LUA代码块以节省流量。该过程如下图所示:

  特定代码是:

  如果您觉得自己在Go中写下Lua,我们可以选择自定义的解决方案。

  查找Redis的操作和维护学生,让操作和维护人员通过LUA自定义命令,并使用这些命令保持在REDIS内存中以实现重复使用效果。使用这些定制命令使用REDIS提供的命令之间没有区别本身。

  当然,前提是操作和维护同学同意。

  尽管LUA使用REDIS交易功能来确保执行过程中不会插入其他命令,但所有问题都无法解决:

  这也是SLA高的原因。有必要记住日志,这可以实际解决许多问题。

  记录在Mac上构建Redis的过程。您可以安装redis并执行GO+LUA的代码。

  REDIS相对简单地构建,您可以使用以下命令安装它

  为了安全性,您可以设置一个密码。打开redis.conf文件,然后按命令 + f搜索:#requirepass foobared修改它:需要密码

  执行以下命令,在服务器上启动redis

  执行redis-server命令时,如果没有redis.conf文件,它将根据默认配置启动。在这种情况下,登录无验证

  如果设置,则命令行登录如下:

  如果未设置,请直接执行

  某些问题无法100%解决,我们必须接受这一事实。但这并不意味着妥协。即使是手动解决方案,我们也必须能够找到问题并确定解决方案。在解决方案频率足够低的前提下。目前,无需在100%自动化解决方案上提出注意点。输出比尽可能低。

  如果您喜欢我的文章,可以注意我的公共帐户(程序员的辣辣)

  我的个人博客是:https://shidawuhen.github.io/