Long expireTime=redisTemplate.boundValueOps(key).getExpire();
int countNow = Integer.valueOf(redisTemplate.boundValueOps(key).get());
获取超时时间expiretime 为0
但是我他妈的居然能拿到key对应的值,是不是redis存磁盘了,还是redis删除数据的机制原因?测试的能行,生产环境就不行了!!
迷茫2017-04-17 17:36:12
Redis 서버, 클러스터 설정, 마스터-슬레이브, 슬레이브에는 데이터가 없으며 이유는 알 수 없습니다. 가상 키를 사용하여 기본 Redis 서버로 데이터를 이동합니다. 가상 키는 재생할 수 없지만 슬레이브 Redis 서비스에는 데이터가 없습니다. 핵심은 메서드를 통해 만료 시간을 0으로 얻을 수 있지만 키에 해당하는 값을 얻을 수 있다는 것입니다. 이제 다른 Redis 서버가 있는데 데이터는 어디에 저장되나요? 만료 값이 0인 이유는 무엇이며, 키에 해당하는 값을 계속 얻을 수 있나요? ? ?
마지막으로 슬레이브 Redis를 종료하고 마스터 서버를 다시 시작한 후 IP를 마스터 Redis 서버로 지정하면 문제가 해결되었습니다.
이유는 불명.
데이터는 어디로 갔나요?
보충사항:
만료시간이 있는 키-값으로 불안정한 키를 설정했다면 주의해주세요! 키를 삭제하기 위해 만료 시간을 0으로 설정하는 방법을 사용하면 Redis가 키를 즉시 삭제하지 못할 수 있습니다.
스프링 데이터 redis의 hasKey 메소드를 사용하여 키가 존재하는지 확인하면 함정에 빠지게 됩니다. 만료 시간이 0이더라도 키가 삭제되지 않았을 가능성이 높기 때문입니다.
Redis는 이 메소드를 사용합니다. 만료된 키의 경우 지연 만료: 키에 액세스할 때 키가 만료되었는지 확인합니다. 만료된 경우 만료 처리를 수행합니다. 둘째, 휘발성 키는 매초 샘플링되고 테스트됩니다. 만료된 키가 있는 경우 모든 만료된 키가 처리됩니다.
이 순찰 속도가 어떤 설정과 관련이 있고 얼마나 효율적인지 우리는 전혀 모릅니다. 따라서 불안정한 키를 설정하고 hasKey를 사용해 판단할 때에는 키의 만료시간을 확보한 후 스스로 판단해야 한다는 점을 참고하시기 바랍니다.
"Redis 설계 및 구현"의 초판에는 원리에 대한 설명이 나와 있습니다. 관심이 있으시면 검색해 보세요.