03-redis事务,锁和服务器管理命令

发布时间 2023-12-26 19:50:28作者: EJW

一、redis中的事务

redis中的事务跟关系型数据库中的事务是一个相似的概念,但是有不同之处。关系型数据库事务执行失败后面的sql语句不在执行,而redis中的一条命令执行失败,其余的命令照常执行。
redis中开启一个事务是使用multi,相当于begin\start transaction,exec提交事务,discard取消队列命令(非回滚操作)。

image

1.1 事务的命令

  • DISCARD
    • 取消事务,放弃执行事务块内的所有命令。
  • EXEC
    • 执行所有事务块内的命令。
  • MULTI
    • 标记一个事务块的开始。
  • UNWATCH
    • 取消 WATCH 命令对所有 key 的监视。
  • WATCH key [key ...]
    • 监视一个(或多个) key ,如果在事务执行之前这个(或这些) key 被其他命令所改动,那么事务将被打断。

例子

开启事务功能时(multi)
multi 
command1      
command2
command3
command4

4条语句作为一个组,并没有真正执行,而是被放入同一队列中。
如果,这是执行discard,会直接丢弃队列中所有的命令,而不是做回滚。

exec
当执行exec时,对列中所有操作,要么全成功要么全失败

二、redis 中的锁

  • 悲观锁
  • 乐观锁

举例:我正在买票
Ticket -1 , money -100
而票只有1张, 如果在我multi之后,和exec之前, 票被别人买了,即ticket变成0了.
我该如何观察这种情景,并不再提交
悲观的想法:
世界充满危险,肯定有人和我抢, 给ticket上锁, 只有我能操作. [悲观锁]
乐观的想法:
没有那么人和我抢,因此,我只需要注意,有没有人更改ticket的值就可以了 [乐观锁]

redis乐观锁实现(模拟买票)
发布一张票
set ticket 1

窗口1:
watch ticket
multi
set ticket 0       1---->0

窗口2:
multi 
set ticket 0 
exec 

窗口1:
exec

三、服务器管理命令

对服务器的操作

命令 功能
info 查看配置信息
Clinet list 列出连接的客户端信息
Client kill ip:port 强制关闭掉某个客户端连接
config get * 获取服务器配置信息
CONFIG SET 动态修改配置信息
Dbsize 获取当前库的总个数
FLUSHALL 清空所有数据
select 1 切换数据库 ,一共0--15个库,默认在0号库
FLUSHDB 清空当前库
MONITOR 监控实时指令,可用于做审计日志
save 将当前数据保存,持久化到磁盘
SHUTDOWN 关闭服务器

对key的操作

命令 功能
keys * 查看KEY支持通配符
DEL 删除给定的一个或多个key
EXISTS 检查key是否存在
TYPE 返回键所存储值的类型
EXPIRE\ PEXPIRE 以秒\毫秒设定生存时间
TTL\ PTTL 以秒\毫秒为单位返回生存时间
PERSIST 取消生存实现设置