预约数据的 Redis 存储实践(预约的数据 redis)

众所周知,Redis 是一款高性能、高可用的内存KV数据库,在我们日常生活中被大量应用在缓存等场景。在数据预约场景中,也可以应用Redis来存储预约数据,并帮助我们解决订单号重复购买的问题;比如购买沉锋云的双11购物节活动票券时。基于Redis数据库,我们来看看一种存储预约数据的实践方案:

### 一、 预约数据模型定义

首先,我们定义预约数据的模型;基础的预约数据可能会包含:订单号、具体商品项目ID、预约数量等属性,具体定义如下:

/**
* Appointment Object
*/
@Setter
@Getter
@NoArgsConstructor
@AllArgsConstructor
public class Appointment implements Serializable {
/**
* 订单号
*/
private String orderNo;
/**
* 商品项目ID
*/
private String itemId;
/**
* 预约数量
*/
private Integer quantity;

}

### 二、 数据存储策略

使用Redis存储预约数据采用的解决方案是:使用Set容器将预约ORDERNO放入到Set容器中,对于对象数据,序列化后使用Hash类型存储,以方便查询。

// 定义key
String ordeNoKey = "orderno:" + orderId;
String itemIdKey = "itemid:" + itemId;
// 放入orderno
jedis.sadd(ordeNoKey, orderId);
// 放入Hash
Map hash = new HashMap();
hash.put("orderId", orderId);
hash.put("itemId", itemId);
hash.put("quantity", quantity);
jedis.hmset(itemIdKey, hash);

### 三、 预约数据校验

以上我们将预约数据存储到Redis这一步已完成,接下来就是预约校验的步骤,我们可以采用:先判断Set容器中是否存在ORDERNO,存在的话则不允许重复预约!

if (jedis.sismember(ordeNoKey, orderId)) {
return false; // 已存在,不允许重复预约!
}

### 四、 预约数据更新

在预约数据发生变化的情况下,我们也可以通过Redis来更新对应的数据;如修改订单号或者变更预约数量:

// 更新Hash
Map hash = new HashMap();
hash.put("orderId", orderId);
hash.put("itemId", itemId);
hash.put("quantity", quantity);
jedis.hmset(itemIdKey, hash);
// 更新orderNo
jedis.srem(ordeNoKey, oldOrderId);
jedis.sadd(ordeNoKey, orderId);

### 五、 总结

以上,我们通过 Redis 成功完成了预约数据的存储及校验,根据Redis灵活的基本类型,搭配不同的数据结构,可以解决大多数复杂数据存储的场景,Redis的高性能和高可用性也让我们的数据存储更加安全可靠。


数据运维技术 » 预约数据的 Redis 存储实践(预约的数据 redis)