因为 SET 命令和 EXPIRE / PEXPIRE 命令组合使用的情况是如此的常见,所以为了方便用户使用这两组命令,Redis 从 2.6.12 版本开始为 SET 命令提供 EX 选项和 PX 选项,用户可以通过使用这两个选项的其中一个来达到同时执行 SET 命令和 EXPIRE / PEXPIRE 命令的效果:

    这也就是说,如果我们之前执行的是 SET 命令和 EXPIRE 命令:

    1. EXPIRE key seconds

    那么现在只需要执行一条带有 选项的 SET 命令就可以了:

    1. SET key value

    那么现在只需要执行一条带有 PX 选项的 SET 命令就可以了:

    使用带有 EX 选项或 PX 选项的 SET 命令除了可以减少命令的调用数量并提升程序的执行速度之外,更重要的是保证了操作的原子性,使得“为键设置值”和“为键设置生存时间”这两个操作可以一起执行。

    比如说,前面在实现带有自动移除特性的缓存程序时,我们首先使用了 SET 命令设置缓存,然后又使用了 EXPIRE 命令为缓存设置生存时间,这相当于让程序依次地向 Redis 服务器发送以下两条命令:

    1. SET key value
    2.  

    与此相反,使用带有 EX 选项或 PX 选项的 SET 命令就没有这个问题:当服务器成功执行了一条带有 EX 选项或 PX 选项的 SET 命令时,键的值和生存时间都会同时被设置好,因此程序就不会出现只设置了值但是却没有设置生存时间的情况。

    基于上述原因,我们把前面展示的缓存程序实现称之为“不安全”(unsafe)实现。为了修复这个问题,我们可以使用带有 EX 选项的 SET 命令来重写缓存程序,重写之后的程序正如代码清单 12-2 所示。


    代码清单 12-2 重写之后的缓存程序:/expire/volatile_cache.py


    其他信息