문자열을 수정하는 경우 redis에는 set, setex,append, incr, decr이 있습니다. 등 중 set 및 setex를 사용하여 기존 문자열을 수정하면 원래 설정된 만료 시간이 재설정됩니다. 엄밀히 말하면 set 및 setex는 "수정"이 아니라 덮어쓰기이므로 원래 설정된 키-값을 설정해야 합니다. 다시 setexed하면 이 키가 원래 키를 덮어씁니다. try redis를 사용한 테스트 결과는 다음과 같습니다.
append, incr, decr 및 기타 명령을 사용하여 수정하면 원래 만료 시간이 재설정되지 않습니다.
따라서 문자열 구조의 경우, set /setex 명령을 수행하면 만료 시간이 재설정되고, set 명령은 만료 시간이 만료되지 않도록 직접 변경합니다.
예를 들어 {key1:value}를 7:00에 설정하면 만료 시간은 30분이고, 이 키의 값을 7:00에서 7:30 사이에 여러 번 설정/설정하면 만료 시간은 key1은 재설정됩니다. 7시 30분에 만료되지 않습니다. 이 만료 키를 설정한 후 만료 시간이 매번 새로 고쳐지지 않고 만료 시간이 7시 30분에 안정적으로 유지되도록 하는 방법은 무엇입니까?
방법 1:
Timer를 사용하여 처음 설정할 때 타이머를 생성하고 만료되면 키를 삭제하세요. 이 방법은 데이터 양이 많을 때 더 많은 CPU 리소스를 차지하므로 권장되지 않습니다.
방법 2:
키 값을 설정하기 전 매번 이때 키의 남은 만료 시간을 반환하고, setex 중 남은 만료 시간을 키에 새로운 만료 시간으로 할당하면 해결 가능한 문제 .
Spring 프로젝트를 예로 들면, redisTemplate.getExpire(String key) 메소드에서 반환한 남은 만료 타임스탬프(밀리초 수준)를 사용하면 문제를 해결할 수 있습니다. 기본적으로 PTTL 명령을 redis로 보내 나머지를 반환합니다. 밀리초 단위로 키가 만료됩니다.
코드 예:
key1이 수정될 때마다 처음 설정된 만료 시간을 유지하도록 합니다.
//获取key1的剩余时间的时间戳 Long expire = redisTemplate.getExpire("key1"); //最后一个参数可以选秒、毫秒(TimeUnit.MILLISECONDS),Redis最多只能返回毫秒级别的key的剩余过期时间 redisTemplate.opsForValue().set(key, value, expire, TimeUnit.SECONDS);
문자열 형식의 K-V 유효 기간은 값 값이 수정됨에 따라 재설정됩니다.
K-V가 있는 경우 만료 시간은 30초입니다. 값 값이 수정되면 만료 시간이 30초로 재설정됩니다. 원래 설정된 시간에서 손실된 시간을 빼는 대신 30초.
문자열 데이터 구조를 제외하고 다른 데이터 구조를 수정해도 만료 시간이 재설정되지 않습니다.
예: hash, set, Zset, list 등:
해시를 예로 들어:
해시의 유효기간은 재설정되지 않습니다. 해시 필드 값이 수정됨에 따라 타이밍이 다시 시작됩니다.
시간을 다시 지정해야 하는 경우 필드 값 수정 시 유효 기간을 다시 지정해야 합니다.
위 내용은 Redis 만료 시간 문제를 해결하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!