QAQ。。水稻前两天研究完MySQL的事务,今天看到了Redis,也产生了兴趣。准备下手看看

菜瓜:哥,你在看啥呢,这么专注

水稻:在看Redis的事务,有点收获

菜瓜:真的吗?科普一下呗!

水稻:嗯,从与MySQL的不同点开始说,Redis的事务不支持事务的原子性,事务内的一组操作并不支持异常回滚。这里分为两种情况

  • 语法异常:类比java编译时异常,事务中出现语法错误,譬如set误写成sett等。在提交的时候就能检查出来,整个事务都不会执行
  • 业务异常:类比java的运行时异常,譬如将list的命令操作在string上。命令提交的时候检测不出来,可以正常提交,错误的命令不能执行,其他的命令正常执行,不会回滚

菜瓜:Redis为什么这么豪横

水稻:搜索官方文档可以发现

  • 根本原因可能还是Redis的定位是缓存。不加入回滚逻辑可以使它简洁,快速
  • 官方解释是:运行时的异常不应该发生在生产环境,就是Redis不应为程序员的bug买单
  • Redis可以以脚本的形式支持事务的执行。历史原因,先出现了事务,后出现的脚本。暂时不打算撤销事务的功能,它提供了无脚本也能支持简单事务的功能,但是如果随着后续脚本方案的流行可能会在后续版本移除事务功能

菜瓜:厉害了。我还听说过Discard和Watch命令?能说说吗

水稻:

  • Discard支持在事务内部主动撤销事务,该命令会清空事务队列。
  • Watch命令则是提供一种CAS乐观锁的机制,可以变相的支持事务的隔离性,可以事先监听关注的key,其他事务如果在当前事务执行前修改了监听的key,那么当前事务就会被取消。程序要做的就是监听到失败的结果,然后进行重试。
    • 举个栗子
    • 第一个客户端 开启事务multi get k1 ,set k2 aaa
    • 第二个客户端 开启事务multi del k1 , exec  
    • 第一个客户端 提交事务exec , 会发现k2是可以set成功的
    • 如果在第一个客户端开启事务之前监听k1的变化,那么k2是会set失败的

菜瓜:懂了!!懂了 

    

总结:

  1. Redis事务不支持回滚操作,语法错误直接取消入队的所有命令。运行时错误不会执行错误后的操作。
  2. 要想做事务操作可以使用watch机制监听key失效事件,自己做cas操作。或者使用脚本执行完整事务

