赞
踩
通过执行redis的eval命令,可以运行一段lua脚本。
EVAL script numkeys key [key ...] arg [arg ...]
eval "return {KEYS[1],KEYS[2],ARGV[1],ARGV[2]}" 2 key1 key2 first second
EVAL 命令要求你在每次执行脚本的时候都发送一次脚本主体(script body)。
Redis 有一个内部的缓存机制,因此它不会每次都重新编译脚本,不过在很多场合,付出无谓的带宽来
传送脚本主体并不是最佳选择。
为了减少带宽的消耗, Redis 实现了 EVALSHA 命令,它的作用和 EVAL 一样,都用于对脚本求值,但
它接受的第一个参数不是脚本,而是脚本的 SHA1 校验和(sum);
清除所有脚本缓存
根据给定的脚本校验和,检查指定的脚本是否存在于脚本缓存
将一个脚本装入脚本缓存,返回SHA1摘要,但并不立即运行它
杀死当前正在运行的脚本
使用redis-cli直接执行lua脚本
脚本内容:
return redis.call('set',KEYS[1],ARGV[1])
脚本执行
./redis-cli -h 127.0.0.1 -p 6379 --eval my.lua name:1 jiabin
利用Redis整合Lua,主要是为了性能以及事务的原子性。因为redis帮我们提供的事务功能太差。
Redis 传播 Lua 脚本,在使用主从模式和开启AOF持久化的前提下,当执行lua脚本时,Redis 服务器有两种模式:脚本传播模式和命令传播模式。
脚本传播模式是 Redis 复制脚本时默认使用的模式
Redis会将被执行的脚本及其参数复制到 AOF 文件以及从服务器里面。
执行以下命令:
eval "redis.call('set',KEYS[1],ARGV[1]);redis.call('set',KEYS[2],ARGV[2])" 2 name1 name2 jiabin1 jiabin2
主服务器将向从服务器发送完全相同的 eval 命令
处于命令传播模式的主服务器会将执行脚本产生的所有写命令用事务包裹起来,然后将事务复制到 AOF
文件以及从服务器里面。
因为命令传播模式复制的是写命令而不是脚本本身,所以即使脚本本身包含时间、内部状态、随机函数
等,主服务器给所有从服务器复制的写命令仍然是相同的。
为了开启命令传播模式,用户在使用脚本执行任何写操作之前,需要先在脚本里面调用以下函数:
redis.replicate_commands()
redis.replicate_commands() 只对调用该函数的脚本有效:在使用命令传播模式执行完当前脚本之后,
服务器将自动切换回默认的脚本传播模式。
执行以下命令:
eval "redis.replicate_commands();redis.call('set',KEYS[1],ARGV[1]);redis.call('set',K EYS[2],ARGV[2])" 2 name1 name2 jiabin1 jiabin2
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。