redis是一款基于内存的进程间键值对存储系统,相比传统关系型数据库速度极快,利用在中小范围Web利用中已变成一定要选择。
在 Java 开发中,常常会遇到在操作 Redis 时遇到一些过期数据(Expired Data)的现象,常见的名词有 dirty read、clobbering,本文介绍怎么处理 Java 操作 Redis 时的过期数据问题。
一般来讲,在操作 Redis 时,客户端程序会设置该 key 的有效时间 expiryTime,如果这个要求履行时间太长,而 expiryTime 的时候到了,那末会出现 dirty read、clobbering 的情况,这样就会影响程序的正常履行,故解决这个问题十分重要。
一种常见的做法是,在取出 expiryTime 的同时,客户端程序会生成一个随机的字符串 randomString,然后将 randomString 作为 key 的 prefix,最后将该 prefix 分别加入到 key 中。其对应的代码以下:
String randomString = UUID.randomUUID().toString();
String keyWithPrefix = randomString + “:” + key;
// 判断 key 会不会存在
boolean keyExists = jedis.exists(keyWithPrefix);
if(!keyExists){
jedis.set(keyWithPrefix, value, expiryTime);
}
为了不出现 dirty read、clobbering,可以在设置 key 时加入 NX 选项,如果 key 已存在,那末操作失败,有效避免了过期数据的冲击,其对应代码以下:
String randomString = UUID.randomUUID().toString();
String keyWithPrefix = randomString + “:” + key;
// 设置 key 上限
jedis.set(keyWithPrefix, value, “NX”, “PX”, expiryTime);
最后,也能够利用 Redis 的事务来处理上述问题,其 对应代码以下:
String randomString = UUID.randomUUID().toString();
String keyWithPrefix = randomString + “:” + key;
String keyWithExpiry = keyWithPrefix + “:ttl”;
// 事务操作
Transaction multi = jedis.multi();
multi.set(keyWithPrefix, value);
multi.set(keyWithExpiry, expiryTime);
multi.exec();
以上是处理 Java 操作 Redis 过期数据问题的几种经常使用做法,这些方法可以有效解决问题,帮助开发者提高工作效力,增强安全性。
本文来源:https://www.yuntue.com/post/215088.html | 云服务器网,转载请注明出处!

微信扫一扫打赏
支付宝扫一扫打赏