레디스 루아
문맥
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/
Reference
이 문제에 관하여(레디스 루아), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://dev.to/incubus8/redis-lua-4gal
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
> 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
> 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
> 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
> 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
> 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
Reference
이 문제에 관하여(레디스 루아), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/incubus8/redis-lua-4gal텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)