Redis以及jedis的事务处理

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



WATCH mykey

val = GET mykey
val = val + 1

MULTI
SET mykey $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








猜你喜欢

转载自dannyhz.iteye.com/blog/2382225
今日推荐