我需要在我正在使用的项目中使用Redis,并且想知道是否还有使用LUA脚本进行正确的数学运算和浮点数比较(或者无论如何)。例如,我有一个字段,需要将其乘以另一个字段,并将其与第三个字段进行比较。例如
local staticVal = .2
local dynamicVal2 = redis.pcall('GET', 'dynamicVal2')
local calcVal = dynamicVal * staticVal
local compareVal = 100
if calcVal < compareVal then
return false
else
return true
是否有可能这样做,或者我是否必须使用其他语言进行GET调用并在那里进行比较?
谢谢
编辑:
或者只是比较浮点数的能力会有所帮助。似乎进行了字典比较而不是数字比较。
编辑2:
SET val1 10.5
SET val2 3.5
EVAL "local val1 = redis.pcall('GET','val1'); local val2 = redis.pcall('GET','val2'); if val1 > val2 then return val1 else return val2 end" 0
答案 0 :(得分:2)
似乎完成了字典比较而不是数字比较。
local val1 = redis.pcall('GET','val1'); local val2 = redis.pcall('GET','val2'); if val1 > val2 then ...
检查val1
和val2
的类型(例如print(type(val1))
)。我的猜测是它们是字符串,这就是为什么你要进行词汇比较而不是数字比较。
Lua的本机数字类型是浮点数,比较它们没有问题。如果您的值确实是字符串,则只需在比较它们之前将它们转换为数字(例如tonumber(val1)
)。
答案 1 :(得分:1)
当然你可以:在Lua中,所有数字都是浮点数。实际上使用大整数值比使用浮点数更困难(由于内部数字表示)。
来自redis-cli:
set dynamicVal2 100000.0
eval "local staticVal = .2 ; local dynamicVal = tonumber(redis.call('GET', 'dynamicVal2')); local calcVal = dynamicVal * staticVal; local compareVal = 100; if calcVal < compareVal then return false; else return true; end;" 0
(integer) 1
现在使用Lua作为示例并不是那么有用:在服务器端使用Lua所做的事情可以在客户端以类似的效率轻松完成。如果可以的话,最好在客户端进行。与许多其他数据存储一样,对于相同数量的往返,您在客户端可以做的越多,就越好。
如果有效地使用Lua脚本来避免多次往返Redis,那将会更有用。