[一]什么是redis的事务
--->redis的事务是一组命令的集合。
--->redis的事务是保证一组命令,要么都执行,要么都不执行。但不支持一组命令中,其中一个或多个执行失败,不支持数据回滚。数据的一致性,由程序员控制。
--->redis的事务还能保证一个事务内的命令依次执行,而不被其他命令插入。试想,客户端 A发送几条命令到redis服务器,客户端B也送了一条命令也到redis服务器上。如果不使用事务,则客户端 B的那条命令就有可能在客户端A的那几条命令中间执行。
 

一个事务从开始到执行会经历以下三个阶段:

  • 开始事务。
  • 命令入队。
  • 执行事务。
序号 命令及描述
1 DISCARD 
取消事务,放弃执行事务块内的所有命令。
2 EXEC 
执行所有事务块内的命令。
3 MULTI 
标记一个事务块的开始。
4 UNWATCH 
取消 WATCH 命令对所有 key 的监视。
5 WATCH key [key ...] 
监视一个(或多个) key ,如果在事务执行之前这个(或这些) key 被其他命令所改动,那么事务将被打断。
 
[二]redis事务大白话
--->利用MULTI开启事务,然后发送一组命令。在利用EXEC去依次执行这一组命令。
--->redis的事务说白了就是,有一个收集器,从客户端接受一组命令,然后一起执行。如果客户端在发送exec前断连,则那组命令是不会被执行的。这就是redis的事务。如下图。
 
[三]redis事务的错误处理
--->如果一个事务中的某个命令执行出错,redis会怎么处理。2.65版本以后。
(1)第一种:命令语法错误。语法错误是指命令不存在活着命令的参数的个数不对。
  处理:如果一组命令中有语法错误的,则所有命令都不会执行。包括那些语法正确的命令。
(2)第二种:运行错误,是指在命令执行时出现错误。比如:散列类型的命令,操作集合类型的键。
  处理:正确的命令会执行,运行错误的命令不会被执行,已经执行的命令的数据也不会回滚。需要程序员自己在代码中实现回滚。
 
 
[四]WATCH命令
--->WATCH  key
--->该命令会监控某个键。其他客户端和当前客户端对该键的值不做修改,那么当前的客户端接下来提出的事务对该键值的操作就可以执行。否则,当前客户端提出的事务中所有的命令不被执行。
--->一旦执行exec后,当前客户端对键的监控就会失效。
--->例子:A客户端在时间点a监控了x键,B客户端或者A客户端在时间点b(b在a之后)对x键的值做了修改。同时,A客户端用MULTI提出一个事务,发送了一组命名。那么改组命令,在等到A客户端发送EXEC去执行整组命令的时候,该组所有的命令不会被执行。如下图模拟。
 
[五]UNWATCH命令
--->unwatch命令可以取消对所有key键的监控。从而不会因为在事务提交执行时,因为监控后,事务声明前有客户端对键做了修改,而阻止事务执行。
 
 
[六]过期时间
--->命令:EXPIRE key seconds (单位。秒。必须整数)
--->让某个键在redis服务器上存活seconds秒后,自动删除。
--->设置成功返回:1,设置失败或键不存在返回:0
--->命令:PEXPIRE key millisecond(单位。毫秒。必须是整数)
--->让某个键在redis服务器上存活 millisecond毫秒后,自动删除
--->命令:TTL key
---> 查看某个key还有多长时间被自动删除
--->如果是永久键,返回-1.如果键不存在返回-2,如果是设置了失效的时间的键返回剩余多少秒就失效的秒数。
--->命令:PERSIST key
--->如果想把设置了失效时间的键,变成永久键。则用该命令。
--->如果过期时间被清除返回1,否则返回0(因为键不存在,或是键本来就是永久的)
&&注意点:如果使用watch命令检测一个拥有过期时间的键,该键时间到期自动删除并不回被watch命令认为该键被改变
 
 
[七]排序  (排序对象,集合,有序集合,列表)
---> 命令:SORT key [BY pattern] [LIMIT offset count] [GET pattern [GET pattern ....]] [ASC|DESC] [ALPHA] [STORE destination]
--->该命令可以对列表类型,集合类型和有序集合类型键进行排序。
--->该命令还可以完成与关系数据库中的连接查询相类似的任务
--->sort是redis中最强大,最复杂的命令之一。如果使用不好会造成性能瓶颈。
--->sort命令的时间复杂度是0(n+mlog(m)),其中,n表示要排序的列表(集合或有序集合)中的元素个数,m表示要返回的元素个数。当n较大的时候sort的命令性能越低,并且redis在排序前会建立一个长度为n的容器来存储待排序的元素,虽然是一个临时过程,但如果同时进行较多的大数据量的排序操作则会严重影响性能
--->开发中使用sort命令时需要注意以下几点
1.尽可能减少待排序键中的元素数量(使n尽可能小)
2,使用limit参数只获取需要的数据(使m尽可能小)
3,如果要排序的数据量较大,尽可能使用store参数将结果缓存
 
