Redis脏读潜在的危害(对redis脏读)
Redis脏读是指使用客户端在更新未提交的数据时查询当前数据的方式,这种数据不一定是最新的,而是之前正在更新的未提交的数据(Redis事务未提交前由Redis缓存)。因此,我们可以把Redis未提交的数据称为“脏”数据,Redis脏读是指从Redis中读取未提交的脏数据的过程。
由于Redis中的脏数据未提交,读取的脏数据的结果可能会受到命令执行的并发关系的影响,这可能会导致Redis客户端获取到的数据是错误的、旧的。这也就是我们所说的“Redis脏读”。
Redis脏读可能会给系统带来潜在的危害,尤其是在编写不良的Redis处理代码时,更容易导致脏读出现。最常见的例子就是编写READ-WRITE事务代码时,这类代码查询时,如果出现脏读,可能会导致数据处理出现错误。比如编写订单处理代码时,如果系统出现脏读,那么可能会导致用户下重复订单,从而给系统带来不必要的麻烦以及经济损失。
可以通过以下代码来检测Redis脏读:
try {
String key = "abc"; String value = "old";
jedis.set(key, value); jedis.watch(key); //设置监视key
String newValue = "new"; jedis.set(key, newValue);
if(jedis.get(key).equals(value)) { System.out.println("Dirty Read!");
} else { System.out.println("No Dirty Read!");
}} catch (Exception e) {
System.out.println("Error occured!");}
通过设置监视key,当执行更新操作(更新key值)时,如果发生Redis脏读,即返回的key值没有变,则会显示“Dirty Read!”,否则会显示“No Dirty Read!”。
当使用Redis读写数据时,一定要注意避免出现Redis脏读,以避免给系统带来潜在的危害。