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/