&例外:当要排序的键类型为有序集合且参考键为常量键名时候容器大小为m,而不是n
 
(1)对列表类型的数据进行排序
(2)对有序集合类型排序会忽略元素的分数,值针对元素自身进行排
(3)SORT命令除了可以排序数字外,还可以通过ALPHA参数实现按照字典顺序排列非数字元素。如果是非数字元素需要排序,没有加ALPHA则会报错
(4)BY 参数:语法:BY 参考键。
-->参考键,可以是字符串类型的键,或者是散列类型的某个字段(表示为:键名->字段名)
-->* 表示匹配集合中的元素。如例子中的post:*。匹配所有post:1,post:2,post:3
-->当参考键名不包含*时(即常量键名),与要排序的键中的元素值无关。sort命令将不会执行排序操作。因为redis认为这种情况是没有意义的。也没有执行排序操作。
-->但是在不需要排序,但需要借助sort命令获得与元素相关联的数据时,常量键名很有用。
-->参考键虽然支持散列类型,但是*只能在->的前边(即键名的部分)才有用。在->后(即字段的部分)会被当成字段名本身而不会被理解成占位符,从而被元素替换。即常量键名。所以redis是按照要排序元素的本身进行排序,而不是按照参考键名对要排序的元素进行排序。
 
(5)GET参数 语法:GET 匹配表达式
--->其不影响排序结果
--->而是从排序结果中,按表达式匹配,返回符合表达式的结果集合。
--->表达式,和by参数的参考键名规则一样,支持字符串和散列类型的键。并使用*作占位符号。
 
(6)STORE 参数   语法:STORE 键名
-->默认情况下SORT会直接返回排序结果,如果希望保存排序结果。可以使用STORE参数。
-->保存后的键为列表类型的。如果键已经存在则覆盖它
-->排序命令加上store的时候,返回的结果是保存在结果键里的元素个数。
 
 
 
 
 
 
 
 

