事务:一组命令集合

主要命令multi 和exec

  1. multi
  2. set a 1
  3. sadd s1 a
  4. ......
  5. exec

错误处理

  • (1)语法错误
  1. 127.0.0.1:6379> multi
  2. OK
  3. 127.0.0.1:6379> set a 1
  4. QUEUED
  5. 127.0.0.1:6379> set b
  6. (error) ERR wrong number of arguments for 'set' command
  7. 127.0.0.1:6379> seta c
  8. (error) ERR unknown command 'seta'
  9. 127.0.0.1:6379> exec
  10. (error) EXECABORT Transaction discarded because of previous errors.
  11. 127.0.0.1:6379> get a
  12. (nil)
  13. 127.0.0.1:6379>

只要有任何一个语法错误,正确的也不会执行

  • (2)运行错误

    比如a是string类型,然后按照hash操作 hset a k1 v1
  1. 127.0.0.1:6379> keys *
  2. (empty list or set)
  3. 127.0.0.1:6379> set a 1
  4. OK
  5. 127.0.0.1:6379> type a
  6. string
  7. 127.0.0.1:6379> multi
  8. OK
  9. 127.0.0.1:6379> set n 1
  10. QUEUED
  11. 127.0.0.1:6379> hset a k1 v1
  12. QUEUED
  13. 127.0.0.1:6379> set m 2
  14. QUEUED
  15. 127.0.0.1:6379> exec
  16. 1) OK
  17. 2) (error) WRONGTYPE Operation against a key holding the wrong kind of value
  18. 3) OK
  19. 127.0.0.1:6379> mget n m
  20. 1) "1"
  21. 2) "2"
  22. 127.0.0.1:6379> type a
  23. string

正确的指令是被执行了,redis事务不支持回滚,所以需要开发者自己处理

开发中规范键名,一般不会出现这种问题

DISCARD取消事务

分布式锁

  1. setnx a:lock 1
  2. expire a:lock 5
  3. del a:lock
为了使setnx和expire能一起执行,而expire的执行又依赖setnx是否成功,显然放事务里是不成立的

setnx和expire组合在一起的原子指令

set a:lock 1 ex 10 nx

以上是这只a:lock 为1 有效期为10s的原子操作

超时问题

Redis 的分布式锁不能解决超时问题,如果在加锁和释放锁之间的逻辑执行的太长,以至于超出了锁的超时限制,就会出现问题。因为这时候第一个线程持有的锁过期了,临界区的逻辑还没有执行完,这个时候第二个线程就提前重新持有了这把锁,导致临界区代码不能得到严格的串行执行。

为了避免这个问题,Redis 分布式锁不要用于较长时间的任务。如果真的偶尔出现了,数据出现的小波错乱可能需要人工介入解决

