双重保险使用Redis和锁保障支付安全(支付用到redis和锁)

2023-05-14 19:02:38 用到 保障 支付

支付安全是目前很多场景中亟待解决的关键问题。保障支付安全,大 多采用双重保险机制:使用 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

}

});

相关文章