预约数据的 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;
// 放入ordernojedis.sadd(ordeNoKey, orderId);
// 放入HashMap 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);
// 更新orderNojedis.srem(ordeNoKey, oldOrderId);
jedis.sadd(ordeNoKey, orderId);
### 五、 总结
以上,我们通过 Redis 成功完成了预约数据的存储及校验,根据Redis灵活的基本类型,搭配不同的数据结构,可以解决大多数复杂数据存储的场景,Redis的高性能和高可用性也让我们的数据存储更加安全可靠。