1

我需要在我正在使用的项目中使用 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
4

2 回答 2

2

似乎完成了字典比较而不是数字比较。

local val1 = redis.pcall('GET','val1'); 
local val2 = redis.pcall('GET','val2');
if val1 > val2 then  ...

检查和的类型val1val2例如print(type(val1)))。我的猜测是它们是字符串,这就是为什么你得到一个词法比较而不是数字比较的原因。

Lua 的原生数字类型是浮点数,比较它们没有问题。如果您的值确实是字符串,您只需tonumber(val1)在比较它们之前将它们转换为数字(例如)。

于 2013-07-11T22:38:51.693 回答
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,它会更有用。

于 2013-07-11T19:47:16.017 回答