redis之(九)redis的事务机制的更多相关文章

  1. Redis系列九 Redis集群

    1. redis-cluster架构图 redis-cluster投票:容错 架构细节 ①所有的redis节点彼此互联(PING-PONG机制),内部使用二进制协议优化传输速度和带宽. ②节点的fai ...

  2. Redis系列(九):Redis的事务机制

    提到事务,相信大家都不陌生,事务的ACID四大特性,也是面试时经常问的,不过一般情况下,我们可能想到的是传统关系型数据库的事务,其实,Redis也是提供了事务机制的,本篇博客就来讲解下Redis的事务 ...

  3. Redis学习笔记~Redis事务机制与Lind.DDD.Repositories.Redis事务机制的实现

    回到目录 Redis本身支持事务,这就是SQL数据库有Transaction一样,而Redis的驱动也支持事务,这在ServiceStack.Redis就有所体现,它也是目前最受业界认可的Redis ...

  4. REDIS 事务机制

    基本事务操作: 任何数据库都必须要保证一种原子执行操作:最基本的原子执行操作肯定是需要提供: 举一个例子来说明: 当对某个Key 做一个统计: 可能不同的Client做它那部分的统计,一段时间后,服务 ...

  5. redis事务机制和分布式锁

    Redis事务机制 严格意义来讲,Redis的事务和我们理解的传统数据库(如mysql)的事务是不一样的:Redis的事务实质上是命令的集合,在一个事务中要么所有命令都被执行,要么所有事物都不执行.  ...

  6. redis 事务 事务机制详解 MULTI、EXEC、DISCARD、WATCH

    1. Redis服务端是个单线程的架构,不同的Client虽然看似可以同时保持连接,但发出去的命令是序列化执行的,这在通常的数据库理论下是最高级别的隔离2. 用MULTI/EXEC 来把多个命令组装成 ...

  7. Redis的消息订阅及发布及事务机制

    Redis的消息订阅及发布及事务机制 订阅发布 SUBSCRIBE PUBLISH 订阅消息队列及发布消息. # 首先要打开redis-cli shell窗口 一个用于消息发布 一个用于消息订阅 # ...

  8. Redis进阶实践之十九 Redis如何使用lua脚本

    一.引言               redis学了一段时间了,基本的东西都没问题了.从今天开始讲写一些redis和lua脚本的相关的东西,lua这个脚本是一个好东西,可以运行在任何平台上,也可以嵌入 ...

  9. Redis之(四)事务

    5.1开始事务 MULTI 命令的执行标记着事务的开始: 当客户端处于非事务状态下时, 所有发送给服务器端的命令都会立即被服务器执行. Redis 的事务不可嵌套, 当客户端已经处于事务状态, 而客户 ...

  10. 论 大并发 下的 乐观锁定 Redis锁定 和 新时代事务

    在 <企业应用架构模式> 中 提到了 乐观锁定, 用 时间戳 来 判定 交易 是否有效, 避免 传统事务 的 表锁定 造成 的 瓶颈 . 在 现在的 大并发 的 大环境下, 传统事务 及其 ...

随机推荐

  1. Java编程MapReduce实现WordCount

    Java编程MapReduce实现WordCount 1.编写Mapper package net.toocruel.yarn.mapreduce.wordcount; import org.apac ...

  2. Vue.js中的常用的指令缩写

    Vue.js为两个最为常用的指令提供了特别的缩写: v-bind缩写 <!--完整语法--> <a v-bind:href="url">测试</a&g ...

  3. stout代码分析之八:cache类

    stout中实现了LRU cache.cache的成员如下: public: typedef std::list<Key> list; typedef std::tr1::unordere ...

  4. 简单的web小程序

    首先我们先编写一个jsp表面的程序, <%@ page language="java" contentType="text/html; charset=UTF-8& ...

  5. FreeMarker + xml 导出word

    转载自:http://hongqiang.iteye.com/blog/1632998 首先介绍几种java导出word方案 1.Jacob是Java-COM Bridge的缩写,它在Java与微软的 ...

  6. ConvexScore

    题目描述 You are given N points (xi,yi) located on a two-dimensional plane. Consider a subset S of the N ...

  7. 解决Sourcetree 每次拉取提交都需要输入密码

    问题产生背景 客户端领导决定使用http方式拉取和push代码,所以无法使用之前的ssh方式做免密处理 解决办法 方法1:在.git目录中有个config目录,在路径前配置下用户名和密码即可,如下所示 ...

  8. Send Email in Robot Framework Python Using Gmail

    转载自:http://seleniummaster.com/sitecontent/index.php/selenium-robot-framework-menu/selenium-robot-fra ...

  9. 【hdu5217-括号序列】线段树

    题意:给一串括号,有2个操作,1.翻转某个括号.2.查询某段区间内化简后第k个括号是在原序列中的位置.1 ≤ N,Q ≤ 200000. 题解: 可以知道,化简后的序列一定是)))((((这种形式的. ...

  10. 【转】IOS版本自定义字体步骤

    本文转载自:http://quick.cocoachina.com/wiki/doku.php?id=ios%E7%89%88%E6%9C%AC%E4%BD%BF%E7%94%A8%E8%87%AA% ...