Я обнаружил странную проблему в prod, что я установил ключ с временем истечения с помощью команды StringRedisTemplate.expireAt
, но он вообще не истекает, поэтому я пишу следующий тестовый код и нахожу, что метод expireAt
действительно не работает какожидается, но expire
работает:
log.info("====================TEST====================");
StringRedisTemplate stringRedisTemplate = context.getBean(StringRedisTemplate.class);
for (int i= 0;i<10;i++) {
String KEY = "TEST_LJJ_KEY_"+System.currentTimeMillis()+"_"+i;
long expireAt = System.currentTimeMillis() +500;
String val = "expireAt@"+expireAt;
Boolean firstSet = stringRedisTemplate.opsForValue().setIfAbsent(KEY, val);//
if (firstSet != null && firstSet) {//first set, then set an expire time
Date expireAtDate = new Date(expireAt);
stringRedisTemplate.expireAt(KEY,expireAtDate );//NOT WORKING!!!
//stringRedisTemplate.expire(KEY,500,TimeUnit.MILLISECONDS); // THIS WORKS
log.info("===================={} expireAt {} ====================",KEY,expireAtDate);
}
try {
Thread.sleep(700);//wait it expire
} catch (InterruptedException e) {
e.printStackTrace();
}
//CHECK.....
log.info("after expireAT {} value --->{}, now:{} ",KEY,stringRedisTemplate.opsForValue().get(KEY), System.currentTimeMillis());
log.info("after expireAT {} pttl --->{}, now:{}",KEY,stringRedisTemplate.getExpire(KEY,TimeUnit.MILLISECONDS), System.currentTimeMillis());
}
Вот выходные данные, как вы можете видеть, у нас есть время ожидания 500 мс для каждой клавиши и 700 мс (достаточно долго, чтобы истечь), после чего мы пытаемся получить это значениеи обнаруживает, что он действительно существует, и когда мы получаем его ttl, я обнаруживаю, что это ttl очень очень большой, кажется, что redis использует команду expire, а не команду expireAt. * 1007 *
[INFO][2019-10-21 10:19:47,819][main] >>> ====================TEST====================
[INFO][2019-10-21 10:19:48,099][main] >>> ====================TEST_LJJ_KEY_1571624387821_0 expireAt 2019-10-21T10:19:48.321+0800 ====================
[INFO][2019-10-21 10:19:48,878][main] >>> after expireAT TEST_LJJ_KEY_1571624387821_0 value --->expireAt@1571624388321, now:1571624388878
[INFO][2019-10-21 10:19:49,192][main] >>> after expireAT TEST_LJJ_KEY_1571624387821_0 pttl --->1571624387231, now:1571624389192
[INFO][2019-10-21 10:19:49,402][main] >>> ====================TEST_LJJ_KEY_1571624389192_1 expireAt 2019-10-21T10:19:49.692+0800 ====================
[INFO][2019-10-21 10:19:50,202][main] >>> after expireAT TEST_LJJ_KEY_1571624389192_1 value --->expireAt@1571624389692, now:1571624390202
[INFO][2019-10-21 10:19:50,451][main] >>> after expireAT TEST_LJJ_KEY_1571624389192_1 pttl --->1571624388645, now:1571624390451
[INFO][2019-10-21 10:19:50,647][main] >>> ====================TEST_LJJ_KEY_1571624390451_2 expireAt 2019-10-21T10:19:50.951+0800 ====================
[INFO][2019-10-21 10:19:51,450][main] >>> after expireAT TEST_LJJ_KEY_1571624390451_2 value --->expireAt@1571624390951, now:1571624391450
[INFO][2019-10-21 10:19:51,706][main] >>> after expireAT TEST_LJJ_KEY_1571624390451_2 pttl --->1571624389892, now:1571624391706
[INFO][2019-10-21 10:19:51,862][main] >>> ====================TEST_LJJ_KEY_1571624391707_3 expireAt 2019-10-21T10:19:52.207+0800 ====================
[INFO][2019-10-21 10:19:52,654][main] >>> after expireAT TEST_LJJ_KEY_1571624391707_3 value --->expireAt@1571624392207, now:1571624392654
[INFO][2019-10-21 10:19:52,898][main] >>> after expireAT TEST_LJJ_KEY_1571624391707_3 pttl --->1571624391172, now:1571624392898
[INFO][2019-10-21 10:19:53,061][main] >>> ====================TEST_LJJ_KEY_1571624392898_4 expireAt 2019-10-21T10:19:53.398+0800 ====================
[INFO][2019-10-21 10:19:53,841][main] >>> after expireAT TEST_LJJ_KEY_1571624392898_4 value --->expireAt@1571624393398, now:1571624393841
[INFO][2019-10-21 10:19:54,118][main] >>> after expireAT TEST_LJJ_KEY_1571624392898_4 pttl --->1571624392350, now:1571624394118
[INFO][2019-10-21 10:19:54,291][main] >>> ====================TEST_LJJ_KEY_1571624394118_5 expireAt 2019-10-21T10:19:54.618+0800 ====================
[INFO][2019-10-21 10:19:55,079][main] >>> after expireAT TEST_LJJ_KEY_1571624394118_5 value --->expireAt@1571624394618, now:1571624395079
[INFO][2019-10-21 10:19:55,344][main] >>> after expireAT TEST_LJJ_KEY_1571624394118_5 pttl --->1571624393565, now:1571624395344
[INFO][2019-10-21 10:19:55,498][main] >>> ====================TEST_LJJ_KEY_1571624395344_6 expireAt 2019-10-21T10:19:55.844+0800 ====================
[INFO][2019-10-21 10:19:56,276][main] >>> after expireAT TEST_LJJ_KEY_1571624395344_6 value --->expireAt@1571624395844, now:1571624396276
[INFO][2019-10-21 10:19:56,506][main] >>> after expireAT TEST_LJJ_KEY_1571624395344_6 pttl --->1571624394835, now:1571624396506
[INFO][2019-10-21 10:19:56,658][main] >>> ====================TEST_LJJ_KEY_1571624396506_7 expireAt 2019-10-21T10:19:57.006+0800 ====================
[INFO][2019-10-21 10:19:57,435][main] >>> after expireAT TEST_LJJ_KEY_1571624396506_7 value --->expireAt@1571624397006, now:1571624397435
[INFO][2019-10-21 10:19:57,672][main] >>> after expireAT TEST_LJJ_KEY_1571624396506_7 pttl --->1571624395991, now:1571624397672
[INFO][2019-10-21 10:19:57,825][main] >>> ====================TEST_LJJ_KEY_1571624397672_8 expireAt 2019-10-21T10:19:58.172+0800 ====================
[INFO][2019-10-21 10:19:58,601][main] >>> after expireAT TEST_LJJ_KEY_1571624397672_8 value --->expireAt@1571624398172, now:1571624398601
[INFO][2019-10-21 10:19:58,836][main] >>> after expireAT TEST_LJJ_KEY_1571624397672_8 pttl --->1571624397162, now:1571624398836
[INFO][2019-10-21 10:19:58,988][main] >>> ====================TEST_LJJ_KEY_1571624398836_9 expireAt 2019-10-21T10:19:59.336+0800 ====================
[INFO][2019-10-21 10:19:59,764][main] >>> after expireAT TEST_LJJ_KEY_1571624398836_9 value --->expireAt@1571624399336, now:1571624399764
[INFO][2019-10-21 10:19:59,996][main] >>> after expireAT TEST_LJJ_KEY_1571624398836_9 pttl --->1571624398326, now:1571624399996