使用multi开启事务,随后每条基本命令都会先进入队列,exec会串行执行整个事务序列命令。
127.0.0.1:6379> multi
OK
127.0.0.1:6379(TX)> set k1 1
QUEUED
127.0.0.1:6379(TX)> incr k1
QUEUED
127.0.0.1:6379(TX)> get k1
QUEUED
127.0.0.1:6379(TX)> exec
1) OK
2) (integer) 2
3) "2"
discard可以取消整个事务,释放命令队列
127.0.0.1:6379> multi
OK
127.0.0.1:6379(TX)> set k1 1
QUEUED
127.0.0.1:6379(TX)> incr k1
QUEUED
127.0.0.1:6379(TX)> get k1
QUEUED
127.0.0.1:6379(TX)> discard
OK
127.0.0.1:6379>
事务中某命令语法无问题但则该某命令执行失败,其他正常执行
127.0.0.1:6379> multi
OK
127.0.0.1:6379(TX)> set k1 v1
QUEUED
127.0.0.1:6379(TX)> incr k1
QUEUED
127.0.0.1:6379(TX)> get k1
QUEUED
127.0.0.1:6379(TX)> exec
1) OK
2) (error) ERR value is not an integer or out of range
3) "v1"
事务中某命令语法有问题,则该事务所有命令不被执行,等同于discard
127.0.0.1:6379> multi
OK
127.0.0.1:6379(TX)> set k1 v1
QUEUED
127.0.0.1:6379(TX)> incr k1 1
(error) ERR wrong number of arguments for 'incr' command
127.0.0.1:6379(TX)> get k1
QUEUED
127.0.0.1:6379(TX)> exec
(error) EXECABORT Transaction discarded because of previous errors.
127.0.0.1:6379> set balance 100
OK
127.0.0.1:6379> get balance
"100"
127.0.0.1:6379> multi
OK
127.0.0.1:6379(TX)> watch balance
(error) ERR WATCH inside MULTI is not allowed
127.0.0.1:6379(TX)>
unwatch
用于主动取消对之前所有key的监视
Watch 命令是Exec命令的执行条件;也就是说,如果Watch的Key没有被修改则Redis执行事务,否则(Watch的key被其他事务修改了)事务不会被执行。
Watch 命令可以被调用多次,一个Watch 命令可以监控多个key。Watch 命令调用即启动监控功能,从Watch 命令开始点到执行EXEC命令终止。一旦EXEC被调用,所有的键都将不被监视,无论所讨论的事务是否被中止。关闭客户端连接也会触发所有的键被取消监视。
unwatch可以在事务中执行,但并没有什么意义,因为事务不会中断,事务执行期间不会有其他事务修改值。也只能在事务执行前执行。或者取消事务之后执行一下。
pipeline,管道
命令的整个流程,发送命令→命令排队→命令执行→返回结果
Redis管道用于一次性将多条命令发给服务端,然后一次性返回多条命令的结果,优化了网络TTL
类似于mset或者mget命令,但不同的是,mset等命令是原子性的,而管道中命令集合并非原子性,管道中两个命令之间可能会执行其他客户端发来的命令
事务是一条一条发的
cmd.txt
set lock:product:1 1
set cache:article:1 这里是一篇文章的内容,后面话有很多......
hset cache:user:1 name 张三 age 18 gender male
[root@yc-cn-centos-abc redis-6.2.7]# cat cmd.txt | redis-cli -a 123456 --pipe
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
All data transferred. Waiting for the last reply...
Last reply received from server.
errors: 0, replies: 3
Command
https://redis.io/docs/latest/commands/
通过help [command] 可以查看一个命令的具体用法
Redis命令不区分大小写,Key值区分大小写
Core
八个数据类型
四个运维操作
两个消息队列
一个事务操作
一个脚本函数
Stack
…
redis-server
redis-cli
redis-benchmark
16个默认数据库
select index切换
keys *
set key value
get key
del key
flushdb
flushall
MOVE key dbindex [0-15)
用法: MOVE mykey 1
作用: 将指定 key 移动到指定的数据库中。数据库索引从 0 到 15,表示 16 个不同的数据库。
SELECT dbindex
用法: SELECT 1
作用: 选择指定数据库,使得接下来的操作都在该数据库中执行。
DBSIZE
用法: DBSIZE
作用: 返回当前数据库的 key 的数量。
FLUSHDB
用法: FLUSHDB
作用: (慎用!)清空当前数据库中的所有 key。
FLUSHALL
用法: FLUSHALL
作用: (慎用!实际开发中基本不使用!)清空所有数据库中的所有 key。
$ redis-cli
redis 127.0.0.1:6379>
redis 127.0.0.1:6379> PING
PONG
在以上实例中我们连接到本地的 redis 服务并执行 PING 命令,该命令用于检测 redis 服务是否启动。
move key index
Redis命令
lua脚本
删除 key,验证持有者身份,防止误删
-- 锁的key
local key = KEYS[1]
local ownerId = ARGV[1]
-- 获取锁的线程标识
local id = redis.call('get',key)
-- 比较当前线程标识和redis中锁中的线程标识是否一致
if(id == ownerId) then
return redis.call('del',key)
end
return 0
Redis事务通过过MULTI、EXEC、DISCARD和WATCH保证一系列命令串行化执行。
原子性:不具备,Redis事务执行到中间某一步骤报错会终止执行,不会回滚,执行成功的命令会持久化,还未执行的命令不再执行
一致性:Redis保证事务执行前后的完整性约束
隔离性:Redis事务串行化执行,始终具有隔离性
持久性:Redis通过RDB和AOF机制可以具有持久性。
Redis事务只能在单个节点执行,不支持跨节点事务操作。
Lua脚本中的命令同样不能跨节点执行
https://blog.csdn.net/agonie201218/article/details/130579005
集群管理
1. 查看redis是否是集群模式,info cluster 命令
2. 查看集群的所有节点信息,cluster nodes 命令
3. 查看集群中各个节点的slot区间,cluster slots 命令
4. 查看指定key所在slot的值,cluster keyslot key 命令