今天我们将来访问Redis,在做一个Redis解决方案,对于处理高并发写入请求,先读后写(Read Before Write) 是一种非常有效的方式。我们先来了解下,先读后写的实现细节
## 先读后写
先读后写(Read before write)是一种常见的数据更新模式,是在处理高并发下请求,多个客户端同时更新同一数据过程中,以保证只有一个客户端能够成功更新数据。
基本步骤如下:
1. 先读出需要数据
2. 然后客户端需要执行更新操作
3. 执行更新操作前先检查刚刚读取的数据是否与当前服务器上的数据吻合,如果吻合则执行更新
4. 更新成功后更新记录到数据库中
## 使用Redis实现
> 下图是实现步骤的示意图:
![read_write_before.png](https://images-cdn.shimo.im/lFm03QmQ98ySlnJY/read_write_before.png “read_write_before.png”)
使用 Redis 实现先读后写,首先我们需要准备的几个步骤:
1. 将数据存储到 Redis:用到hashmap结构
2. 客户端发起查询:使用get操作来读取数据
3. 如果数据不符合要求,发起update:使用watch指令来监控
4. 验证数据:使用multi指令实现原子性
5. 更新数据:使用set指令更新数据
## 示例代码
// 设置watch key,实现监控
String watchKey = "key";
jedis.watch(watchKey);
// 检查key是否存在
String keyValue = jedis.get(watchKey);
// 使用multi多个指令可以实现原子性操作
Transaction tx = jedis.multi();
//update key
tx.set(watchKey, "newValue");
// 执行
List result = tx.exec();
if (result == null || result.isEmpty()) {
System.out.println("exec fled:key is not match");
}
## 总结
综上我们可以使用Redis,来实现先读后写这种更新模式,帮助我们处理高并发环境下read/write操作引起的数据共享冲突,保证数据的一致。
实现代码方面,首先需要在Redis中存储数据,然后使用get操作读取数据,当发现不同步的时候,使用watch实现监控,然后使用multi实现原子性操作,最后执行set更新数据即可。