(一)事务的概念

谈到数据库的高级应用,不可避免会谈到事务。熟悉mysql的朋友们对事务肯定不陌生,简单来讲事务就是控制一个数据库操作序列要么全部执行要么全部不执行。今天我们就来了解redis中的事务是如何执行和使用的。

(二)redis事务的操作

在mysql中,事务的执行通过以下三步:


  1. begin 开启事务
  2. commit 提交事务
  3. rollback 回滚操作

而在redis中,事务的执行也主要有三步


  1. multi 开启事务 设定事务的开启位置,后续的所有指令均加入到该事务中
  2. exec 执行事务 设定事务的结束位置,同时开始执行事务
  3. discard 取消事务 取消该事务,放在multi和exec之间

可以看到,当exec执行之后,事务中的所有指令才开始执行。

(四)锁

加锁是实现数据库并发控制的一个非常重要的技术,redis中同样存在锁机制。

4.1 监视锁:


  1. //加锁
  2. watch key1 key2...
  3. //解锁
  4. unwatch

对key添加监视锁,在执行exec之前如果key发生了变化,就会终止事务执行:

在一个客户端中增加监视锁:

此时在另一个客户端中修改name的值

再执行事务会发现事务已经被终止了

4.2 分布式锁:

使用setnx设置一个公共锁


  1. 设置锁
  2. setnx lock-key value
  3. 解锁
  4. del lock-key

对一个key设置公共锁之后,除了设置锁的人之外,其他人只能在外面等待,只有当解锁之后,其他人才能同样再去加锁

其他人再想去加锁时就会失败

4.3 死锁的解决方案

当加锁之后由于宕机的问题没法解锁时,其他人就只能一直等待了。为了解决这个方案,我们可以为锁设置时间限定,如果时间到了还没释放锁,就由系统删除这把锁:


  1. expire lock-key second
  2. pexpire lock-key milliseconds

由于操作通常是毫秒或者微秒级别的,所以锁时间不能设置太长。

最新文章

  1. Openstack Periodic Task
  2. mac下xampp的mysql无法自动启动
  3. IE8兼容性经验小结
  4. Mapreduce体系架构
  5. ionic-native-transitions调用原生页面切换实现ionic路由切换
  6. table-cell的手机应用场景
  7. RFC3261--sip
  8. Unity 单元测试(NUnit,UnityTestTools)
  9. poj 1789 Truck History(kruskal算法)
  10. svn hooks的使用demo
  11. ubuntu14.04下chrome浏览器的安装
  12. 通过crontab调度java -jar任务提示"nohup: failed to run command `java': No such file or directory"
  13. cmd常用命令总结
  14. go里面的指针用法
  15. net core体系-API-1Ocelot-(2)继续深入
  16. mongDb安装
  17. oracle中insert 多条数据方法
  18. 《Linux内核设计与实现》Chapter 1 读书笔记
  19. .net mvc ajax 上传文件
  20. Android零碎知识点 1

热门文章

  1. makefile简单学习(一)
  2. 集合之Map接口
  3. 第40篇-JNIEnv和JavaVM
  4. 《手把手教你》系列技巧篇(四十)-java+ selenium自动化测试-JavaScript的调用执行-下篇(详解教程)
  5. Python3使用request/urllib库重定向问题
  6. Git项目迁移(把当前git项目迁移到新的git地址)
  7. 巧用Python快速构建网页服务器
  8. web页面自动化总结。selenium
  9. GoLang设计模式16 - 模板方法模式
  10. [bzoj4557]侦察守卫