首页 雷火电竞官网正文

皮冻的熬制方法,面试官问:Redis的操作怎么与数据库业务保持一致-雷火电竞安卓app

admin 雷火电竞官网 2019-11-05 261 0

每天共享java干货,欢迎重视! 你的成功源于点点滴滴!

  • redis 怎么 与 数据库坚持一致性的问题?

场景:假如咱们在开发过程中遇到这样的一种状况,咱们删去 redis中token 的一同 也需求修正数据库中 贮存的 token 的状况为不可用的状况。假如这个时分咱们不做处理的话,通常是先删去redis中的token,然后在进行数据库的修正。可是假如这个时分redis中的token删去成功了,可是在履行数据库操作之气程序报错了。那这个时分redis中的token现已被删去了,可是数据库中的token状况仍是可用的状况,这个时分就导致了数据不一致的问题。

这时分咱们需求运用一致的业务来进行处理这个问题,.可是假如仅仅单纯的运用数据库业务并不能处理这个问题,由于这个操作也触及到了redis,所以这个时分咱们应该运用 redis业务+数据库的业务 来确保业务一致性的问题。

假如仅仅单纯添加了 @Transactional(声明式业务)只能确保数据库的数据一致性问题,可是是无法操控redis中的业务的。redis中也是存在业务的。

处理方案:

咱们能够运用自定义办法运用编程式业务 咱们运用 begin(即操控reids业务也操控数据库业务)、commit、rollback 都需求完成操控redis业务和数据库业务。

下面直接上代码 ,

  • 这个类 包装了redis业务和数据库业务 ,一同敞开业务,一同提交业务,一同回滚业务

  • redisUtils相关代码:

  • 在写业务代码时 大致这样写

代码如下 自己copy用

RedisDataSoureceTransaction 代码:


@Component
@Scope(ConfigurableListableBeanFactory.SCOPE_PROTOTYPE)
public class RedisDataSoureceTransaction {
@Autowired
private RedisUtil redisUtil;
/**
* 数据源业务管理器
*/
@Autowired
private DataSourceTransactionManager dataSourceTransactionManager;
/**
* 开端业务 选用默许传达行为
*
* @return
*/
public TransactionStatus begin() {
// 手动begin数据库业务
TransactionStatus transaction = dataSourceTransactionManager.getTransaction(new DefaultTransactionAttribute());
redisUtil.begin();//
return transaction;
}
/**
* 提交业务
*
* @param transactionStatus
* 业务传达行为
* @throws Exception
*/
public void commit(TransactionStatus transactionStatus) throws Exception {
if (transactionStatus == null) {
throw new Exception("transactionStatus is null");
}
// 支撑Redis与数据库业务一同提交
dataSourceTransactionManager.commit(transactionStatus);
redisUtil.exec();
}
/**
* 回滚业务
*
* @param transactionStatus
* @throws Exception
*/
public void rollback(TransactionStatus transactionStatus) throws Exception {
if (transactionStatus == null) {
throw new Exception("transactionStatus is null");
}
dataSourceTransactionManager.rollback(transactionStatus);
redisUtil.discard();
}

redisutil相关代码:

/**
* 敞开Redis 业务
*
* @param isTransaction
*/
public void begin() {
// 敞开Redis 业务权限
stringRedisTemplate.setEnableTransactionSupport(true);
// 敞开业务
stringRedisTemplate.multi();
}
/**
* 提交业务
*
* @param isTransaction
*/
public void exec() {
// 成功提交业务
stringRedisTemplate.exec();
}
/**
* 回滚Redis 业务
*/
public void discard() {
stringRedisTemplate.discard();
}

业务的大致模板代码:

@authwared 
private RedisDataSoureceTransaction manualTransaction

TransactionStatus transactionStatus = null;
try {
// // ####敞开手动业务
transactionStatus = manualTransaction.begin();

// 删去或许更新数据库的数据
...........(业务代码省掉)

// 删去或许更新redis的值
.............(业务代码省掉)

// #######提交业务
manualTransaction.commit(transactionStatus);

} catch (Exception e) {
try {
// 回滚业务
manualTransaction.rollback(transactionStatus);
} catch (Exception e1) {
}

}
雷火电竞版权声明

本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。

最近发表

    雷火电竞安卓app_雷火电竞app下载_雷火竞技竞猜平台

    http://www.mr-sportsman.com/

    |

    Powered By

    使用手机软件扫描微信二维码

    关注我们可获取更多热点资讯

    雷火电竞出品