一、Redis的事务(transaction)

1. 事务概念

本质:本质是一组命令的集合,所有的命令按照顺序一次性、串行化地执行,不允许其他命令的加入。Redis通过MULTIEXECWATCH等命令来实现事务功能;在事务执行过程中,服务器不会中断事务而去执行其他客户端命令(具有排他性)。但是redis的事务不支持原子性,因此redis对事务的支持是部分的。

阶段:

- 事务开始

- 命令入队

- 事务执行

阶段描述

事务开始:MULTI命令的执行标志着事务的开始; MULTI命令可以将执行该命令的客户端从非事务状态切换至事务状态。

命令入队:当客户端处于事务状态时,输入的命令不会立即执行,而是将命令入队;服务端会维持一个事务队列,存放这些命令。

事务执行:当输入EXEC命令后,事务被提交并且执行。如果放弃事务,则输入DISCARD命令即可,相关的命令将不会被执行。(事务提交时,相关的命令从前到后依次执行,不会被其他客户端打断)

注意事项:对于一个事务所涉及的指令,如果是命令编译出错,则事务的所有命令都不会执行,而是返回错误信息;如果命令编译通过,但是有部分命令运行出错,不会发生回滚,其他的命令将正常运行(如INCR key,编译正常,但如果key非数值则运行出错,但该运行错误不会影响到其他正常的命令)。因此,Redis中的事务不支持原子性,可能出现部分命令执行成功,部分命令执行失败的现象。

WATCH(监控):watch命令相当于乐观锁,当事务被提交时,如果监控的key被其他的客户端修改,则整个事务队列里的命令都不会被执行,会返回nil,显示事务执行失败。                  (即WATCH执行之后, EXEC执行之前, 有其他客户端修改了监控的key值, 那么当前客户端的事务就会失败。)

2. 悲观锁、乐观锁、CAS(Check And Set)

悲观锁:取数据时锁定数据,从而独占了数据的使用权,其他用户在此期间无法取数据,会处于阻塞状态直到它获得了该数据的锁。悲观锁的实现,有表锁、页锁等。

乐观锁:相比较于悲观锁,乐观锁是一种较为宽松的加锁机制。取数据时不会锁定数据,但是更新数据时会判断数据是否被其他用户更新了,如果发现数据被其他用户更新,则放弃更新,并且重新取数据。乐观锁可以提高系统的吞吐量。乐观锁的实现,如版本控制方法,只有当提交的版本号大于当前数据的版本号,才可以对数据进行更新。

CAS:在Redis中,通过CAS实现乐观锁。

二、Redis的发布、订阅

含义:一种消息通信模式,pub发送消息,sub订阅消息。

命令:

publish [channel] [message] 发布消息。

subscribe [channel] 订阅指定的消息。

psubscribe [channel1] [channel2] ... 订阅多个消息;支持通配符。

