Redis以及jedis的事务处理

Allchin 2017-06-30

Redis

http://www.open-open.com/lib/view/open1410485827242.html

引用

首先首先

首先,Redis的RDB持久化是在指定的时间间隔内生成数据集的时间点快照,具体过程是:

执行bgsave,redis主进程fork一个子进程;<br>主进程继续处理客户端请求;

子进程将当前时间点的内存快照写到一个dump.rdb文件中;

这个过程并不涉及事务。

其次,Redis中实现事务有2种方式,

一是使用

MULTI

EXEC

DISCARD

WATCH等命令;而是使用Lua脚本事务;具体可以看官方文档:https://link.zhihu.com/?target=http%3A//redis.io/topics/transactions

WATCH我们就可以轻松地解决这类问题了:

WATCHmykey

val=GETmykey

val=val+1

MULTI

SETmykey$val

EXEC

使用上面的代码,如果在

WATCH执行之后,执行之前,有其他客户端修改了mykey的值,那么当前客户端的事务就会失败。通常,都是使用Lua脚本封装多个redis基本命令,来实现一个复杂的事务操作。

引用

DISCARD指令就是用来回滚的,AOF可以配置为每条命令都立即写入磁盘,因此ACID是完全具备的。<br><br>但与很多数据库系统不同的是,Redis采用的是乐观锁,所以在并发的情况下,失败的可能性是很高的。<br><br>再回到你的第一个提问,BGSAVE的进程是不对外提供服务的,响应用户请求的进程一直是一致的。而如上所述,开启AOF后,持久性也是可满足的。只是实际使用中,一般不需要为了极低概率的数据丢失,而去频繁地写入磁盘。<br><br>最后,Redis的事务对处理较复杂的业务需求非常有用。我在把数据迁移到Cassandra的时候,就因为后者只支持很轻量的事务,导致粒度稍大的事务,必须分成很多个小事务来写入(无法保证整个事务的原子性),并且在读取时也必须做各种检查。

引用

1.Redis服务端是个单线程的架构,不同的Client虽然看似可以同时保持连接,但发出去的命令是序列化执行的,这在通常的数据库理论下是最高级别的隔离

2.用MULTI/EXEC来把多个命令组装成一次发送,达到原子性

3.用WATCH提供的乐观锁功能,在你EXEC的那一刻,如果被WATCH的键发生过改动,则MULTI到EXEC之间的指令全部不执行,不需要rollback

4.其他回答中提到的DISCARD指令只是用来撤销EXEC之前被暂存的指令,并不是回滚

Jedis的8种事务处理

http://www.open-open.com/lib/view/open1410485827242.html

相关推荐

DiamondTao / 0评论 2020-08-30