本文作者:kris

面试题:Redis和MySQL的事务区别是什么?-redis和mysql事务放在一起的问题

kris 2025-01-25 02:48:03 2
面试题:Redis和MySQL的事务区别是什么?-redis和mysql事务放在一起的问题摘要: redis事务和mysql事务有什么区别?mysql事务具有原子性,隔离性,一致性的特点。redis提供multi, exec,watch来支持事务:原子性,一致性:redis保证...

redis事务和mysql事务有什么区别?

mysql事务具有原子性,隔离性,一致性的特点。

redis提供multi, exec,watch来支持事务:

原子性,一致性:

redis保证在multi,exec之间的语句作为一个整体执行,redis在exec后,是无法回滚的,会出现部分成功,部分失败情况。

隔离性(mysql默认可重复读:事务中多次读取同一数据是一致的):

redis的事务类似mysql的串行化隔离界别,执行期间不会乱入其他语句。redis在事务使用乐观锁。

redis通过watch来监测数据,在执行exec前,监测的数据被其他人更改会抛出错误,取消执行。而exec执行时,redis保证不会插入其他人语句来实现隔离。

如何将redis数据同步到mysql?

二者数据同步的关键在于mysql数据库中主键,方案是在redis启动时区mysql读取所有表键值存入redis中,往redis写数据是,对redis主键自增并进行读取,若mysql更新失败,则需要及时清除缓存及同步redis主键。参考代码如下:

String tbname = "login"

;//获取mysql表主键值--redis启动时long id = MySQL.getID(tbname)

;//设置redis主键值--redis启动时redisService.set(tbname, String.valueOf(id))

;System.out.println(id)

;long l = redisService.incr(tbname)

;System.out.println(l)

;Login login = new Login()

;login.setId(l)

;login.setName("redis")

;redisService.hmset(String.valueOf(login.getId()), login)

;boolean b = MySQL.insert("insert into login(id,name) values(" + login.getId()+ ",'" + login.getName() + "')")

;/**** 队列处理器更新mysql失败:

** 清除缓存数据,同时主键值自减*/if (!b){redisService.delKeyAndDecr(tbname, "Login:"+String.valueOf(login.getId()))

;// redisService.delete("Login:"+String.valueOf(login.getId()))

;(tbname);}System.out.println(redisService.exists("Login:"+String.valueOf(login.getId())));

文章版权及转载声明

作者:kris本文地址:https://www.damoyx.com/p/27227.html发布于 2025-01-25 02:48:03
文章转载或复制请以超链接形式并注明出处大漠游侠网

阅读
分享