因为 SET
命令和 EXPIRE
/ PEXPIRE
命令组合使用的情况是如此的常见,所以为了方便用户使用这两组命令,Redis 从 2.6.12 版本开始为 SET
命令提供 EX
选项和 PX
选项,用户可以通过使用这两个选项的其中一个来达到同时执行 SET
命令和 EXPIRE
/ PEXPIRE
命令的效果:
这也就是说,如果我们之前执行的是 SET
命令和 EXPIRE
命令:
- EXPIRE key seconds
那么现在只需要执行一条带有 选项的 SET
命令就可以了:
- SET key value
那么现在只需要执行一条带有 PX
选项的 SET
命令就可以了:
使用带有 EX
选项或 PX
选项的 SET
命令除了可以减少命令的调用数量并提升程序的执行速度之外,更重要的是保证了操作的原子性,使得“为键设置值”和“为键设置生存时间”这两个操作可以一起执行。
比如说,前面在实现带有自动移除特性的缓存程序时,我们首先使用了 SET
命令设置缓存,然后又使用了 EXPIRE
命令为缓存设置生存时间,这相当于让程序依次地向 Redis 服务器发送以下两条命令:
- SET key value
与此相反,使用带有 EX
选项或 PX
选项的 SET
命令就没有这个问题:当服务器成功执行了一条带有 EX
选项或 PX
选项的 SET
命令时,键的值和生存时间都会同时被设置好,因此程序就不会出现只设置了值但是却没有设置生存时间的情况。
基于上述原因,我们把前面展示的缓存程序实现称之为“不安全”(unsafe)实现。为了修复这个问题,我们可以使用带有 EX
选项的 SET
命令来重写缓存程序,重写之后的程序正如代码清单 12-2 所示。
代码清单 12-2 重写之后的缓存程序:/expire/volatile_cache.py