Redis过期键判断exists的问题

最近我们发现一个比较奇葩的问题,给大家分享一下为了避免后期产生的漏洞出现:

我们有些项目组经常会使用 redis 中的 exists 命令来判断当前的key和数据值 是否存在 ,这个命令是要结合Redis内存处理机制 组合使用才能实现我们需求;

  1. 单纯的默认方式 ,如果我们设置一个 10秒钟过期的 key 等过期之后 使用 exists key 命令 返回值依然是 1, 判断结果依然是true 的

​ 原因就是:当前的key并没有完全的从内存中删除

  1. 要实现我们的需求我们需要参考配置文件中的 maxmemory-policy(最大内存策略)参数, 默认的配置方式是不让key过期的,具体配置内容说明如下:

    最大内存策略,你有 以下几个选择:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# MAXMEMORY POLICY: how Redis will select what to remove when maxmemory
# is reached. You can select among five behaviors:
#
# volatile-lru -> remove the key with an expire set using an LRU algorithm
# allkeys-lru -> remove any key according to the LRU algorithm
# volatile-random -> remove a random key with an expire set
# allkeys-random -> remove a random key, any key
# volatile-ttl -> remove the key with the nearest expire time (minor TTL)
# noeviction -> don't expire at all, just return an error on write operations
#
# Note: with any of the above policies, Redis will return an error on write
# operations, when there are no suitable keys for eviction.
#
# At the date of writing these commands are: set setnx setex append
# incr decr rpush lpush rpushx lpushx linsert lset rpoplpush sadd
# sinter sinterstore sunion sunionstore sdiff sdiffstore zadd zincrby
# zunionstore zinterstore hset hsetnx hmset hincrby incrby decrby
# getset mset msetnx exec sort
#
# The default is:
#
# maxmemory-policy noeviction

# volatile-lru -> remove the key with an expire set using an LRU algorithm

# volatile-lru -> 使用 LRU 算法移除包含过期设置的 key 。

# noeviction -> don’t expire at all, just return an error on write operations

# noeviction -> 不让任何 key 过期,只是给写入操作返回一个错误

如果要实现我们的需求需要将其修改为:volatile-lru ,请大家相互检查相互通知~