Redis学习笔记(3)的更多相关文章

  1. redis 学习笔记(6)-cluster集群搭建

    上次写redis的学习笔记还是2014年,一转眼已经快2年过去了,在段时间里,redis最大的变化之一就是cluster功能的正式发布,以前要搞redis集群,得借助一致性hash来自己搞shardi ...

  2. Redis学习笔记~目录

    回到占占推荐博客索引 百度百科 redis是一个key-value存储系统.和Memcached类似,它支持存储的value类型相对更多,包括string(字符串).list(链表).set(集合). ...

  3. Redis学习笔记4-Redis配置详解

    在Redis中直接启动redis-server服务时, 采用的是默认的配置文件.采用redis-server   xxx.conf 这样的方式可以按照指定的配置文件来运行Redis服务.按照本Redi ...

  4. Redis学习笔记7--Redis管道(pipeline)

    redis是一个cs模式的tcp server,使用和http类似的请求响应协议.一个client可以通过一个socket连接发起多个请求命令.每个请求命令发出后client通常会阻塞并等待redis ...

  5. Redis学习笔记一:数据结构与对象

    1. String(SDS) Redis使用自定义的一种字符串结构SDS来作为字符串的表示. 127.0.0.1:6379> set name liushijie OK 在如上操作中,name( ...

  6. Redis学习笔记之ABC

    Redis学习笔记之ABC Redis命令速查 官方帮助文档 中文版本1 中文版本2(反应速度比较慢) 基本操作 字符串操作 set key value get key 哈希 HMSET user:1 ...

  7. (转)redis 学习笔记(1)-编译、启动、停止

    redis 学习笔记(1)-编译.启动.停止   一.下载.编译 redis是以源码方式发行的,先下载源码,然后在linux下编译 1.1 http://www.redis.io/download 先 ...

  8. Redis学习笔记(二)-key相关命令【转载】

    转自 Redis学习笔记(二)-key相关命令 - 点解 - 博客园http://www.cnblogs.com/leny/p/5638764.html Redis支持的各种数据类型包括string, ...

  9. Redis学习笔记(三)Redis支持的5种数据类型的总结

    继续Redis学习笔记(二)来说说剩余的三种数据类型. 三.列表类型(List) 1.介绍 列表类型可以存储一个有序的字符串列表,常用的操作是向列表两端添加元素,或者获得列表的一段片段.列表类型内部是 ...

  10. Redis学习笔记(二)Redis支持的5种数据类型的总结之String和Hash

    引言 在Redis学习笔记(一)中我们已经会安装并且简单使用Redis了,接下来我们一起来学习下Redis支持的5大数据类型. 简介 Redis是REmote DIctionary Server(远程 ...

随机推荐

  1. DeepWalk论文精读:(3)实验

    模块三 1 实验设计 1.1 数据集 BLOGCATALOG[39]:博客作者网络.标签为作者感兴趣的主题. FLICKR[39]:照片分享网站的用户网络.标签为用户的兴趣群组,如"黑白照片 ...

  2. 一文揭秘测试平台中是如何将测试用例一键转化Jmeter压测脚本

    ​    ​接上篇,一键转化将接口测试平台测试用例转化成Jmeter压测脚本思路,这里我首先在java 上面做了一个简单的实验,看看 转化的中间遇到的问题,这里呢,我只是给了一个简单的demo 版本, ...

  3. 【摘抄】深入解析Windows操作系统

    一.线程是一个进程内部的实体,也是Windows执行此进程时的调度实体.若没有线程,进程的程序将不可能运行.线程包含以下部件: 1.一组代表处理器状态的CPU寄存器中的内容. 2.两个栈:一个用于线程 ...

  4. Android原生多语言切换方案,兼容Android10

    前言 一个应用若需要国际化,至少需要支持中文和英语这两种语言,而同时随着谷歌的系统的更新,安卓系统可以设置当前语言的首选语言.因此,本文立足于此,多语言的切换方案为:App固定的文字内容,跟随系统,中 ...

  5. 树形dp compare E - Cell Phone Network POJ - 3659 B - Strategic game POJ - 1463

    B - Strategic game POJ - 1463   题目大意:给你一棵树,让你放最少的东西来覆盖所有的边   这个题目之前写过,就是一个简单的树形dp的板题,因为这个每一个节点都需要挺好处 ...

  6. mybatis的关系映射

    一.多对一的映射关系 举例:根据员工编号查询员工所在部门的部门信息 第一步,需要在多的一方也就是员工实体类中持有一的一方部门实体类的引用 第二步,在dao接口中声明方法 第三步,在mapper中实现该 ...

  7. oracle常用字符函数

    字符函数: concat:(字符连接函数) --字符连接 select concat('con','cat') from dual; select 'co'||'nc'||'at' from dual ...

  8. Mybatis使用ResultMap

    解决字段名和属性名不一致的问题 - 新建数据库表的字段-这里就不贴上了 在下面链接有 https://www.cnblogs.com/rzkwz/p/12853899.html 设置实体类和数据库字段 ...

  9. Day_13【IO流】扩展案例1_读取项目文件内容并去重

    分析以下需求,并用代码实现: 需求: 读取当前项目下的info1.txt 文件内容如下 : aaaaaaaaaaabbbbbbbbbbbbccdefg 要求将数据去重后写回最终效果 : fgdebca ...

  10. Day_12【集合】扩展案例2_键盘录入一个字符串,对其进行去重,并将去重后的字符串组成新数组

    需求分析:键盘读取一行输入,去掉其中重复字符, 打印出不同的那些字符 思路: 1.键盘录入字符串 2.遍历字符串,将每个字符存储到集合中 3.将集合中重复的字符去掉 4.创建新集合,遍历老集合,获取老 ...