레디스 루아

11871 단어 tutorialluaapiredis

문맥



Redis에서 스크립트를 실행할 수 있다는 것을 알고 계십니까? 모른다면 시도해 볼 시간입니다. 이 스크립팅 기능은 Redis 작업의 성능을 최적화하기 위한 것입니다. 그러나 Redis 파이프라인 기능을 사용하면 동일한 성능을 얻을 수 있습니다. 사용 사례에 따라 매우 매력적인 사용 사례가 있는 경우 이 스크립팅 기능을 사용할 수 있습니다.

이 기사에서는 삶을 더 쉽게 만들어 줄 다양한 Redis Lua 스크립트 사용 사례와 일상 생활에 적합할 수 있는 잠재적 사용 사례를 보여줍니다.

1. H겟 멤버스



설명



해시와 세트가 있는 경우 세트는 특정 해시 키를 정의합니다.

예시



차량, 혼다 자동차 3대, 메르세데스 자동차 1대, 스쿠터 2대가 있다고 가정해 보겠습니다. 이 스크립트를 사용하여 자동차 수를 가져올 수 있습니다.

> hset cars honda 3
(integer) 1
> hset cars mercedes 1
(integer) 1
> hset motorbikes scooters 1
(integer) 1
> sadd cars honda mercedes
(integer) 2
> evalsha 700c06c5ce9835bf9eef2198c8bc4d268b3b5095 2 cars produce
1) 1) "honda"
   2) "3"
2) 1) "mercedes"
   2) "1"


루아 소스:

local fields = redis.call("SMEMBERS", KEYS[2])
local values = redis.call("HMGET", KEYS[1], unpack(fields))
local result = {}
for i,k in ipairs(fields) do result[i] = {k, values[i]} end
return result


2. 존재하는 경우 HINCR



설명



키 존재에 대한 추가 확인으로 Hash map의 기존 값을 증가시켜야 하는 경우.

예시




> evalsha 3cb0d65c399fda8a1d4eb93b2fe85311671bc969 1 top_scorer budi 1
(nil)
> hset top_scorer budi 80
(integer) 1
> evalsha 3cb0d65c399fda8a1d4eb93b2fe85311671bc969 1 top_scorer budi 1
(integer) 91
> evalsha 3cb0d65c399fda8a1d4eb93b2fe85311671bc969 1 top_scorer budi 1
(integer) 92


루아 소스:

if redis.call("HEXISTS", KEYS[1], ARGV[1]) == 1 then
  return redis.call("HINCRBY", KEYS[1], ARGV[1], ARGV[2])
else
  return nil
end


3. HMSET 확장



설명



해시 세트에서는 일반적으로 값을 하나씩 설정해야 합니다. Lua를 활용하여 args에서 여러 키를 설정할 수 있습니다.

예시




> evalsha 8c4bbf1b37784149128a5b96e55073538a7401d9 1 mykey foo 1 bar 2
(integer) 1
> hgetall mykey
1) "foo"
2) "1"
3) "bar"
4) "2"
> evalsha 8c4bbf1b37784149128a5b96e55073538a7401d9 1 mykey foo 1 bar 3 baz 4
(integer) 0
> hgetall mykey
1) "foo"
2) "1"
3) "bar"
4) "2"


루아 소스:

if redis.call('exists', KEYS[1]) == 0 then
    redis.call('hmset', KEYS[1], unpack(ARGV))
    return 1
end
return 0


4. 단순 속도 제한



설명



속도 제한에 Redis를 사용하는 경우 Lua는 논리 속도 제한 논리를 결합하는 데 도움이 될 수 있습니다.

예시




> evalsha 089ccf077629d371793d5e928a3f06e9e483eb08 1 ratelimit:127.0.0.1 5 10000
(integer) 0
> evalsha 089ccf077629d371793d5e928a3f06e9e483eb08 1 ratelimit:127.0.0.1 5 10000
(integer) 0
> evalsha 089ccf077629d371793d5e928a3f06e9e483eb08 1 ratelimit:127.0.0.1 5 10000
(integer) 0
> evalsha 089ccf077629d371793d5e928a3f06e9e483eb08 1 ratelimit:127.0.0.1 5 10000
(integer) 0
> evalsha 089ccf077629d371793d5e928a3f06e9e483eb08 1 ratelimit:127.0.0.1 5 10000
(integer) 0
> evalsha 089ccf077629d371793d5e928a3f06e9e483eb08 1 ratelimit:127.0.0.1 5 10000
(integer) 1


루아 소스:

local cnt = redis.call('INCR', KEYS[1])
if cnt > tonumber(ARGV[1])
then
  return 1
end
if cnt == 1
then
  redis.call('PEXPIRE', KEYS[1], ARGV[2])
end
return 0


5. 여러 세트의 값



설명



여러 세트에서 값을 확인해야 하는 사용 사례가 있는 경우. 이 Lua 스크립트는 구현에 확실히 도움이 되며 네트워킹 호출을 피합니다.

예시




> sadd users alice bob
(integer) 2
> sadd admin jenny
(integer) 1
> evalsha d7550c872f553141096d5134c027af5eeed283db 2 users admin alice
(integer) 1
> evalsha d7550c872f553141096d5134c027af5eeed283db 3 users admin guests jenny
(integer) 1
> evalsha d7550c872f553141096d5134c027af5eeed283db 2 users admin abner
(integer) 0


루아 소스:


-- Is an item in any of several sets? Call with:
-- EVALSHA  n set1 set2 ... setn key
for i=1,#KEYS do
  if redis.call('sismember', KEYS[i], ARGV[1]) == 1 then
    return 1
  end
end
return 0



출처: https://www.redisgreen.com/library/

좋은 웹페이지 즐겨찾기