双重保险使用Redis和锁保障支付安全(支付用到redis和锁)
支付安全是目前很多场景中亟待解决的关键问题。保障支付安全,大 多采用双重保险机制:使用 Redis 和 锁保障支付安全。
Redis 是业界应用非常广泛的一款非关系型数据库,具有高性能、高可用性特性,在传统的 SQL 数据库中也有一定的补充作用。它有一个丰富的功能,可以适用于多种场景,例如订单系统、会员系统等,是在支付中应用对网络安全最为重要的工具。
具体而言,在使用 Redis 来保证支付安全时,我们可以利用 redis 的 hash 键和事务(multi/exec)特性进行双重保障。 操作过程如下:
1.先拿 Redis 尝试增加
hash 键”order_$id”。如果 Redis 成功,并且结果为 1,说明之前没有这个键,否则说明有人在同一瞬间支付,导致 Redis 增加失败,也就是不安全的;
2.将 mySQL 中需要更新的信息写入 Redis 的事务中,然后利用 multi、exec 将网络中的 Redis 事务同步到在 Redis 上执行;
3.如果 Redis 事务执行成功,说明 mySQL 中的内容已经更新,说明支付安全;
4.如果 Redis 事务回滚,说明上一步操作或者 mySQL 更新操作失败,说明存在安全控制,那么将拒绝该次支付。
除了 Redis,锁也是保障支付安全的非常有效的工具,它可以防止多服务器在同一时间完成多项任务的发生。通常情况下,我们会使用乐观锁(Optimistic Lock),在数据库中设置一个版本戳(version),若要修改表中的数据,则对比表中的 version ,如果这个 version 和数据库一致,则执行该语句,并将 version 加1;如果 version 不匹配,则说明有其他线程正在修改数据,那么本次修改将拒绝,然后抛出异常。
我们可以通过利用 Redis 事务和乐观锁来保障支付安全,从而保证在经济交易过程中能够确保最大的安全性和保密性,从而有助于支付安全的维护。
以下是简单的代码示范:
// example code
// redis
redisClient.set(“order_$id”,”1″);
redisClient.multi().exec(function(err){
if (err) {
// transaction fled, payment not allowed
} else {
// Transaction success, let the payment goes through
}
});
// Optimistic Lock
// get the version from database
Table.select(“version”).from(“orders”).where(“id = $id”).getSingleResult(function(err, version) {
// Compare the version with last write
if (version == account.version ) {
// execute SQL
Table.update(“orders”).set(“version”, version + 1).where(“id = $id”).commit(function(err) {
// The payment is considered as safe
})
} else {
// Throw Exception, the payment is not allowed
throw Exception
}
});
相关文章