Redis基本操作命令
很多网站教程都介绍的很详细的,这里只把主要的介绍一下。对于操作命令大小写不区分(DEL del Del是一样的。对于输入正确的命令,会自动出现后续输入参数提示),但是key是区分大小写的。
key操作
注:Redis是一个key-value的键值对的内存数据库。最基本的一些操作就是对这些key的操作。
DEL
删除Key, del key1 key2
EXISTS
检查key是否存在, EXISTS key
EXPIRE
设置或者更新到期时间,到期后自动清除,单位秒 设置为-1表示永不过期。 EXPIRE key time
PERSIST
移除过期时间,key永久保存。其实就是过期时间设置为-1,永不过期
PTTL
以毫秒为单位返回key剩余的过期时间。
TTL
以秒为单位,返回给定key的剩余生存时间。
EXPIREAT
设置key的过期时间,不过设置的是时间戳。
PEXPIRE
设置key的过期时间,不过是毫秒单位。
PEXPIREAT
设置key的过期时间,不过是时间戳,以毫秒统计。
KEYS pattern
查找匹配给定模式pattern的所有key。
KEYS * 匹配数据库中所有 key 。
KEYS h?llo 匹配 hello , hallo 和 hxllo 等。
KEYS h*llo 匹配 hllo 和 heeeeello 等。
KEYS h[ae]llo 匹配 hello 和 hallo ,但不匹配 hillo 。
特殊符号用 \ 隔开
MOVE key db
把指定的key移动到数据库db中。(默认的redis有16个数据库)
SELECT index
切换数据库(redis默认16个数据库 编号从0开始)
RANDOMKEY
随机获取一个key
RENAME key newkey
修改key名字。如果newkey已经存在,则删除newkey。
RENAMENX key newkey
仅当newkey不存在时,将key改名为newkey。
TYPE key
返回key的类型
string
GET
获取
MGET
获取多个
SET key value [EX seconds][PX milliseconds] [NX|XX]
设置(新增 修改)
EX seconds:设置key的过时时间,单位为秒。
PX milliseconds:设置key的过期时间,单位为毫秒。
NX:(if Not eXist)只有键key不存在的时候才会设置key的值
XX:只有键key存在的时候才会设置key的值
MSET
设置一个
GETRANGE
获取范围段
比如一个value是 qwertyuiop
正序 倒序两种情况。
getrange key 0 4 (qwert)
getrange key -1 -5 (yuiop)
getrange key 0 -1 (qwertyuiop)
------------------------------------------------
q w e r t y u i o p
0 1 2 3 4 5 6 7 8 9
-10 -9 -8 -7 -6 -5 -4 -3 -2 -1
------------------------------------------------
GETSET
设置一个值,然后在返回原来老值。
SETEX key seconds value
设置一个key,并制定他的过期时间,单位秒
PSETEX key milliseconds value
设置一个key,并制定他的过期时间,单位毫秒
SETNX
只有在KEY不存在时设置value。就是新增一个(不包含更新)。
MSETNX
同时设置一个或多个 key-value 对,当且仅当所有给定 key 都不存在。
APPEND key value
追加到末尾。
STRLEN key
长度
INCR key
把key中的数字值增加1
INCRBY key increment
将key所存储的值增加一定数量。
INCRBYFLOAT key increment
增加一定的浮点数。
DECR key
将key存储数字键1
DECRBY key decrement
减去给你的减量值
hash
hash使我们最常用的,因为他可以存储对象,字典等。hash里面是一个string类型的key value映射集合,每一个都叫做域。
HMSET key field value [field value …]
同时将多个 field-value (域-值)对设置到哈希表 key 中。
此命令会覆盖哈希表中已存在的域。
HSET key field value
将哈希表 key 中的域 field 的值设为 value 。
如果 key 不存在,一个新的哈希表被创建并进行 HSET 操作。
如果域 field 已经存在于哈希表中,旧值将被覆盖。
HSETNX key field value
将哈希表 key 中的域 field 的值设置为 value ,当且仅当域 field 不存在。
若域 field 已经存在,该操作无效。
如果 key 不存在,一个新哈希表被创建并执行 HSETNX 命令。
就是不能更新操作。
HMGET key field [field …]
返回哈希表 key 中,一个或多个给定域的值。
如果给定的域不存在于哈希表,那么返回一个 nil 值。
因为不存在的 key 被当作一个空哈希表来处理,所以对一个不存在的 key 进行 HMGET 操作将返回一个只带有 nil 值的表。
HGET key field
返回哈希表 key
中给定域 field
的值。
HGETALL key
返回哈希表 key 中,所有的域和值。
在返回值里,紧跟每个域名(field name)之后是域的值(value),所以返回值的长度是哈希表大小的两倍
HEXISTS key field
查看哈希表 key 中,给定域 field 是否存在。
如果哈希表含有给定域,返回 1 。
如果哈希表不含有给定域,或 key 不存在,返回 0 。
HDEL key field [field …]
删除域
HKEYS key
返回哈希表 key 中的所有域。
HVALS key
返回哈希表 key 中所有域的值。
HLEN key
返回哈希表 key 中域的数量。
HINCRBY key field increment
为哈希表 key 中的域 field 的值加上增量 increment 。
增量也可以为负数,相当于对给定域进行减法操作。
如果 key 不存在,一个新的哈希表被创建并执行 HINCRBY 命令。
如果域 field 不存在,那么在执行命令前,域的值被初始化为 0 。
HINCRBYFLOAT key field increment
为哈希表 key 中的域 field 加上浮点数增量 increment 。
如果哈希表中没有域 field ,那么 HINCRBYFLOAT 会先将域 field 的值设为 0 ,然后再执行加法操作。
如果键 key 不存在,那么 HINCRBYFLOAT 会先创建一个哈希表,再创建域 field ,最后再执行加法操作。
list
列表的特点就是可以头部(左边)或者尾部(右边)插入。入栈push 出栈pop 操作
LPUSH key value [value …]
将一个或多个值 value 插入到列表 key 的表头
如果 key 不存在,一个空列表会被创建并执行 LPUSH 操作。
当 key 存在但不是列表类型时,返回一个错误。
LSET key index value
通过索引设置值
LPUSHX key value
将值 value
插入到列表 key
的表头,当且仅当 key
存在并且是一个列表。
RPUSH key value [value …]
将一个或多个值 value 插入到列表 key 的表尾(最右边)。
如果 key 不存在,一个空列表会被创建并执行 RPUSH 操作。
RPUSHX key value
将值 value
插入到列表 key
的表尾,当且仅当 key
存在并且是一个列表。
LPOP key
移除并返回列表 key 的头元素。
RPOP key
移除并返回列表 key 的尾元素。
BLPOP key [key …] timeout
移出并获取列表的第一个元素, 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止。
BRPOP key [key …] timeout
移出并获取列表的最后一个元素, 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止。
RPOPLPUSH source destination
移除列表的最后一个元素,并将该元素添加到另一个列表并返回
BRPOPLPUSH source destination timeout
从列表中弹出一个值,将弹出的元素插入到另外一个列表
中并返回它; 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止。
LINDEX key index
返回列表 key
中,下标为 index
的元素。
LINSERT key BEFORE|AFTER pivot value
将值 value 插入到列表 key 当中,位于值 pivot 之前或之后。
当 pivot 不存在于列表 key 时,不执行任何操作。多个pivot时只操作第一个。
当 key 不存在时, key 被视为空列表,不执行任何操作。
如果 key 不是列表类型,返回一个错误。
LLEN key
列表数量。
LREM key count value
移除前count个value值。
LRANGE key start stop
查看范围段的value。(可以用来分页)
LRANGE alpha 0 -1 # 查看所有元素
lrange list 0 5 (第一个到第六个)
LTRIM key start stop
对一个列表进行修剪(trim),就是说,让列表只保留指定区间内的元素,不在指定区间之内的元素都将被删除。
set
Redis 的 Set 是 String 类型的无序集合。集合成员是唯一的,这就意味着集合中不能出现重复的数据。
集合除了增删改操作外,主要的是一些集合的运算操作。
SADD key member [member …]
将一个或多个 member 元素加入到集合 key 当中,已经存在于集合的 member 元素将被忽略。
假如 key 不存在,则创建一个只包含 member 元素作成员的集合。
SCARD key
返回集合 key
的基数(集合中元素的数量)
SISMEMBER key member
判断 member
元素是否集合 key
的成员。返回1 表示存在 0表示不存在。
SMEMBERS key
返回集合 key 中的所有成员。
不存在的 key 被视为空集合。
SMOVE source destination member
将 member 元素从 source 集合移动到 destination 集合。
SMOVE 是原子性操作。
如果 source 集合不存在或不包含指定的 member 元素,则 SMOVE 命令不执行任何操作,仅返回 0 。否则, member 元素从 source 集合中被移除,并添加到 destination 集合中去。
当 destination 集合已经包含 member 元素时, SMOVE 命令只是简单地将 source 集合中的 member 元素删除。
当 source 或 destination 不是集合类型时,返回一个错误。
SPOP key
移除并返回集合中的一个随机元素。
如果只想获取一个随机元素,但不想该元素从集合中被移除的话,可以使用 SRANDMEMBER 命令。
SRANDMEMBER key [count]
如果命令执行时,只提供了 key 参数,那么返回集合中的一个随机元素。
从 Redis 2.6 版本开始, SRANDMEMBER 命令接受可选的 count 参数:
如果 count 为正数,且小于集合基数,那么命令返回一个包含 count 个元素的数组,数组中的元素各不相同。如果 count 大于等于集合基数,那么返回整个集合。
如果 count 为负数,那么命令返回一个数组,数组中的元素可能会重复出现多次,而数组的长度为 count 的绝对值。
该操作和 SPOP 相似,但 SPOP 将随机元素从集合中移除并返回,而 SRANDMEMBER 则仅仅返回随机元素,而不对集合进行任何改动。
SREM key member [member …]
移除集合 key 中的一个或多个 member 元素,不存在的 member 元素会被忽略。
当 key 不是集合类型,返回一个错误。
集合运算
SDIFF key [key …]
返回一个集合的全部成员,该集合是所有给定集合之间的差集。
SDIFFSTORE destination key [key …]
这个命令的作用和 SDIFF 类似,但它将结果保存到 destination 集合,而不是简单地返回结果集。
如果 destination 集合已经存在,则将其覆盖。
destination 可以是 key 本身。(如果destination不存在 则新建一个)
SINTER key [key …]
返回一个集合的全部成员,该集合是所有给定集合的交集。
不存在的 key 被视为空集。
当给定集合当中有一个空集时,结果也为空集(根据集合运算定律)。
SDIFFSTORE destination key [key …]
这个命令的作用和 SDIFF 类似,但它将结果保存到 destination 集合,而不是简单地返回结果集。
如果 destination 集合已经存在,则将其覆盖。
destination 可以是 key 本身。
SUNION key [key …]
返回一个集合的全部成员,该集合是所有给定集合的并集。
不存在的 key 被视为空集。
SUNIONSTORE destination key [key …]
这个命令类似于 SUNION 命令,但它将结果保存到 destination 集合,而不是简单地返回结果集。
如果 destination 已经存在,则将其覆盖。
destination 可以是 key 本身。
zset
Redis 有序集合和集合一样也是string类型元素的集合,且不允许重复的成员。
不同的是每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序。
有序集合的成员是唯一的,但分数(score)却可以重复。
zset和set操作基本一本,比set多了一点。
ZADD key score member [[score member][score member] …]
将一个或多个 member 元素及其 score 值加入到有序集 key 当中。
如果某个 member 已经是有序集的成员,那么更新这个 member 的 score 值,并通过重新插入这个 member 元素,来保证该 member 在正确的位置上。
score 值可以是整数值或双精度浮点数。
如果 key 不存在,则创建一个空的有序集并执行 ZADD 操作。
当 key 存在但不是有序集类型时,返回一个错误。
ZCARD key
返回有序集 key
的个数。
ZSCORE key member
返回有序集 key 中,成员 member 的 score 值。
如果 member 元素不是有序集 key 的成员,或 key 不存在,返回 nil 。
ZCOUNT key min max
返回有序集 key 中, score 值在 min 和 max 之间(默认包括 score 值等于 min 或 max )的成员的数量。
关于参数 min 和 max 的详细使用方法,请参考 ZRANGEBYSCORE 命令。
ZINCRBY key increment member
为有序集 key 的成员 member 的 score 值加上增量 increment 。
可以通过传递一个负数值 increment ,让 score 减去相应的值,比如 ZINCRBY key -5 member ,就是让 member 的 score 值减去 5 。
当 key 不存在,或 member 不是 key 的成员时, ZINCRBY key increment member 等同于 ZADD key increment member 。
当 key 不是有序集类型时,返回一个错误。
score 值可以是整数值或双精度浮点数。
ZRANGE key start stop [WITHSCORES]
这个可以用来做分页。
通过索引区间返回有序集合成指定区间内的成员。
返回有序集 key 中,指定区间内的成员。
其中成员的位置按 score 值递增(从小到大)来排序。
具有相同 score 值的成员按字典序(lexicographical order )来排列。
如果你需要成员按 score 值递减(从大到小)来排列,请使用 ZREVRANGE 命令。
下标参数 start 和 stop 都以 0 为底,也就是说,以 0 表示有序集第一个成员,以 1 表示有序集第二个成员,以此类推。
你也可以使用负数下标,以 -1 表示最后一个成员, -2 表示倒数第二个成员,以此类推。
超出范围的下标并不会引起错误。
比如说,当 start 的值比有序集的最大下标还要大,或是 start > stop 时, ZRANGE 命令只是简单地返回一个空列表。
另一方面,假如 stop 参数的值比有序集的最大下标还要大,那么 Redis 将 stop 当作最大下标来处理。
可以通过使用 WITHSCORES 选项,来让成员和它的 score 值一并返回,返回列表以 value1,score1, …, valueN,scoreN 的格式表示。
客户端库可能会返回一些更复杂的数据类型,比如数组、元组等。
ZREVRANGE key start stop [WITHSCORES]
可以做分页
返回有序集 key 中,指定区间内的成员。
其中成员的位置按 score 值递减(从大到小)来排列。
具有相同 score 值的成员按字典序的逆序(reverse lexicographical order)排列。
除了成员按 score 值递减的次序排列这一点外, ZREVRANGE 命令的其他方面和 ZRANGE 命令一样。
ZRANGEBYSCORE key min max [WITHSCORES][LIMIT offset count]
返回有序集 key 中,所有 score 值介于 min 和 max 之间(包括等于 min 或 max )的成员。有序集成员按 score 值递增(从小到大)次序排列。
具有相同 score 值的成员按字典序(lexicographical order)来排列(该属性是有序集提供的,不需要额外的计算)。
可选的 LIMIT 参数指定返回结果的数量及区间(就像SQL中的 SELECT LIMIT offset, count ),注意当 offset 很大时,定位 offset 的操作可能需要遍历整个有序集,此过程最坏复杂度为 O(N) 时间。
可选的 WITHSCORES 参数决定结果集是单单返回有序集的成员,还是将有序集成员及其 score 值一起返回。
该选项自 Redis 2.0 版本起可用。
ZREVRANGEBYSCORE key max min [WITHSCORES][LIMIT offset count]
返回有序集 key 中, score 值介于 max 和 min 之间(默认包括等于 max 或 min )的所有的成员。有序集成员按 score 值递减(从大到小)的次序排列。
具有相同 score 值的成员按字典序的逆序(reverse lexicographical order )排列。
除了成员按 score 值递减的次序排列这一点外, ZREVRANGEBYSCORE 命令的其他方面和 ZRANGEBYSCORE 命令一样。
ZRANK key member
返回有序集 key 中成员 member 的排名。其中有序集成员按 score 值递增(从小到大)顺序排列。
排名以 0 为底,也就是说, score 值最小的成员排名为 0 。
使用 ZREVRANK 命令可以获得成员按 score 值递减(从大到小)排列的排名。
ZREVRANK key member
返回有序集 key 中成员 member 的排名。其中有序集成员按 score 值递减(从大到小)排序。
排名以 0 为底,也就是说, score 值最大的成员排名为 0 。
使用 ZRANK 命令可以获得成员按 score 值递增(从小到大)排列的排名。
ZLEXCOUNT KEY MIN MAX
计算有序集合中指定字典区间内成员数量。
ZREM key member [member …]
移除有序集 key 中的一个或多个成员,不存在的成员将被忽略。
当 key 存在但不是有序集类型时,返回一个错误。
ZREMRANGEBYRANK key start stop
移除有序集 key 中,指定排名(rank)区间内的所有成员。
区间分别以下标参数 start 和 stop 指出,包含 start 和 stop 在内。
下标参数 start 和 stop 都以 0 为底,也就是说,以 0 表示有序集第一个成员,以 1 表示有序集第二个成员,以此类推。
你也可以使用负数下标,以 -1 表示最后一个成员, -2 表示倒数第二个成员,以此类推。
ZREMRANGEBYSCORE key min max
移除有序集 key 中,所有 score 值介于 min 和 max 之间(包括等于 min 或 max )的成员。
自版本2.1.6开始, score 值等于 min 或 max 的成员也可以不包括在内,详情请参见 ZRANGEBYSCORE 命令。
下面 集合运算
ZINTERSTORE destination numkeys key [key …][WEIGHTS weight [weight …]] [AGGREGATE SUM|MIN|MAX]
计算给定的一个或多个有序集的交集,其中给定 key 的数量必须以 numkeys 参数指定,并将该交集(结果集)储存到 destination 。
默认情况下,结果集中某个成员的 score 值是所有给定集下该成员 score 值之和.
关于 WEIGHTS 和 AGGREGATE 选项的描述,参见 ZUNIONSTORE 命令。
ZUNIONSTORE destination numkeys key [key …][WEIGHTS weight [weight …]] [AGGREGATE SUM|MIN|MAX]
计算给定的一个或多个有序集的并集,其中给定 key 的数量必须以 numkeys 参数指定,并将该并集(结果集)储存到 destination 。
默认情况下,结果集中某个成员的 score 值是所有给定集下该成员 score 值之 和 。
WEIGHTS
使用 WEIGHTS 选项,你可以为 每个 给定有序集 分别 指定一个乘法因子(multiplication factor),每个给定有序集的所有成员的 score 值在传递给聚合函数(aggregation function)之前都要先乘以该有序集的因子
如果没有指定 WEIGHTS 选项,乘法因子默认设置为 1 。
AGGREGATE
使用 AGGREGATE 选项,你可以指定并集的结果集的聚合方式。
默认使用的参数 SUM ,可以将所有集合中某个成员的 score 值之 和 作为结果集中该成员的 score 值;使用参数 MIN ,可以将所有集合中某个成员的 最小 score 值作为结果集中该成员的 score 值;而参数 MAX 则是将所有集合中某个成员的 最大 score 值作为结果集中该成员的 score 值。
HyperLogLog
Redis 在 2.8.9 版本添加了 HyperLogLog 结构。
Redis HyperLogLog 是用来做基数统计的算法,HyperLogLog 的优点是,在输入元素的数量或者体积非常非常大时,计算基数所需的空间总是固定 的、并且是很小的。
在 Redis 里面,每个 HyperLogLog 键只需要花费 12 KB 内存,就可以计算接近 2^64 个不同元素的基 数。这和计算基数时,元素越多耗费内存就越多的集合形成鲜明对比。
但是,因为 HyperLogLog 只会根据输入元素来计算基数,而不会储存输入元素本身,所以 HyperLogLog 不能像集合那样,返回输入的各个元素。
什么事基数
比如数据集 {1, 3, 5, 7, 5, 7, 8}, 那么这个数据集的基数集为 {1, 3, 5 ,7, 8}, 基数(不重复元素)为5。 基数估计就是在误差可接受的范围内,快速计算基数。
PFADD key element [element …]
将元素参数添加到 HyperLogLog 数据结构中。重复的元素不能插进去。(也就是取到基数)
PFCOUNT key [key …]
返回给定 HyperLogLog 的基数值(插入的个数),如果多个 HyperLogLog 则返回基数估值之和。
PFMERGE destkey sourcekey [sourcekey …]
将多个 HyperLogLog 合并为一个 HyperLogLog ,合并后的 HyperLogLog 的基数估算值是通过对所有 给定 HyperLogLog 进行并集计算得出的。
发布订阅
可以作为消息队列中间件 MQ。其他重型中间件有有ActiveMQ,RabbitMQ,ZeroMQ,Kafka,MetaMQ,RocketMQ。
Pub/Sub 从字面上理解就是发布(Publish)与订阅(Subscribe),在Redis中,你可以设定对某一个key值进行消息发布及消息订阅,当一个key值上进行了消息发布后,所有订阅它的客户端都会收到相应的消息。
发布订阅就像收音机一样。里面有很多电台,然后很多人拿着收音机收听电台。
Redis 的 SUBSCRIBE 命令可以让客户端订阅任意数量的频道, 每当有新信息发送到被订阅的频道时, 信息就会被发送给所有订阅指定频道的客户端。
作为例子, 下图展示了频道 channel1
, 以及订阅这个频道的三个客户端 —— client2
、 client5
和 client1
之间的关系:
当有新消息通过 PUBLISH 命令发送给频道 channel1
时, 这个消息就会被发送给订阅它的三个客户端:
![digraph send_message_to_subscriber { node [style = filled]; edge [style = “dashed, bold”]; message [label = “PUBLISH channel1 message”, shape = plaintext, fillcolor = “#FADCAD”]; message -> channel1 [color = “#B22222]”]; channel1 [label = “channel1”, fillcolor = “#A8E270”]; node [shape = box]; client2 [label = “client2”, fillcolor = “#95BBE3”]; client5 [label = “client5”, fillcolor = “#95BBE3”]; client1 [label = “client1”, fillcolor = “#95BBE3”]; /* client2 -> channel1 [label = “subscribe”]; client5 -> channel1 [label = “subscribe”]; client1 -> channel1 [label = “subscribe”]; */ channel1 -> client2 [label = “message”, color = “#B22222”]; channel1 -> client5 [label = “message”, color = “#B22222”]; channel1 -> client1 [label = “message”, color = “#B22222”]; }](http://redisbook.readthedocs.io/en/latest/_images/graphviz-84c95abf88d6c0ac55b007da08805a4b9a582fdf.svg)
在后面的内容中, 我们将探讨 SUBSCRIBE 和 PUBLISH 命令的实现, 以及这套订阅与发布机制的运作原理。
SUBSCRIBE channel [channel …]
订阅一个或者多个频道。
subscribe channel1 channel2
PSUBSCRIBE pattern [pattern …]
订阅一个或多个符合给定模式的频道。
每个模式以 * 作为匹配符,比如 it* 匹配所有以 it 开头的频道( itnews 、 it.blog 、 ittweets 等等), news.* 匹配所有以 news. 开头的频道( news.it 、 news.global.today 等等),诸如此类。
PUBLISH channel message
将信息 message 发送到指定的频道 channel 。
UNSUBSCRIBE [channel [channel …]]
指示客户端退订给定的频道。
如果没有频道被指定,也即是,一个无参数的 UNSUBSCRIBE 调用被执行,那么客户端使用 SUBSCRIBE 命令订阅的所有频道都会被退订。在这种情况下,命令会返回一个信息,告知客户端所有被退订的频道。
PUNSUBSCRIBE [pattern [pattern …]]
指示客户端退订所有给定模式。
如果没有模式被指定,也即是,一个无参数的 PUNSUBSCRIBE 调用被执行,那么客户端使用 PSUBSCRIBE 命令订阅的所有模式都会被退订。在这种情况下,命令会返回一个信息,告知客户端所有被退订的模式。
PUBSUB [argument [argument …]]
查看订阅与发布系统状态,它由数个不同格式的子命令组成。
推荐文章:
http://redisbook.readthedocs.io/en/latest/feature/pubsub.html
https://www.cnblogs.com/yitudake/p/6747995.html
http://blog.csdn.net/fly910905/article/details/78495971
http://blog.csdn.net/cws1214/article/details/52922267
事物
redis事物简介(锁事物)
redis中把事物把所有命令序列化 放入队列缓存 然后按顺序执行,事物执行过程中不会接受其他命令执行。
事物执行过程
开始事物
命令队列
执行事务
MULTI
标记一个事务块的开始。
事务块内的多条命令会按照先后顺序被放进一个队列当中,最后由 EXEC 命令原子性(atomic)地执行。
EXEC
执行所有事务块内的命令。
假如某个(或某些) key 正处于 WATCH 命令的监视之下,且事务块中有和这个(或这些) key 相关的命令,那么 EXEC 命令只在这个(或这些) key 没有被其他命令所改动的情况下执行并生效,否则该事务被打断(abort)。(所有受监控的键都没有被修改时,才会执行事务)
WATCH key [key …]
监视一个(或多个) key ,如果在事务执行之前这个(或这些) key 被其他命令所改动,那么事务将被打断。(就像单例模式中的设计一样)
看完官方解释和官方demo并没有什么卵用,感觉还是不懂。
其实exec的时候,只有监控的值没有被修改(在事物里面修改的不算)才能执行事物。监控过期的键也是会执行事务的。
WATCH命令可以被调用多次。简单说来,所有的WATCH命令都会在被调用之时立刻对相应的键进行监控,直到EXEC命令被调用之时为止(不管事物是否被终止)。你可以在单条的WATCH命令之中,使用任意数量的键作为命令参数。
当执行完exec后,会自动释放所有的watch
UNWATCH
取消 WATCH 命令对所有 key 的监视。
如果在执行 WATCH 命令之后, EXEC 命令或 DISCARD 命令先被执行了的话,那么就不需要再执行 UNWATCH 了。
因为 EXEC 命令会执行事务,因此 WATCH 命令的效果已经产生了;而 DISCARD 命令在取消事务的同时也会取消所有对 key 的监视,因此这两个命令执行之后,就没有必要执行 UNWATCH 了。
DISCARD
取消事务,放弃执行事务块内的所有命令。
如果正在使用 WATCH 命令监视某个(或某些) key,那么取消所有监视,等同于执行命令 UNWATCH 。(因为不执行exec了,所以他也要释放所有监控)
异常处理
事物执行过程中会有两种类型的异常,第一种放入队列中时发生异常,第二种在执行过程中发生异常。
第一种:当把命令放入队列中的时候发生错误。
这一种是很简单的语法检查。命令名字、参数数量、临界值等(编译时 编译器可以检查出来。)
处理结果:事物中所有的命令都不执行。
第二种:执行过程中发生错误(redis事物不支持回滚)。
exec执行后逐行的执行 加入队列的命令时,例如对一些类型使用了错误的操作执行(运行时错误)
处理结果:错误的命令不执行,正确的命令照常执行,即使出现错误,中间不会终止,会把所有出现的错误记录下来,最后返回回来。
不支持回滚
上面说到错误的时候,已经说了不支持回滚, 所以生产环境 一定要理清逻辑,不要出现逻辑性错误。
推荐文章:https://www.cnblogs.com/kyrin/p/5967620.html
服务连接
Redis客户端连接服务器。
使用redis自带客户端redis-cli.exe
启动bat文件指令
redis-cli.exe -h 127.0.0.1 -p 8888 -a 123456
-h服务器地址 -p端口 -a密码
使用第三方客户端Redis Desk Manager
缺点,有很多数据类型操作不能用。
客户端指令