>  기사  >  데이터 베이스  >  Redis의 Lua 스크립트 구현 방법과 애플리케이션 시나리오는 무엇입니까?

Redis의 Lua 스크립트 구현 방법과 애플리케이션 시나리오는 무엇입니까?

WBOY
WBOY앞으로
2023-05-29 23:10:212544검색

1. Redis Lua 스크립트 개요

Redis를 사용하면 사용자는 Lua 스크립트를 사용하여 사용자 정의 스크립트를 작성하고 Redis 서버에서 실행할 수 있습니다. Lua는 단순성, 효율성 및 확장성의 장점을 갖춘 경량 스크립팅 언어입니다. Redis에서 Lua 스크립트는 데이터 필터링, 집계, 정렬 등과 ​​같은 복잡한 데이터 처리에 사용될 수 있으며 Redis 서버의 성능도 향상시킬 수 있습니다.

2. Redis Lua 스크립트의 장점

전통적인 Redis 명령 방법과 비교하여 Lua 스크립트는 다음과 같은 장점이 있습니다.

  • (2) 네트워크 대기 시간 감소: 여러 Redis 명령을 하나의 Lua 스크립트로 병합하여 간의 네트워크 상호 작용을 줄입니다. 클라이언트와 서버. 동시에 Redis 서버는 서버에서 스크립트의 SHA1 값을 캐시할 수 있는 EVALSHA 명령도 제공합니다. 다음에 동일한 스크립트를 실행할 때 SHA1 값만 전달하면 네트워크 전송 시간이 줄어듭니다.

  • (2) 원자성 작업: Lua 스크립트는 여러 Redis 명령의 원자성을 보장하고 동시성 문제를 방지할 수 있습니다.

  • (3) 사용자 정의 명령: Lua 스크립트를 통해 Redis 명령 모음을 확장하고 사용자 정의 명령을 구현할 수 있습니다.

3. Redis Lua 스크립트의 적용 시나리오

  • (1) 복잡한 쿼리: 일부 복잡한 쿼리 요구 사항의 경우 Lua 스크립트를 사용하여 클라이언트에서 데이터 처리 문제를 피하고 빠르게 구현할 수 있습니다.

  • (2) 계산 로직: 계산 로직이 필요한 일부 시나리오의 경우 Redis에 해당 계산 명령이 제공되지 않더라도 Lua 스크립트를 통해 사용자 정의 계산 로직을 구현할 수 있습니다.

  • (3) 트랜잭션 작업: Lua 스크립트는 Redis 명령 집합의 원자성을 보장할 수 있으므로 Redis에서 트랜잭션 작업을 구현할 수 있습니다.

  • (4) 실시간 통계: Lua 스크립트는 Redis에서 실시간 UV, PV 및 기타 데이터 계산과 같은 데이터를 실시간으로 계산할 수 있습니다.

4. Redis Lua 스크립트 사용 방법

Redis Lua 스크립트는 EVAL 명령 또는 EVALSHA 명령을 통해 실행할 수 있습니다.

 EVAL script numkeys key [key ...] arg [arg ...] 
 EVALSHA sha1 numkeys key [key ...] arg [arg ...]

여기서 script는 Lua 스크립트의 내용을 나타냅니다. Lua 스크립트에서 작업이 필요합니다. 키-값 쌍의 수는 작동해야 하는 키 값의 이름을 나타내며, arg는 Lua 스크립트에서 작동해야 하는 매개 변수를 나타냅니다.

5. Java에서 Redis를 사용하는 Lua 스크립트

마지막으로 Java에 통합해 보겠습니다. 다음은 Redis를 Spring Boot와 통합하고 기본 CRUD 작업을 구현하는 간단한 Lua 스크립트 데모입니다(

5.1). Redis 종속성을 추가하고 pom.xml에 다음 종속성을 추가합니다:

<dependency> 
    <groupId>org.springframework.boot</groupId> 
    <artifactId>spring-boot-starter-data-redis</artifactId> 
</dependency>

5.2 애플리케이션에서 Redis 연결 정보 구성 다음을 추가합니다. .properties로 구성:

# Redis数据库地址 
spring.redis.host=127.0.0.1 
# Redis端口 
spring.redis.port=6379 
# Redis密码(如果没有密码不用填写) 
spring.redis.password=

5.3. Redis Lua 스크립트 정의

Redis에서 Lua 스크립트를 사용하려면 먼저 스크립트를 정의해야 합니다.

  • 코드 문자열 정의에 문자를 사용합니다.

  • 은 RedisTemplate에 정의되어 있습니다.

여기서는 RedisTemplate의 정의 메소드를 사용하고 RedisTemplate의 Bean에 다음 코드를 추가합니다.

 @Bean 
 public RedisScript<Long> redisScript() {
     RedisScript<Long> redisScript = new DefaultRedisScript<>(); 
     redisScript.setLocation(new ClassPathResource("lua/RedisCRUD.lua"));
     redisScript.setResultType(Long.class); 
     return redisScript; 
 }