Redis:对比一下Redis和MySQL的事务的更多相关文章

  1. Memcached与Redis对比,Redis基础笔记回顾

    Memcached 1.为什么要把数据存入内存?快 2.Memcached和Redis的区别 (1)Memcached缓存.Redis数据库,Memcached不支持持久化到磁盘 (2)Redis提供 ...

  2. redis与mysql性能对比、redis缓存穿透、缓存雪崩

    写在开始 redis是一个基于内存hash结构的缓存型db.其优势在于速读写能力碾压mysql.由于其为基于内存的db所以存储数据量是受限的. redis性能 redis读写性能测试redis官网测试 ...

  3. memcache,redis对比

    一.问题:     数据库表数据量极大(千万条),要求让服务器更加快速地响应用户的需求.   二.解决方案:      1.通过高速服务器Cache缓存数据库数据      2.内存数据库     ( ...

  4. 网站缓存技术总结( ehcache、memcache、redis对比)

    网站技术高速发展的今天,缓存技术已经成为大型网站的一个关键技术,缓存设计好坏直接关系的一个网站访问的速度,以及购置服务器的数量,甚至影响到用户的体验. 网站缓存按照存放的地点不同,可以分为客户端缓存. ...

  5. Memcached和Redis对比和适用场景

    关于memcached和redis的使用场景,根据大神们的讨论和我在网上查到的资料,总结一下: 两者对比: redis提供数据持久化功能,memcached无持久化: redis的数据结构比memca ...

  6. redis 笔记06 发布与订阅、事务、慢查询日志、监视器

    发布与订阅 1. 服务器状态在pubsub_channels字典保存了所有频道的订阅关系:SUBSCRIBE命令负责将客户端和被订阅的频道关联到这个字典里面,而UNSUBSCRIBE命令则负责 解除客 ...

  7. memcached与redis 对比

    一. 综述 读一个软件的源码,首先要弄懂软件是用作干什么的,那memcached和redis是干啥的?众所周知,数据一般会放在数据库中,但是查询数据会相对比较慢,特别是用户很多时,频繁的查询,需要耗费 ...

  8. redis 在 php 中的应用(事务 [ Transaction ] 篇)

    本文为我阅读了 redis参考手册 之后编写,注意 php_redis 和 redis-cli 的区别(主要是返回值类型和参数用法) 目录: Transaction(事务) WATCH UNWATCH ...

  9. Redis(二)-- 发布订阅、事务、安全、持久化

    一.Redis发布订阅 Redis 发布订阅(pub/sub)是一种消息通信模式:发送者(pub)发送消息,订阅者(sub)接收消息. 打开两个窗口:session1 和 session2 在sess ...

  10. 架构师养成记--33.Redis哨兵、redis简单事务

    Redis哨兵 有了主从复制,如果我想想对主从服务器进行监控,在redis2.6后提供了哨兵机制,2.6有哨兵1.0版本,并不稳定.2.8以后的哨兵功能才稳定起来. 顾名思义,哨兵就是监控Redis系 ...

随机推荐

  1. 玩转代码:深入GitHub,高效管理我们的“shou学”平台源代码

    玩转代码:深入GitHub,高效管理我们的"shou学"平台源代码 在当今快节奏的开发世界中,有效地管理代码不仅仅是一种良好实践,更是一种必需.无论您是独立开发者还是大型团队的一员 ...

  2. 搭建阅读linux源码的舒适环境(vscode+clangd)

    准备linux源码 linux官网下载源码压缩包 https://www.kernel.org/ 解压 由于源码是经过两次压缩的,所以需要解压两次 xz -d linux-6.14.7.tar.xz ...

  3. [HITCON 2017]SSRFme 1 Perl GET任意命令执行漏洞

    [HITCON 2017]SSRFme 1 学到了perl的open中的命令执行漏洞,参考了这篇博客大佬一的博客和这篇大佬二的博客 open漏洞 在perl语言中,open函数存在命令执行漏洞:如果o ...

  4. Java 17 java.util.HashSet 类源码分析

    在绍了 Map 集合的一种典型实现 HashMap之后 ,我们知道,自Java 8起HashMap 是由数组+但链表+红黑树构成,相对于早期版本的 HashMap 实现,新增了红黑树作为底层数据结构, ...

  5. 关于cc1链-lazymap版复现

    关于cc1链-lazymap版复现 思路,在cc链中最重要的其实是transform方法;其反射调用执行的性质+transformchain性质,导致可以通过构造反射调用链子,也就是Runtime.e ...

  6. FFmpeg开发笔记(六十四)使用国产的RedPlayer播放器观看网络视频

    ​RedPlayer是小红书基于FFmpeg4.3研发并开源的国产播放器,它可运行于Android和iOS系统,既支持播放本地视频文件,也支持播放网络上的流媒体链接.有关FFmpeg在Android平 ...

  7. Astah Community安装教程及使用说明(包括括菜单命令解释、操作向导说明、快捷命令说明)

    一.安装教程: 1.双击下载好的文件,允许安装(现在官网已经停刊免费的社区版了,如果想要下载社区版需要从其他地方寻找资源) 2.选择安装的语言,English,点击OK 3.next,接受协议,nex ...

  8. Go语言new和make的区别

    一.简单说明 方法 作用 作用对象 返回值 new 分配内存 值类型和用户定义的类型 初始化为零值,返回指针 make 分配内存 内置引用类型(map,slice,channel) 初始化为零值,返回 ...

  9. 爆肝整理!0 基础 AI 编程必拿的 3 大神器:源码一键跑 + 推广秘籍 + 私教答疑

    2025年预期的 AI 应用爆发并没有到来,但是编程领域却是个特例.AI 编程工具正在引领大模型落地的浪潮,展现出明显的产品市场契合度(Product Market Fit,PMF). 那么在全面智能 ...

  10. Linux搭建Docker环境

    安装Docker CE 安装Docker的依赖库. yum install -y yum-utils device-mapper-persistent-data lvm2 添加Docker CE的软件 ...