处理redis中的浮动

时间:2013-07-11 19:06:16

标签: lua redis

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

2 个答案:

答案 0 :(得分:2)

  

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

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

检查val1val2的类型(例如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,那将会更有用。