Redis lua腳本應用

  高併發狀況下對緩存進行讀取-修改操做時,須要原子性操做,Redis自己提供一個一些命令,例如incrby、hincrby自增(減)命令,可是這些命令在有些業務中不適用,這種狀況下就能夠使用lua腳原本實現多命令的執行(讀、寫);java

  如下lua腳本,一般lua腳本只須要加載一次,而後使用redis返回的hash值進行操做;redis

local local = redis.call('exists', KEYS[1])
if tonumber(local) == 0 then
    return false
end
if tonumber(redis.call('get', KEYS[1])) <= 0 then
    return false
end
if tonumber(ARGV[1]) > 0 then
    redis.call('incrby', KEYS[1], ARGV[1])
    return true
else
    if tonumber(redis.call('get', KEYS[1])) >= tonumber(ARGV[1]) then
        redis.call('incrby', KEYS[1], ARGV[1])
        return true
    else
        return
false
end end

該腳本實現了對庫存的讀取和修改,該腳本能夠在resources文件夾進行統一管理;緩存

在java代碼中:併發

  

        try {
        DefaultRedisScript<Boolean> redisScript = new DefaultRedisScript<>();
        redisScript.setScriptSource(new ResourceScriptSource(new ClassPathResource("/limit.lua")));
        redisScript.setResultType(Boolean.class);

        return redisTemplate.execute(redisScript, Collections.singletonList(key), String.valueOf(mlitimes), String.valueOf(maxCount));

        } catch (IOException e) {
            e.printStackTrace();
        }

重點:在集羣模式下,若是隻在某個節點上傳了腳本,在其餘節點中會找不到,所以須要判斷腳本是否存在,若是不存在,從新上傳lua腳本。高併發

相關文章
相關標籤/搜索