redis事务,分布式锁的更多相关文章

  1. 基于Redis的分布式锁真的安全吗?

    说明: 我前段时间写了一篇用consul实现分布式锁,感觉理解的也不是很好,直到我看到了这2篇写分布式锁的讨论,真的是很佩服作者严谨的态度, 把这种分布式锁研究的这么透彻,作者这种技术态度真的值得我好 ...

  2. 关于redis实现分布式锁

    前言 分布式锁一般有三种实现方式:1. 数据库乐观锁:2. 基于Redis的分布式锁:3. 基于ZooKeeper的分布式锁.本篇博客将介绍第二种方式,基于Redis实现分布式锁.虽然网上已经有各种介 ...

  3. 【分布式缓存系列】Redis实现分布式锁的正确姿势

    一.前言 在我们日常工作中,除了Spring和Mybatis外,用到最多无外乎分布式缓存框架——Redis.但是很多工作很多年的朋友对Redis还处于一个最基础的使用和认识.所以我就像把自己对分布式缓 ...

  4. Redis之分布式锁

    目录 一.加锁原因 二.原子操作 三.分布式锁 四.分布式锁常见问题 一.加锁原因 在一些比较高并发的业务场景,经常听到通过加锁的方法实现线程安全. 下面简单介绍一下 1.1 加锁方式 数据库锁 数据 ...

  5. 利用redis实现分布式锁

    分布式锁一般有三种实现方式: 1. 数据库乐观锁: 2. 基于ZooKeeper的分布式锁: 3. 基于Redis的分布式锁: 这里大概说一下三种方式的优缺点,数据库乐观锁优点是实现简单,只需要for ...

  6. Java使用Redis实现分布式锁来防止重复提交问题

    如何用消息系统避免分布式事务? - 少年阿宾 - BlogJavahttp://www.blogjava.net/stevenjohn/archive/2018/01/04/433004.html [ ...

  7. 什么是分布式锁?Redis实现分布式锁详解

    在很多场景中,我们为了保证数据的最终一致性,需要很多的技术方案来支持,比如分布式事务.分布式锁等.那具体什么是分布式锁,分布式锁应用在哪些业务场景.如何来实现分布式锁呢?今天继续由陈睿|mikeche ...

  8. 使用 Redis 实现分布式锁(转载)

    背景 在一般的分布式应用中,要安全有效地同步多服务器多进程之间的共享资源访问,就要涉及到分布式锁.目前项目是基于 Tornado 实现的分布式部署,同时也使用了 Redis 作为缓存.参考了一些资料并 ...

  9. 基于redis的分布式锁二种应用场景

    “分布式锁”是用来解决分布式应用中“并发冲突”的一种常用手段,实现方式一般有基于zookeeper及基于redis二种.具体到业务场景中,我们要考虑二种情况: 一.抢不到锁的请求,允许丢弃(即:忽略) ...

随机推荐

  1. 在pom.xml中使用distributionManagement将项目打包上传到nexus私服

    本文介绍 如何在pom.xml中使用distributionManagement将项目打包上传到nexus私服 1.pom.xml文件添加distributionManagement节点 <!- ...

  2. 解决应用程序无法正常启动0xcxxxxxxxxxx问题

    简述:使用VS2008写了一个MFC程序,结果传到别人的机子上(WIN7)出现应用程序正常初始化(0xc0150002)失败的问题.为什么我的机子上可以,而别人的机子上运行不了呢?下面是我找到的一个解 ...

  3. shell脚本中多个条件判断的语法

    if [ "$content" = "hello" ]\ || [ "$content" = "kitty" ] the ...

  4. CCleaner如何禁用开机自动启动

    https://forum.piriform.com/topic/42073-ccleaner-starts-on-startup/ 在options-->setting里面选择开机不启动 在O ...

  5. SDN前瞻 传统网络架构的危机:危机“四”起

    本文基于SDN导论的视频而成:SDN导论 在网络发展速度如此之快的今天,传统网络的架构充满了危机,主要有这四个问题(3+1). 1)传统网络的部署和管理 非常困难 2)分布式网络架构凸显瓶颈 3)流量 ...

  6. python 输出时间

    import datetime print(datetime.datetime.now().time())

  7. python 字典添加元素

    d = {:, :} print(d) d.update({:}) print(d)

  8. Java中的String和StringBuffer

    在任何编程语言中,字符串都是我们编写程序时不可避免要用到的常用的数据类型之一. 对于Java初学者而言,当谈到String和StringBuffer的区别时,通常都会有些困惑. 而要弄清楚两者之间的区 ...

  9. JavaScript权威指南--WEB浏览器中的javascript

    知识要点 1.客户端javascript window对象是所有客户端javascript特性和API的主要接入点.它表示web浏览器的一个窗口或窗体,并且可以用window表示来引用它.window ...

  10. uva11149矩阵快速幂

    求A+A^1+...+A^n 转换一下变成|A  E|,的n+1次方就是|A^(n+1)  A^n+...+A+E| |0  E|                       |    0       ...