上海网站建设培训学校,在网站后台为什么不显示百分号,网站模块在线制作,手机自己制作文字配图前面我们已经介绍完了Redis相关的理论知识#xff0c;从本篇开始我们介绍一些Redis相关的时机应用。比如#xff1a;Redis整合LuaRedis的消息模式Redis实现分布式锁常见的缓存问题我们先从Redis整合Lua的使用开始。lua是一种轻量小巧的脚本语言#xff0c;用标准C语言编写并… 前面我们已经介绍完了Redis相关的理论知识从本篇开始我们介绍一些Redis相关的时机应用。比如Redis整合LuaRedis的消息模式Redis实现分布式锁常见的缓存问题我们先从Redis整合Lua的使用开始。lua是一种轻量小巧的脚本语言用标准C语言编写并以源代码形式开放其设计目的是为了嵌入应用程序中从而为应用程序提供灵活的扩展和定制功能。在Redis中使用Lua有以下好处减少网络开销在Lua脚本中可以把多个命令放在同一个脚本中运行。原子操作redis会将整个脚本作为一个整体执行中间不会被其他命令插入。换句话说编写脚本的过程中无需担心会出现竞态条件。复用性客户端发送的脚本会永远存储在redis中这意味着其他客户端可以复用这一脚本来完成同样的逻辑。使用Lua脚本具体的示意图如下Redis整合Lua脚本通过执行redis的eval命令可以运行一段lua脚本。EVAL script numkeys key [key ...] arg [arg ...]命令的具体说明如下script参数是一段Lua脚本程序它会被运行在Redis服务器上下文中这段脚本不必(也不应该)定义为一个Lua函数。numkeys参数用于指定键名参数的个数。key [key ...]参数从EVAL的第三个参数开始算起使用了numkeys个键(key)表示在脚本中所用到的那些Redis键(key)这些键名参数可以在Lua中通过全局变量KEYS数组用1为基址的形 式访问( KEYS[1] KEYS[2]以此类推)。arg [arg ...]参数可以在Lua中通过全局变量ARGV数组访问访问的形式和KEYS变量类似( ARGV[1] 、 ARGV[2] 诸如此类)。eval return {KEYS[1], KEYS[2], ARGV[1],ARGV[2]} 2 key1 key2 first secondLua脚本中调用Redis命令我们可以在Lua脚本中调用Redis命令redis.call()redis.pcall()redis.call()和redis.pcall()的返回值都是redis命令执行的返回值区别在于如果出错call()则返回错误信息不继续执行而pcall()继续执行。在脚本中使用return语句将返回值返回给客户端如果没有return则返回nil。eval return redis.call(set, KEYS[1], ARGV[1]) 1 n1 elevenSCRIPT命令另外一方面在Redis中有一些管理Lua脚本的命令SCRIPT FLUSH清除所有脚本缓存SCRIPT EXISTS根据给定的脚本校验和检查指定的脚本是否存在于脚本缓存SCRIPT LOAD将一个脚本装入脚本缓存返回SHA1摘要但并不立即运行它SCRIPT KILL杀死当前正在运行的脚本192.168.24.131:6380 script load return redis.call(set,KEYS[1],ARGV[1])c686f316aaf1eb01d5a4de1b0b63cd233010e63d192.168.24.131:6380 evalsha c686f316aaf1eb01d5a4de1b0b63cd233010e63d 1 n2elevenOK192.168.24.131:6380 get n2EVALSHAEVAL 命令要求你在每次执行脚本的时候都发送一次脚本主体(script body)。Redis 有一个内部的缓存机制因此它不会每次都重新编译脚本不过在很多场合付出无谓的带宽来传送脚本主体并不是最佳选择。为了减少带宽的消耗 Redis 实现了 EVALSHA 命令它的作用和 EVAL 一样都用于对脚本求值但它接受的第一个参数不是脚本而是脚本的 SHA1 校验和(sum)。下面我们举两个使用Lua脚本的例子return redis.call(set, KEYS[1], ARGV[1])上面是一个set脚本在redis中我们可以这样使用redis-cli -h 192.168.24.131 -p 6380 --eval test.lua n3, eleven总结一下利用Redis整合Lua主要是为了性能以及事务的原子性。因为redis帮我们提供的事务功能太差。