1

私が使用しているプロジェクトでRedisを使用する必要があり、LUAスクリプトを使用して(または実際に)浮動小数点数で適切な数学演算と比較を行う方法があるかどうか疑問に思っていました。たとえば、フィールドがあり、それを別のフィールドで乗算し、それを 3 番目のフィールドと比較する必要があるとします。例えば

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  ...

val1とのタイプを確認してくださいval2(例: print(type(val1)))。私の推測では、それらは文字列であるため、数値比較ではなく字句比較が得られます。

Lua のネイティブの数値型は浮動小数点であり、それらを比較しても問題ありません。tonumber(val1)値が実際に文字列である場合は、それらを比較する前に数値 (例: ) に変換する必要があります。

于 2013-07-11T22:38:51.693 に答える
1

もちろん可能です: Lua では、すべての数値が float です。実際には、浮動小数点数よりも大きな整数値を扱う方が困難です (内部数値表現のため)。

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 に答える