| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102 |
- ---
- --- Generated by EmmyLua(https://github.com/EmmyLua)
- --- Created by jlutt.
- --- DateTime: 2020-09-03 9:38
- --- 库存调整精度
- ---
- local key = KEYS[1]
- local virualKey = KEYS[2]
- local field = ARGV[1]..'-*'
- local oldPrecise = tonumber(ARGV[2])
- local newPrecise = tonumber(ARGV[3])
- local scanTable = {}
- local scanVirsualTable = {}
- local cursor = 0
- repeat
- local rep = redis.call('HSCAN', key, cursor, 'MATCH', field)
- cursor = rep[1]
- for k, v in pairs(rep[2]) do
- --- lua中k为序号,从1开始
- if k % 2 == 0 then
- local numField = rep[2][k -1]
- local numValue = v
- ---hscan的缺点:同一个元素可能会被返回多次
- if (scanTable[numField] == nil) then
- ---不能在hscan中直接调用hset命令,报错replicate_commands
- ---local newValue = v * (10 ^ (newPrecise - oldPrecise))
- ---redis.call("HSET", key, numField, newValue)
- ---redis.log(redis.LOG_WARNING, 'c----' ..numField..'='.. numValue..'=='..newValue);
- scanTable[numField] = numValue
- end
- end
- end
- until cursor == '0'
- cursor = 0
- repeat
- local rep = redis.call('HSCAN', virualKey, cursor, 'MATCH', field)
- cursor = rep[1]
- for k, v in pairs(rep[2]) do
- --- lua中k为序号,从1开始
- if k % 2 == 0 then
- local numField = rep[2][k -1]
- local numValue = v
- ---hscan的缺点:同一个元素可能会被返回多次
- if (scanVirsualTable[numField] == nil) then
- ---不能在hscan中直接调用hset命令,报错replicate_commands
- ---local newValue = v * (10 ^ (newPrecise - oldPrecise))
- ---redis.call("HSET", key, numField, newValue)
- ---redis.log(redis.LOG_WARNING, 'c----' ..numField..'='.. numValue..'=='..newValue);
- scanVirsualTable[numField] = numValue
- end
- end
- end
- until cursor == '0'
- ---https://redis.io/commands/EVAL#replicating-commands-instead-of-scripts
- redis.replicate_commands()
- local stock = {}
- local currIndex2 = 1
- local x = {}
- for k, v in pairs(scanTable) do
- local newValue = math.floor(v * (10 ^ (newPrecise - oldPrecise)))
- redis.call("HSET", key, k, newValue)
- stock[currIndex2] = {}
- stock[currIndex2]['stockKey'] = k
- stock[currIndex2]['stockNum'] = newValue
- ---redis.log(redis.LOG_WARNING, 'b----' ..k..'='.. v .. '==='..newValue)
- currIndex2 = currIndex2 + 1
- end
- local currIndex3 = 1
- for k, v in pairs(scanVirsualTable) do
- local newValue = math.floor(v * (10 ^ (newPrecise - oldPrecise)))
- redis.call("HSET", virualKey, k, newValue)
- ---redis.log(redis.LOG_WARNING, 'b----' ..k..'='.. v .. '==='..newValue)
- currIndex3 = currIndex3 + 1
- end
- ---释放变量
- scanTable = nil
- scanVirsualTable = nil
- ---返回值
- local time = redis.call('TIME')
- x['time'] = time[1]
- x['microseconds'] = time[2]
- x['stockList'] = stock
- local re = cjson.encode(x);
- return re
|