一、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. 初学dp心得

    从STL到贪心,再到现在的动态规划,可以说动态规划真的让我学的有点蒙,对于一些题目,会做,但是不会用DP,现在还不能熟练的写出状态转移方程,更重要的是,自己宛如一个哺乳期的小孩,做题需要套模板,没有模 ...

  2. Codeforce 1155D Beautiful Array(DP)

    D. Beautiful Array You are given an array aa consisting of nn integers. Beauty of array is the maxim ...

  3. 配置中心Apollo搭建全过程

    总体架构 用户在Portal操作配置发布 Portal调用Admin Service的接口操作发布 Admin Service发布配置后,发送ReleaseMessage给各个Config Servi ...

  4. Mybatis使用ResultMap

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

  5. 写了shell脚本想一键启动三台虚拟机的Zookeeper,却不知道为啥总是启动不了

    首先,一键启动的shell脚本是这样的 #! /bin/bash case $1 in "start"){ for i in node01 node02 node03 do ssh ...

  6. PDF怎么转换成Word,免费,完整的那种

      简介 PDF可以分为文字型PDF和图片型PDF,文字型PDF即可以选中文字内容的PDF,反之图片型PDF即无法选中文字的PDF,其内容实际上是图片. 本文针对不同类型,介绍PDF转Word方法,可 ...

  7. CF#132 C. Logo Turtle DP

    C. Logo Turtle 题意 有一个海龟在一个x轴的0点,给出一个由'F','T'组成的字符序列. 海龟要按照这个序列进行行动,如果第i个字符为'F',表示沿当前方向走,'T'表示转身. 现在你 ...

  8. MySQL 主从复制原理及过程讲解

    mysql主从原理描述,摘自老男孩. 下面简 单描述下 MySQL Replication 复制的原理及过程 . 1.在 Slave 服务器上执行 start slave 命令开启主从复制开关,主从复 ...

  9. idea 2020 配置本地 Maven 仓库

    问题: 默认Maven 仓库地址在C盘,C盘是系统盘能少放东西尽量少放. 只需要简单的两步 1.File~Settings 然后搜索 maven 如下图绿框 修改成你自己的 Maven 仓库 2.Fi ...

  10. 在微服务框架Demo.MicroServer中添加SkyWalking+SkyApm-dotnet分布式链路追踪系统

    1.APM工具的选取 Apm监测工具很多,这里选用网上比较火的一款Skywalking. Skywalking是一个应用性能监控(APM)系统,Skywalking分为服务端Oap.管理界面UI.以及 ...