redislua(redis乱码问题)

本篇文章给大家谈谈redislua,以及redis乱码问题对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。

本文目录一览:

通过redis+lua实现加减库存

我们先分析场景,嫌派销通过多种方案对比,选用了redis+lua的组合来满足我们的业务需要。利用redis单线程的特点,以及redis2.6版本后开始对lua的支持,我们采用redis执行lua脚本来确保我们查询+修改的串行执行。后面我们展示了code的实现案例,以及介绍了lua脚本的一些注意事项,可以依葫芦画瓢形式自己实现自己的需求。综合而言,我们分析场景应先分析其核心问羡橘题,然后利用一些更简洁的方法或小技芹游巧来落地。

[img]

redislua能保证命令一起成功吗

能。

Redis事务可以保证多个命令的原子性执行。需要注意的是,Redis事务并不是真正的ACID事务,因为Redis并不支唤含森持回滚操作

Redis是一种非常流行的和亩内存数据库,常用于数据缓存与高频数据存储。大多数开发人员可能听说过redis可以运行 Lua 脚本。老握

lua脚本~ Redis调用

参考资料:

redis常见命令

官方调用lua文档

redis菜鸟教程

lua菜鸟教程

其他:

一句话,因为要用所以学习简单粗暴

本次仅学习如何使搜中用redis调用lua脚本(含springboot调用方式世者山),lua脚本如何写以后有时间在玩。

写redis锁时经常使用的一个脚本:

我这里的客户端用的 windows 的,将准备好的 lua 脚本放在自己指定的文件夹

报错了!!! why ??? 这个符合eval语法吖?

其实,这里面有一个问题就是如果想要直接执行文件,就不需要进入 redis-client

当然如果想要在 reids-client 内执行怎嫌消么办呢?

这里展示部分代码

将脚本放在 resouces 文件下 lua/unlock.lua

测试代码:

测试控制台结果。当然也需要在redis-client中检查下是否是正确的结果

Redis 中使用 Lua 脚本

Redis 本身已经提供了丰富的命令,但是直接用来处理一些复杂业务时可能还不够方便,会有一定的局限性。因此,在 Redis2.6 版本开始提供了对 Lua 脚本的支持,Lua 脚本的使用还是比较广泛的,比如商品秒杀、分布式锁等,使用 Lua 脚本可以带来以下的好处:

为了让例子更加的贴近实际应用,这里实现一个简单版的分布式锁。这里先用 Jedis 操作。

上边详细的介绍了分布式锁的实现过程,以及可能出现的问题,最终,我们决定删除锁的操作使用 Lua 脚本实现,对应的脚本如下:

Lua 脚本中执行具体的 Redis 命令,需要使用 redis.call() 方法, KEYS 表示客户端发起脚本执行命令时携带的 Redis key 的一个集合, ARGV 则是其它参数的一个集合,主意下标从1开始。结合我们的业务,这里的 KEYS[1] 则表示 lock , ARGV[1] 则是一个随机字符串。整个脚本的含义就是,如果客户端传递的 lock 的 value 和 Redis 中存储的一致,就删除 lock 。

Lua 脚本的语法还是比较简单的,具体内容可以自行学习。

前边的准备工作基本结束了,文章开始说过执行脚本有两种途径,下边我们具体来看:

这里使用 jedis.eval() 发送脚本到 Redis 服务器执行,后两个参数分别是 key 的集合,以及 value 参数的集合。

先将脚本以文件形式放到 Redis 里,例如这样:

然后通过耐如如下命令让 Redis 服务器缓存脚本:

script load 命令会在 Redis 服务器缓存 Lua 脚本,并且脚本内容经过 SHA-1 签名算法处理后,会返回脚本内容的 SHA1 校验和的编码,然后在端调用时,传入编码字符串作为参数,这样 Redis 服务器就会执行对应缓存的脚本了,就不用了每次发送具体的脚本内容了。

还有两个比较有用的命令:

除了使用上边的命令缓存脚本、生成脚本的 SHA1 校验和的编码,还可以使用 Jedis 实现,但最终的 SHA1 编码内容是不同的:

实际的项目中,可能更多的会在 SpringBoot 项目中整合 Redis,此时执行 Lua 脚本的基本流程如下:

核心的类就是 DefaultRedisScript ,它实现了 RedisScript 接口。 execute() 方法最后一个参数是可变类型的,陪睁用来传递多个 value 参数。初次执行 execute() 方法时,其内部会自动缓存 Lua 脚本到 Redis 服务器;同时每次执行脚本时会根据脚本内容自动计算出对应的 SHA1 校验和的编码,去匹配、执行缓存的脚本。

具体的 SHA1 校验和的编码,可以在 execute() 方法执行后,使用 redisScript.getSha1() 查看。使用 SpringBoot 方式 执行 Lua 脚本生成的 SHA1 校验和的编码和前边直接使用 Jedis 生成的一致。

无论用那种方式芦亩岁在 Redis 中使用 Lua 脚本,其中的原理都是类似的。

redis使用lua

redis中执行lua可以通过两种方式:

第一种是将lua脚本或命令直接使用redis执行,第二种相当于把脚本或命令保存到redis中,然后使用一串sha码调用(可以理解为调用函数)

例子(在redis中执行):

输出:

这里传入的key个数为1,所以redis是key而world是参数

这个操作相当于把脚本加载到redis,得到一个SHA1的校验和,然后使用这个SHA1码来调用对于的Lua脚本,避免每次去发送Lua脚本。

例子:

执行evalsha

如:

redis提供了几个命令来岩银管理脚本

用于将Lua脚本加载到redis内存中

用于判断sha1值是否已经加载到redis内存中

返回个数

用于清除redis内存已经加载的所有脚本

用于杀掉正在执行的备锋Lua脚本

如果Lua脚本比较耗时,甚至Lua脚本存在问题,那么此时Lua脚本的执行会阻塞redis,直到脚本执行完毕或者外部干预将其结束

有一点需要注意,如果Lua脚本正在执行写操作, script kill 命令不会生效,这时只能等待脚本执行结束,或使用 shutdown save 停掉redis服务

可参看 redis官方文档

有两种方式可以调用

这两种方法都可以调用,区别是call()方法是仿枣晌遇到就停止执行后面的内容并直接返回错误,而pcall遇到异常会忽略掉继续执行

其他命令可参看文档这里不赘述

一个使用Lua脚本执行redis scan命令进行批量删除的例子,文件名为 del-batch.lua

调用

执行了之后会删除符合规则 TEST_KEY* 的key

调用结果

关于redislua和redis乱码问题的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。

标签列表