Redis以及jedis的事务处理

Redis

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

[quote]

首先首先


首先,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 我们就可以轻松地解决这类问题了:


WATCH mykey

val = GET mykey
val = val + 1

MULTI
SET mykey $val
EXEC


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

[/quote]
[quote]

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

[/quote]

[quote]

1.Redis服务端是个单线程的架构,不同的Client虽然看似可以同时保持连接,但发出去的命令是序列化执行的,这在通常的数据库理论下是最高级别的隔离
2. 用MULTI/EXEC 来把多个命令组装成一次发送,达到原子性
3. 用WATCH提供的乐观锁功能,在你EXEC的那一刻,如果被WATCH的键发生过改动,则MULTI到EXEC之间的指令全部不执行,不需要rollback
4. 其他回答中提到的DISCARD指令只是用来撤销EXEC之前被暂存的指令,并不是回滚

[/quote]

Jedis 的8种 事务处理
http://www.open-open.com/lib/view/open1410485827242.html
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值