Redis系列六 Redis事务

Redis事务

1、介绍

  在Redis事务中可以一次执行多个命令,本质是一组命令的集合。一个事务中的所有命令都会序列化,按顺序地串行化执行而不会被其它命令插入,不许加塞。

2、事务的作用

  一个队列中,一次性、顺序性、排他性的执行一系列命令。

3、事物执行五中情况   

  case1:正常执行 执行exec全部成功
  Case2:放弃事务 执行Discard
  Case3:全体连坐 在向事物队列中添加命令的时候报错,然后执行Exec会全部失败。
  Case4:冤头债主 在向事物队列中添加命令的时候没有报错,但在执行Exec的时候 某一条命令执行失败,只会影响这一个 其他的会执行成功。这种为部分成功。
  Case5:watch监控
  Redis事物部分支持

4、悲观锁/乐观锁/CAS(Check And Set)

  悲观锁

    悲观锁(Pessimistic Lock), 顾名思义,就是很悲观,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会block直到它拿到锁。

    传统的关系型数据库里边就用到了很多这种锁机制,比如行锁,表锁等,读锁,写锁等,都是在做操作之前先上锁。

  乐观锁
    乐观锁(Optimistic Lock), 顾名思义,就是很乐观,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,

    可以使用版本号等机制。乐观锁适用于多读的应用类型,这样可以提高吞吐量。

    乐观锁策略:提交版本必须大于记录当前版本才能执行更新。

5、watch监控

  Watch指令,类似乐观锁,事务提交时,如果Key的值已被别的客户端改变,比如某个list已被别的客户端push/pop过了,整个事务队列都不会被执行。
  通过WATCH命令在事务执行之前监控了多个Keys,倘若在WATCH之后有任何Key的值发生了变化,EXEC命令执行的事务都将被放弃,同时返回Nullmulti-bulk应答以通知调用者事务执行失败。

6、事物的三个阶段   

  开启:以MULTI开始一个事务   

  入队:将多个命令入队到事务中,接到这些命令并不会立即执行,而是放到等待执行的事务队列里面。

  执行:由EXEC命令触发事务。

7、三个特性   

  单独的隔离操作:事务中的所有命令都会序列化、按顺序地执行。事务在执行的过程中,不会被其他客户端发送来的命令请求所打断。
  没有隔离级别的概念:队列中的命令没有提交之前都不会实际的被执行,因为事务提交前任何指令都不会被实际执行,也就不存在”事务内的查询要看到事务里的更新,
  在事务外查询不能看到”这个让人万分头痛的问题。
  不保证原子性:redis同一个事务中如果有一条命令执行失败,其后的命令仍然会被执行,没有回滚。

时间: 2024-12-10 00:24:42

Redis系列六 Redis事务的相关文章

redis系列之redis是什么

一.简介 REmote DIctionary Server(Redis),redis是一个基于内存的单机key/value系统,类似memcached,但支持value为多种形式,包括:字符串(string).链表(list).集合(set).有序集合(sorted set)和hash table 二.特点 1 优点 与memcache和MySQL等类似产品比较,Redis有以下几个优点: (1) 非常丰富的数据结构,且这些数据结构的常见操作均是原子性的: (2) 高速读写.Memcached提

Redis系列一 Redis安装

Redis系列一    Redis安装 1.安装所使用的操作系统为Ubuntu16.04 Redis版本为3.2.9 软件一般下载存放目录为/opt,以下命令操作目录均为/opt [email protected]:/opt# wget http://download.redis.io/releases/redis-3.2.9.tar.gz [email protected]:/opt# tar -zxvf redis-3.2.9.tar.gz [email protected]:/opt/re

10.【Redis系列】Redis的高级应用-GeoHash

原文:10.[Redis系列]Redis的高级应用-GeoHash Redis在3.2版本增加了GEO模板,意味着通过redis可以做附近的人,附近的门店,附近的商场这样的功能. 用数据库来算附近的人 地图元素的位置数据使用二维的经纬度表示,经度范围 (-180, 180],纬度范围 (-90, 90],纬度正负以赤道为界,北正南负,经度正负以本初子午线 (英国格林尼治天文台) 为界,东正西负.比如掘金办公室在望京 SOHO,它的经纬度坐标是 (116.48105,39.996794),都是正数

