高併發狀況下對緩存進行讀取-修改操做時,須要原子性操做,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腳本。高併發