处理 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
点赞
用户1114486
用户1114486

当然可以:在 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-11 19:47:16
用户501459
用户501459

似乎是进行字典比较而不是数值比较。

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-11 22:38:51