1.【Redis系列】redis是可以做什么?

原文:1.[Redis系列]redis是可以做什么? Redis是互联网技术领域使用最为广泛的存储中间件.它以其超高的性能.完美的文档.简洁易懂的源码和丰富的客户端库支持在开源中间件领域广受好评.国内外很多大型网站都在使用Redis,比如Twitter.Youporn.Github.腾讯.阿里.京东.华为等等,很多小型公司也在应用. Redis可以做什么呢 Redis的应用非常广泛,我们梳理下redis可以用在哪些方面. 1.记录帖子的点赞数.评论数和点击数 2.记录用户帖子ID的列表,便于快速

5.【Redis系列】Redis的高级应用-位图

原文:5.[Redis系列]Redis的高级应用-位图 假设一个应用场景:我们需要记录用户一年的签到记录,签到了是1,没签是0,记录365天,当用户上亿后,存储空间是惊人的. 为了解决这个问题,redis提供了位图的数据结构.这样每天的签到记录只占据一个位,365天就是365个位,46个字节完全可以容纳下. 位图不是特殊的数据结构,它的内容就是普通的字符串,也就是byte数组,我们可以用set/get方法来设置和获取位图的内容,也可以使用位图操作getbit和setbit将byte数组看成位数组

7.【Redis系列】Redis的高级应用-布隆过滤器

原文:7.[Redis系列]Redis的高级应用-布隆过滤器 拿今日头条来说,它会不停的给我们推荐新的新闻,每次推荐都要去重,过滤掉我们之前看过的内容,今日头条如何做到去重呢,我们上面的HyperLogLog虽然能去重,但是没有办法确认这个新闻有没有被浏览 过,没有pfcontains的方法.有没有更好的解决方案呢? Redis为我们准备了布隆过滤器,是专门用来解决这种去重问题的,它在起去重功能的同时,空间上还可以节约90%,只是稍微有一定的误判率. 什么是布隆过滤器 布隆过滤器可以理解为稍微不

9.【Redis系列】Redis的高级应用-漏斗限流

原文:9.[Redis系列]Redis的高级应用-漏斗限流 漏斗限流是最常用的限流方法之一,顾名思义,这个算法的灵感源于漏斗(funnel)的结构. image.png 漏斗的容量是有限的,如果将漏嘴堵住,然后一直往里面灌水,它就会变满,直至再也装不进去.如果将漏嘴放开,水就会往下流,流走一部分之后,就又可以继续往里面灌水.如果漏嘴流水的速率大于灌水的速率,那么漏斗永远都装不满.如果漏嘴流水速率小于灌水的速率,那么一旦漏斗满了,灌水就需要暂停并等待漏斗腾空. 所以,漏斗的剩余空间就代表着当前行为

8.【Redis系列】Redis的高级应用-简单限流

原文:8.[Redis系列]Redis的高级应用-简单限流 限流在分布式系统中是一个经常被提到的话题,如果当前系统的能力,不足以承受那么大的访问量的时候,那么我们就要阻止外来请求对系统继续施压 实现简单限流 首先我们来看一个常见的简单限流策略,系统要限制每个用户在一定时间内的某个行为只能操作N次,如何是用redis的数据结构来实现这个限流的功能呢. 解决方案 这个限流需求中存在一个滑动时间窗口,想想 zset 数据结构的 score 值,是不是可以通过 score 来圈出这个时间窗口来.而且我们

6.【Redis系列】Redis的高级应用-HyperLogLog

原文:6.[Redis系列]Redis的高级应用-HyperLogLog 老规矩还是先假设一个场景:比如京东的商品详情页,如果需要你来统计每天的UV数据,你会如何实现? 如果是PV就好办了,直接给每个网页增加一个计时器,每个网页增加一个日期,这样一进来incrby一次,最终可以计算出每天的统计所有的PV数据. 但是UV就不一样了,每一个用户进来多次每天也只能算一个UV.无论是登录用户还是未登录用户,都需要给一个唯一的ID来标识. 有可能你已经想到了通过set集合去重的功能,为每一个页面创建一个s