Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Lua 在redis中处理浮动_Lua_Redis - Fatal编程技术网

Lua 在redis中处理浮动

Lua 在redis中处理浮动,lua,redis,Lua,Redis,我需要在我正在使用的一个项目中使用Redis,我想知道是否有必要使用LUA脚本对浮点进行适当的数学运算和比较(或者真的是这样)。例如,我有一个字段,需要将它乘以另一个字段,然后将其与第三个字段进行比较。比如说 local staticVal = .2 local dynamicVal2 = redis.pcall('GET', 'dynamicVal2') local calcVal = dynamicVal * staticVal local compareVal = 100 if calcV

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

当然可以:在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   
set dynamicVal2 100000.0
eval“local staticVal=.2;local dynamicVal=tonumber(redis.call('GET','dynamicVal2'));local calcVal=dynamicVal*staticVal;local compareVal=100;如果calcVal
现在,在您给出的示例中使用Lua并没有多大用处:在服务器端使用Lua所做的事情可以在客户端以类似的效率轻松完成。如果可以的话,最好在客户端进行。与许多其他数据存储一样,对于相同的往返次数,在客户端可以做的越多,就越好

如果Lua脚本能够有效地避免多次往返Redis,那么它会更有用

似乎是字典比较,而不是数字比较

local val1 = redis.pcall('GET','val1'); 
local val2 = redis.pcall('GET','val2');
if val1 > val2 then  ...
检查
val1
val2
的类型(例如
print(type(val1))
)。我猜它们是字符串,这就是为什么要进行词汇比较而不是数字比较


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

我有一个问题,请查看我的编辑2。为什么函数返回3.5而不是10.5。在我看来,它似乎是在进行字典比较(将3与1进行比较,并返回两者中较大的一个),而不是将3.5与10.5进行比较;在float中转换字符串。我现在看到了这一点,我想当我将其转换为一个数字并返回该数字时,我感到困惑,Redis将其转换为int。我认为所有的计算都是作为int完成的。我的问题是我没有为Redis将其重新转换为字符串。谢谢你指出这一点。
local val1 = redis.pcall('GET','val1'); 
local val2 = redis.pcall('GET','val2');
if val1 > val2 then  ...