Redis를 사용하면 사용자는 Lua 스크립트를 사용하여 사용자 정의 스크립트를 작성하고 Redis 서버에서 실행할 수 있습니다. Lua는 단순성, 효율성 및 확장성의 장점을 갖춘 경량 스크립팅 언어입니다. Redis에서 Lua 스크립트는 데이터 필터링, 집계, 정렬 등과 같은 복잡한 데이터 처리에 사용될 수 있으며 Redis 서버의 성능도 향상시킬 수 있습니다.
전통적인 Redis 명령 방법과 비교하여 Lua 스크립트는 다음과 같은 장점이 있습니다.
(2) 네트워크 대기 시간 감소: 여러 Redis 명령을 하나의 Lua 스크립트로 병합하여 간의 네트워크 상호 작용을 줄입니다. 클라이언트와 서버. 동시에 Redis 서버는 서버에서 스크립트의 SHA1 값을 캐시할 수 있는 EVALSHA 명령도 제공합니다. 다음에 동일한 스크립트를 실행할 때 SHA1 값만 전달하면 네트워크 전송 시간이 줄어듭니다.
(2) 원자성 작업: Lua 스크립트는 여러 Redis 명령의 원자성을 보장하고 동시성 문제를 방지할 수 있습니다.
(3) 사용자 정의 명령: Lua 스크립트를 통해 Redis 명령 모음을 확장하고 사용자 정의 명령을 구현할 수 있습니다.
(1) 복잡한 쿼리: 일부 복잡한 쿼리 요구 사항의 경우 Lua 스크립트를 사용하여 클라이언트에서 데이터 처리 문제를 피하고 빠르게 구현할 수 있습니다.
(2) 계산 로직: 계산 로직이 필요한 일부 시나리오의 경우 Redis에 해당 계산 명령이 제공되지 않더라도 Lua 스크립트를 통해 사용자 정의 계산 로직을 구현할 수 있습니다.
(3) 트랜잭션 작업: Lua 스크립트는 Redis 명령 집합의 원자성을 보장할 수 있으므로 Redis에서 트랜잭션 작업을 구현할 수 있습니다.
(4) 실시간 통계: Lua 스크립트는 Redis에서 실시간 UV, PV 및 기타 데이터 계산과 같은 데이터를 실시간으로 계산할 수 있습니다.
Redis Lua 스크립트는 EVAL 명령 또는 EVALSHA 명령을 통해 실행할 수 있습니다.
EVAL script numkeys key [key ...] arg [arg ...] EVALSHA sha1 numkeys key [key ...] arg [arg ...]
여기서 script는 Lua 스크립트의 내용을 나타냅니다. Lua 스크립트에서 작업이 필요합니다. 키-값 쌍의 수는 작동해야 하는 키 값의 이름을 나타내며, arg는 Lua 스크립트에서 작동해야 하는 매개 변수를 나타냅니다.
마지막으로 Java에 통합해 보겠습니다. 다음은 Redis를 Spring Boot와 통합하고 기본 CRUD 작업을 구현하는 간단한 Lua 스크립트 데모입니다(
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency>
# Redis数据库地址 spring.redis.host=127.0.0.1 # Redis端口 spring.redis.port=6379 # Redis密码(如果没有密码不用填写) spring.redis.password=
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 작업을 구현하는 데 사용됩니다.
다음으로 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 스크립트를 실행하는 평가 방법을 구현합니다.
마지막으로 RedisCRUD.lua 스크립트를 작성해야 합니다. 이 스크립트는 기본 CRUD 작업을 구현하는 데 사용됩니다.
-- set if KEYS[1] and ARGV[1] then redis.call('SET', KEYS[1], ARGV[1]) return 1 end -- get if KEYS[1] and not ARGV[1] then return redis.call('GET', KEYS[1]) end -- delete if KEYS[1] and not ARGV[1] then redis.call('DEL', KEYS[1]) return 1 end -- exists if KEYS[1] and not ARGV[1] then if redis.call('EXISTS', 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('HSET', KEYS[1], ARGV[1], ARGV[2]) redis.call('EXPIRE', KEYS[1], ARGV[3]) return 1 end -- hget if KEYS[1] and ARGV[1] and not ARGV[2] then return redis.call('HGET', KEYS[1], ARGV[1]) end -- hdelete if KEYS[1] and ARGV[1] and not ARGV[2] then redis.call('HDEL', KEYS[1], ARGV[1]) return 1 end -- hexists if KEYS[1] and ARGV[1] and not ARGV[2] then if redis.call('HEXISTS', 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
마지막으로 RedisService가 정상적으로 작동하는지 테스트하는 테스트 클래스를 작성합니다.
@RunWith(SpringRunner.class) @SpringBootTest public class RedisServiceImplTest { @Autowired private RedisService redisService; @Test public void test() { //第一种方式:执行string的lua redisService.eval("redis.call('SET', 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!