Redis系统相关命令和Redis事务

一、系统相关命令

(1)BGREWRITEAOF:手动触发AOF重写操作,用于减小AOF文件体积

 格式:BGREWRITEAOF

 (2)BGSAVE:后台异步保存当前数据库的数据到磁盘

格式:BGSAVE

(3)CLIENT KILL:关闭地址为ip:port的客户端;由于Redis为单线程设计,因此当当前命令执行完之后才会关闭客户端

 格式:CLIENT KILL ip:port

 (4)CLIENT LIST:以可读的格式,返回所有连接到服务器的客户端信息和统计数据

格式:CLIENT LIST

 

 (5)CONFIG GET:取得运行中的Redis服务器配置参数;支持*

格式:CONFIG GET parameter

(6)CONFIG RESETSTAT:重置INFO命令中的某些统计数据,例如Keyspace hits、Keyspace misses等

格式:CONFIG RESETSTAT

(7)CONFIG REWRITE:对启动Redis时指定的redis.conf文件进行改写

格式:CONFIG REWRITE

(8)CONFIG SET:动态调整Redis服务器的配置而无需重启;修改后的配置立即生效。

格式:CONFIG SET parameter value

(9)SELECT:切换到指定数据库,数据库索引index用数字指定,以0作为起始索引值;默认使用0号数据库

格式:SELECT index

(10)DBSIZE:返回当前数据库的Key的数量

格式:DBSIZE

(11)DEBUG OBJECT:这是一个调试命令,不应当被客户端使用;key存在时返回有关信息,key不存在时返回错误

格式:DEBUG OBJECT key

(12)FLUSHALL:清空整个Redis服务器的数据

格式:FLUSHALL

(13)FLUSHDB:清空当前数据库中的所有数据

格式:FLUSHDB

(14)INFO:以一种易于解释且易于阅读的格式,返回Redis服务器的各种信息和统计数值;通过给定可选参数section,可以让命令只返回某一部分信息

格式:INFO [section]

(15)LASTSAVE:返回最近一次Redis成功将数据保存到磁盘上的时间,以UNIX时间戳格式表示

格式:LASTSAVE

(16)MONITOR:实时打印出Redis服务器接收到的命令,调试用

格式:MONITOR

(17)SHUTDOWN:停止所有客户端;如果至少有一个保存点在等待,执行SAVE命令;如果AOF选项被打开,更新AOF文件;关闭Redis服务器。

 格式:SHUTDOWN [SAVE|NOSAVE]

二、Redis的事务

Redis的事务是由DISCARD、EXEC、MULTI、UNWATCH、WATCH五个命令来保证的:

(1)DISCARD:取消事务;如果正在使用WATCH命令监视某个/某些key,那么取消所有监视,等同于执行UNWATCH。

格式:DISCARD

(2)EXEC:执行所有事务块内的命令;如果某个/某些key正处于WATCH命令监视之下且事务块中有和这个/这些key相关的命令,那么EXEC命令只在这个/这些key没有被其他命令改动的情况下才会执行并生效,否则该事务被打断。

格式:EXEC

(3)MULTI:标记一个事务块的开始;事务块内的多条命令会按照先后顺序被放入一个队列中,最后由EXEC命令原子性地执行

格式:MULTI

(4)UNWATCH:取消WATCH命令对所有key的监视;如果WATCH之后,EXEC/DISCARD命令先被执行了,UNWATCH命令就没必要执行了

格式:UNWATCH

(5)WATCH:监视一个/多个key,如果在事务执行之前这个/这些key被其他命令改动,那么事务将被打断

格式:WATCH key [key ...]

例子:事务没有被打断的情况

看到开启事务之后,所有的命令返回的都是QUEUED,即放入队列,而不是直接执行。

接着模拟一下事务被打断的情况,WATCH一下Number这个Key,我另外起了一个Redis客户端INCR了一下num,结果为:

看到,并没有命令被执行,返回nil即事务被打断。

接着简单说一下事务,和数据库类似的,事务保证的是两点:

  • 隔离:所有命令序列化、按顺序执行,事务执行过程中不会被其他客户端发来的命令打断
  • 原子性:事务中的命令要么全部执行,要么全部不执行

另外,Redis的事务并不支持回滚,这个其实网上已经说法挺多了,大致上是两个原因:

  • Redis命令只会因为语法而失败(且这些问题不能再入队时被发现),或是命令用在了错误类型的键上面,也就是说,从实用性角度来说,失败的命令是由于编程错误造成的,而这些错误应该在开发的过程中被发现而不应该出现在生产环境中
  • Redis内部可以保持简单且快速,因为不需要对回滚进行支持

总而言之,对Redis来说,回滚无法解决编程错误带来的问题,因此还不如更简单、更快速地无回滚处理事务。

发布了71 篇原创文章 · 获赞 2 · 访问量 6186

猜你喜欢

转载自blog.csdn.net/qq_40298351/article/details/102594928
今日推荐