redis lua

Copy Highlighter-hljs
# redis 连接是否正常 --raw避免中文乱码
redis-cli -h 1270.0.1 -p 6379 --raw
> ping
pong
## redis源代码目录 utils文件中 redis初始化脚本 reds_init_script
# 获取键值的数据类型
redis> TYPE foo
string
# rate.limiting:127.0.0.1 是要操作的键使用 KEYS[1] 获取
# 10 3 是参数 在脚本中使用 ARGV[1] ARGV[2] 获得
# 注意命令中 逗号 , 两边的 空格不能省略,否则会出错
redis-cli --eval /path/to/ratelimiting.lua rate.limiting:127.0.0.1 , 10 3
# RDB持久化是通过快照完成的,当符合一定条件时 Redis会自动将内存中的所有数据生成一份副本并
# 存储在硬盘上,这个过程即 快照。
# AOF将Redis执行的每一条写命令追加到硬盘文件中,这一过程会降低Redis性能。
Copy Highlighter-hljs
-- 全局变量无须声明就可以直接使用 默认值是nil
a = 1 -- 为全局变量 a赋值
print(b) --无须声明直接使用默认为nil
-- redis脚本中不能使用全局变量,只允许使用局部变量以防止脚本之间相互影响。
local c --声明局部变量c ,默认值nil
-- lua逻辑操作符 not and or
-- 只要操作数不是nil 或 false,逻辑操作符就认为操作数为真,否则为假。
-- 特别注意:即使是 0 或 空字符串也被当做真。
print(1 and 5) -- 5
print(1 or 5) -- 1
print(not 0) -- false
print('' or 1) -- ''
-- lua的逻辑操作符支持短路,也就是说对于 false and foo() , lua 不会调用foo()函数,
-- or操作符与之类似。
-- 连接操作符 。连接操作符只有一个: ..,用来连接两个字符串。
print('hello' .. '' .. 'world!') -- 'hello world!'
-- 连接操作符会自动把数字类型的值转换为字符串类型:
print('hello' .. '' .. 25) -- 'hello 25'
-- 取长度操作符使用 #
print(#'hello') -- 5
-- if 语句
if 表达式 then
语句块
elseif 表达式 then
语句块
else
语句块
end
-- 循环语句
while 表达式 do
语句块
end
repeat
语句块
until 条件表达式
for 变量 = 初值, 终值, 步长 do
语句块
end
local sum = 0
for i = 1, 100 do
sum = sum + i
end
-- for 循环中变量(i)是局部变量
-- 表类型
-- 表是 lua中唯一的数据结构,可以理解为关联数组,任何类型的值(除了空类型)都可以作为表的索引。
a = {} -- 将变量a 赋值为一个表表
a['field'] = 'value' -- 将field 字段赋值 value
print(a.field) -- value a.field 是 a['field']的语法糖
-- 也可以这样定义
people = {
name = 'bob',
age = 29
}
print(people.name) --bob
-- 当索引为整数的时候,表和传统的数组一样
a = {}
a[1] = 'bob'
a[2] = 'jeff'
-- 也可以写成下面这样:
a = {'bob','jeff'}
-- 注意:lua约定数组的索引时从1开始的,而不是0
-- for语句遍历数组:
for index, value in ipairs(a) do
print(index)
print(value)
end
for i = 1, #a do
print(index)
print(value)
end
-- 输出结果和上面相同 #a 的作用是获取表 a 的长度
-- lua还提供了一个迭代器 pairs() 用来变量非数组(关联数组)的表值
people = {
name = 'bob',
age = 29
}
for index, value in pairs(people) do
print(index)
print(value)
end
-- 函数
function (参数列表)
函数体
end
-- 赋值给一个局部变量
local square = function (num)
return num * num
end
-- 前面的代码会被转换为:
local square
square = function (num)
return num * num
end
-- unpack() 函数用来返回表中的元素
local function square (...)
local argv = {...}
for i = 1, #argv do
argv[i] = argv[i] * argv[i]
end
return unpack(argv)
end
a, b, c = square(1, 2, 3)
print(a) -- 1
print(b) -- 4
print(c) -- 9
-- 我们首先将 ... 转换为表 argv,然后对表的每个元素计算其平方值。unpack()函数用来返回表中的元素
-- 在脚本中使用 redis.call() 函数调用redis命令。
redis.call('set', 'foo', 'bar')
local value = redis.call('get','foo') -- value 值为 bar
-- redis.call()函数的返回值就是 redis命令的执行结果。

eval命令:

Copy Highlighter-hljs
eval script numkeys key [key ...] arg [arg ...]

script参数是一段lua脚本参数

numkeys参数 用于指定键名参数的个数

key [key...]参数表示在脚本中所用到的那些redis键,这些键名参数在lua中通过全局变量KEYS数组,用1为基址的形式访问(KEYS[1]、KEYS[2]...)

arg [arg...]参数:在lua中通过全局变量ARGV数组访问,访问形式和KEYS变量类似(ARGV[1]、ARGV[2])

Copy Highlighter-hljs
# "2" 是key的数量
eval "return redis.call('mset',KEYS[1],ARGV[1],KEYS[2],ARGV[2])" 2 ha he 111 222
posted @   caibaotimes  阅读(14)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· 写一个简单的SQL生成工具
历史上的今天:
2021-01-19 sublime 光标选中多行
2021-01-19 mysql删除重复记录并且只保留一条
点击右上角即可分享
微信分享提示