그중 RedisCRUD.lua가 우리가 정의하려는 Lua 스크립트입니다. script 기본 CRUD 작업을 구현하는 데 사용됩니다.

5.4. RedisService 구현

다음으로 Redis를 작동하기 위해 RedisService를 구현하고 RedisTemplate 및 redisScript를 RedisService에 삽입한 다음 기본 CRUD 작업을 구현해야 합니다.

@Service 
public class RedisServiceImpl implements RedisService { 
    @Autowired 
    private RedisTemplate<String, Object> redisTemplate; 
    @Autowired 
    private RedisScript<Long> redisScript;
    
    public void set(String key, Object value) { 
        redisTemplate.opsForValue().set(key, value); 
    } 
    public Object get(String key) { 
        return redisTemplate.opsForValue().get(key); 
    } 
    public void delete(String key) { 
        redisTemplate.delete(key); 
    } 
    public Boolean exists(String key) { 
        return redisTemplate.hasKey(key); 
    } 
    public Long hset(String key, String field, Object value) { 
        return redisTemplate.opsForHash().put(key, field, value); 
    } 
    public Object hget(String key, String field) { 
        return redisTemplate.opsForHash().get(key, field); 
    } 
    public void hdelete(String key, String... fields) { 
        redisTemplate.opsForHash().delete(key, fields); 
    } 
    public Boolean hexists(String key, String field) {
        return redisTemplate.opsForHash().hasKey(key, field); 
    } 
    public Long eval(String script, List<String> keys, List<Object> args) { 
        return redisTemplate.execute(RedisScript.of(script), keys, args.toArray()); 
    } 
    public Long eval(List<String> keys, List<Object> args) { 
        return redisTemplate.execute(redisScript, keys, args.toArray()); 
    } 
 }

여기에서는 RedisTemplate을 사용합니다. 기본 CRUD 작업과 사용자 정의 Lua 스크립트를 실행하는 평가 방법을 구현합니다.

5.5. Redis Lua 스크립트 작성

마지막으로 RedisCRUD.lua 스크립트를 작성해야 합니다. 이 스크립트는 기본 CRUD 작업을 구현하는 데 사용됩니다.

-- set 
if KEYS[1] and ARGV[1] then 
redis.call(&#39;SET&#39;, KEYS[1], ARGV[1]) 
return 1 
end 
-- get 
if KEYS[1] and not ARGV[1] then 
return redis.call(&#39;GET&#39;, KEYS[1]) 
end 
-- delete 
if KEYS[1] and not ARGV[1] then 
redis.call(&#39;DEL&#39;, KEYS[1]) 
return 1 
end 
-- exists 
if KEYS[1] and not ARGV[1] then 
    if redis.call(&#39;EXISTS&#39;, KEYS[1]) == 1 then 
    return true 
    else 
    return false 
    end 
end 
-- hset 
if KEYS[1] and ARGV[1] and ARGV[2] and ARGV[3] then 
redis.call(&#39;HSET&#39;, KEYS[1], ARGV[1], ARGV[2]) 
redis.call(&#39;EXPIRE&#39;, KEYS[1], ARGV[3]) 
return 1 
end 
-- hget 
if KEYS[1] and ARGV[1] and not ARGV[2] then 
return redis.call(&#39;HGET&#39;, KEYS[1], ARGV[1]) 
end 
-- hdelete 
if KEYS[1] and ARGV[1] and not ARGV[2] then 
redis.call(&#39;HDEL&#39;, KEYS[1], ARGV[1]) 
return 1 
end 
-- hexists 
if KEYS[1] and ARGV[1] and not ARGV[2] then 
    if redis.call(&#39;HEXISTS&#39;, KEYS[1], ARGV[1]) == 1 then 
    return true 
    else 
    return false 
    end 
end

이 스크립트에서는 8가지 작업을 정의합니다. :

  • set: 키 값 설정

  • get: 키에 해당하는 값 가져오기

  • delete: 키 값 삭제

  • exists: 키가 존재하는지 확인

  • hset: 해시 A field-value 설정

  • hget: 해시의 필드에 해당하는 값 가져오기

  • hdelete: 해시의 필드 값 삭제

  • hexists: 필드 여부 결정 hash

5.6. Test RedisService

마지막으로 RedisService가 정상적으로 작동하는지 테스트하는 테스트 클래스를 작성합니다.

@RunWith(SpringRunner.class) 
@SpringBootTest 
public class RedisServiceImplTest { 
    @Autowired 
    private RedisService redisService; 
    @Test 
    public void test() {
        //第一种方式:执行string的lua
        redisService.eval("redis.call(&#39;SET&#39;, KEYS[1], ARGV[1])",Collections.singletonList(hashKey), Collections.singletonList(hashValue));
        //第二种方式:执行lua脚本
        String key ="key";
        String value ="value";
        redisService.eval(Collections.singletonList(hashKey), Collections.singletonList(hashValue));
    }

위 내용은 Redis의 Lua 스크립트 구현 방법과 애플리케이션 시나리오는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 yisu.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제