5.Redis命令行模式
- Redis 命令大致可分为以下几种:
- 服务端(server)命令
- 客户端(client)命令
- 键命令(key)
- 数据类型命令(包括 String、List、Hash、Set 以及 Sorted Set。)
- 功能应用命令
- Redis 命令用于在 Redis 服务器上执行一些操作,而命令运行的方式是通过客户端命令行来执行的,这种方式也被称为“命令行模式”。因此想要在 Redis 服务器上运行命令,首先需要开启一个 Redis 客户端。操作方法如下:在 CMD 命令行输入以下命令启动一个 Redis 客户端:
#注意:在开启客户端之前,你要确定 Redis 服务器已经开启。
redis-cli
- 本地服务器运行命令:本地服务器指的是,Redis 服务器和客户端安装在同一台计算机上。在计算机上打开一个 Redis 客户端输入以下命令,验证客户端与Redis 服务器是否成功连接。
[root@VM-0-3-centos ~]# redis-cli -a 13xxxx
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
127.0.0.1:6379> ping
PONG
127.0.0.1:6379>
#通过执行命令 PING,以检查服务器是否正在运行,结果返回 PONG,说明已经成功连接了本地 Redis 服务器。
#redis-cli -a 密码 -p 6379 --raw 启动的时候解决乱码的
- 远程服务器上运行命令:远程服务器指的是服务器安装在另外一台计算机上,而非本地。这台远程计算机可以是局域网中的一台,也可以是 Internet 联网状态下的远程计算机。Redis 提供了连接远程服务器的命令,格式如下:
C:\Users\Administrator>redis-cli -h host -p port -a password
-
参数说明:
- -h:用于指定远程 Redis 服务器的 IP 地址;
- -p:用于指定 Redis 远程服务器的端口号;
- -a:可选参数,若远程服务器设置了密码,则需要输入。
-
如何连接到 Redis 远程服务器。服务器在主机 IP 是 121.x.x.x,端口号为 6379 ,密码为 132xxxx,使用git bash工具进行测试。
CNCLUKZK@LAPTOP-HGE63E13 MINGW64 /e/zkNote/typora-user-images
$ redis-cli -h 121.x.x.x -p 6379 -a xxxxx
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
ping
PONG
- 命令行自动提示功能:Redis 拥有强大的命令行提示功能,支持
Tab
键自动补全,并且可以通过HELP
命令查看帮助信息,如下所示:
127.0.0.1:6379> help set
SET key value [NX|XX] [GET] [EX seconds|PX milliseconds|EXAT unix-time-seconds|PXAT unix-time-milliseconds|KEEPTTL]
summary: Set the string value of a key
since: 1.0.0
group: string
127.0.0.1:6379> help mset
MSET key value [key value ...]
summary: Set multiple keys to multiple values
since: 1.0.1
group: string
16.客户端(client)命令
-
Redis 提供了一些操作客户端(client)的命令,比如查询所有已连接到服务器的客户端数量,控制客户端的连接状态(关闭或者挂起)等。通过客户端命令我们可以轻松的实现对客户端的管理、控制。
-
Redis 服务器通过监听 TCP 端口的方式来接受客户端的连接。当一个连接建立后,Redis 会自动执行以下过程:
- 首先客户端 socket 被设置为非阻塞模式,这是因为 Redis 在网络事件处理上采用了非阻塞式 IO(即 IO 多路复用模型);
- 其次设置 socket 的 TCP_NODELAY 属性,从而禁用 Nagle 算法;
- 最后创建一个可读的文件事件,用它来监听客户端 socket 的数据发送。
-
Redis 使用命令的格式向客户端输入数据,这个数据量是非常小的。当向客户端输入命令后,我们希望能快速的得到服务器的应答,也就是低延时性,但如果开启了
Nagle
算法就会出现频繁延时的现象,导致用户体验极差。
TCP_NODELAY 控制是否开启 Nagle 算法,该算法可以提高广域网传输效率,减少分组的报文个数,适合传输体量较大的数据。
16.1 Redis IO多路复用
- Redis 的底层是一个单线程模型,单线程指的是使用一个线程来处理所有的网络事件请求,这样就避免了多进程或者多线程切换导致的 CPU 消耗,而且也不用考虑各种锁的问题。
- redis基于内存操作处理速度很快,cpu不是redis的性能瓶颈而是多线程的瓶颈,redis的瓶颈是根据机器的内存和网络带宽,既然可以使用单线程,为什么还需要使用多线程呢。
- Redis是C语言写的,官方提供的数据为100000+的QPS,完全不比同样是使用key-vale的Memcache差!(c语言贴近底层,所以效率高)
- Redis 为了充分利用单线程,加快服务器的处理速度,它采用 IO 多路复用模型来处理客户端与服务端的连接,这种模型有三种实现方式,分别是 select、poll、epoll。Redis 正是采用 epoll 的方式来监控多个 IO 事件,对读写等事件的响应是经过对epoll函数的包装来作到的。当客户端空闲时,线程处于阻塞状态;当一个或多个 IO 事件触发时(客户端发起网路连接请求),线程就会从阻塞状态唤醒,并同时使用
epoll
来轮询触发事件,并依次提交给线程处理。Redis的实际处理速度彻底依靠主进程的执行效率
Epoll是Linux内核为处理大批量文件描述符而做了改进的epoll,是Linux下多路复用IO接口select/poll的加强版本,它能显著提升程序在大量并发链接中只有少许活跃的状况下的系统CPU利用率
注意:“多路”指的是多个网络连接,“复用”指的是复用同一个线程。多路 IO 复用技术可以让单个线程高效的处理多个连接请求。
redis 6 支持多线程是指网络io、分发存储等用多线程 ,读写执行命令还是单线程,默认是关闭多线程的。需要去设置配置文件的,开启多线程不能大于机器和核数
多线程应用目的,为了提高资源利用率。在涉及到硬盘数据时,CPU在执行时会有很多时间阻塞到IO,采用多线程可以利用阻塞这段时间。比如:删除操作,对于一些大键值对的删除操作,通过多线程非阻塞地释放内存空间也能减少对 Redis 主线程阻塞的时间,提高执行的效率,因此引入了多线程
- Redis为什么单线程还这么快?
- 1、误区1:高性能的服务器一定是多线程的?
- 2、误区2:多线程(CPU上下文会切换!)一定比单线程效率高!
- CPU>内存>硬盘的速度要有所了解!
- 核心:redis是将所有的数据全部放在内存中的,所以说使用单线程去操作效率就是最高的,多线程(CPU上下文会切换:耗时的操作。)对于内存系统来说,如果没有上下文切换效率就是最高的!单cpu对一块内存进行多次读写都是在一个CPU上的,没有线程切换的耗时(1500ns-2000ns),使用内存情况下,这个就是最佳的方案!
16.2 常用命令
命令 | 说明 |
---|---|
CLIENT LIST | 以列表的形式返回所有连接到 Redis 服务器的客户端。 |
CLIENT SETNAME | 设置当前连接的名称。 |
CLIENT GETNAME | 获取通过 CLIENT SETNAME 命令设置的服务名称。 |
CLIENT PAUSE | 挂起客户端连接,将所有客户端挂起指定的时间(以毫秒为计算)。 |
CLIENT KILL | 关闭客户端连接。 |
CLIENT ID | 返回当前客户端 ID。 |
CLIENT REPLY | 控制发送到当前连接的回复,可选值包括 on|off|skip。 |
16.3 客户端最大连接数
- 在 Redis 配置文件中,有一个
maxclients
的配置项,它指定了连接到 Redis 服务器的最大客户端数量。其默认值是 10000。配置项如下所示:
127.0.0.1:6379> config get maxclients
1) "maxclients"
2) "10000"
#更改最大连接数量
127.0.0.1:6379> config set maxclients 20000
OK
127.0.0.1:6379> config get maxclients
1) "maxclients"
2) "20000"
- 的使用示例,如下所示:
#返回当前客户端 ID。
remote:0>client id
"2058"
#返回所有连接到 Redis 服务器的客户端。
remote:0>client list
"id=2058 addr=110.xx.xx.xx:5518 laddr=172.xx.xx.xx:6379 fd=8 name= age=20733 idle=0 flags=N db=0 sub=0 psub=0 ssub=0 multi=-1 qbuf=26 qbuf-free=20448 argv-mem=10 multi-mem=0 rbs=1024 rbp=0 obl=0 oll=0 omem=0 tot-mem=22298 events=r cmd=client|list user=default redir=-1 resp=2
id=2079 addr=127.0.0.1:45800 laddr=127.0.0.1:6379 fd=9 name= age=49 idle=30 flags=N db=0 sub=0 psub=0 ssub=0 multi=-1 qbuf=0 qbuf-free=0 argv-mem=0 multi-mem=0 rbs=1024 rbp=0 obl=0 oll=0 omem=0 tot-mem=1800 events=r cmd=config|get user=default redir=-1 resp=2
"
remote:0>client getname
null
#名字不能有空格
remote:0>client setname "redis_desktop_manager"
"OK"
remote:0>client getname
"redis_desktop_manager
17.服务器命令
- Redis 服务器是对客户端提供服务的主体,只要是安装了 Redis 数据库的计算机都可以通过本地,或者远程的方式对外提供服务。
- Redis 服务器能够以高可用集群的方式对外提供服务。所谓高可用集群,指的是多台 Redis 服务器组成的服务器架构,每台服务器都提供相同的服务,从而让服务器达到一个稳定,高效的运行状态。
从 3.0 版本开始,Redis 已经实现了对 Redis-cluster 集群部署的支持。
-
Redis 提供了诸多操作服务器的命令,这些命令都有着各自重要的作用,比如
BGSAVE
命令,用异步的方式将 Redis 数据库的数据同步到本地磁盘中,实现数据的持久化存储,这对服务器的数据安全有着重要的作用。 -
常用的Redis 服务器命令:
命令 | 说明 |
---|---|
BGREWRITEAOF | 在后台以异步的方式执行一个 AOF 文件的重写操作,对源文件进行压缩,使其体积变小。 AOF 是实现数据持久化存储的方式之一。 |
BGSAVE | 在后台执行初始化操作,并以异步的方式将当前数据库的数据保存到磁盘中。 |
CLIENT KILL [ip:port] [ID client-id] | 关闭客户端连接。 |
CLIENT LIST | 获取连接到服务器的客户端连接列表。 |
CLIENT GETNAME | 获取当前连接客户端的名称。 |
CLIENT PAUSE timeout | 使服务器在指定的时间停止执行来自客户端的命令。 |
CLIENT SETNAME connection-name | 设置当前连接客户端的名称。 |
COMMAND | 返回所有 Redis 命令的详细描述信息。 |
COMMAND COUNT | 此命令用于获取 Redis 命令的总数。 |
COMMAND GETKEYS | 获取指定命令的所有键。 |
INFO [section] | 获取 Redis 服务器的各种信息和统计数值。 |
COMMAND INFO command-name [command-name …] | 用于获取指定 Redis 命令的描述信息。 |
CONFIG GET parameter | 获取指定配置参数的值。 |
CONFIG REWRITE | 修改启动 Redis 服务器时所指定的 redis.conf 配置文件。 |
CONFIG SET parameter value | 修改 Redis 配置参数,无需重启。 |
CONFIG RESETSTAT | 重置 INFO 命令中的某些统计数据。 |
DBSIZE | 返回当前数据库中 key 的数量。 |
DEBUG OBJECT key | 获取 key 的调试信息。当 key 存在时,返回有关信息;当 key 不存在时,返回一个错误。 |
DEBUG SEGFAULT | 使用此命令可以让服务器崩溃。 |
FLUSHALL | 清空数据库中的所有键。 |
FLUSHDB | 清空当前数据库的所有 key。 |
LASTSAVE | 返回最近一次 Redis 成功将数据保存到磁盘上的时间,以 UNIX 格式表示。 |
MONITOR | 实时打印出 Redis 服务器接收到的命令。 |
ROLE | 查看主从实例所属的角色,角色包括三种,分别是 master、slave、sentinel。 |
SAVE | 执行数据同步操作,将 Redis 数据库中的所有数据以 RDB 文件的形式保存到磁盘中。 RDB 是 Redis 中的一种数据持久化方式。 |
SHUTDOWN [NOSAVE] [SAVE] | 将数据同步到磁盘后,然后关闭服务器。 |
SLAVEOF host port | 此命令用于设置主从服务器,使当前服务器转变成为指定服务器的从属服务器, 或者将其提升为主服务器(执行 SLAVEOF NO ONE 命令)。 |
SLOWLOG subcommand [argument] | 用来记录查询执行时间的日志系统。 |
SYNC | 用于同步主从服务器。 |
SWAPDB index index | 用于交换同一 Redis 服务器上的两个数据库,可以实现访问其中一个数据库的客户端连接,也可以立即访问另外一个数据库的数据。 |
TIME | 此命令用于返回当前服务器时间。 |
- 举例:
#查看主从实例所属的角色
:0>role
1) "master"
2) "0"
3)
#查看redis命令的描述信息
remote:0>command info lpush zadd
1) 1) "lpush"
2) "-3"
3) 1) "write"
2) "denyoom"
3) "fast"
4) "1"
5) "1"
6) "1"
7) 1) "@write"
2) "@list"
3) "@fast"
8)
9) 1) 1) "flags"
2) 1) "RW"
2) "insert"
3) "begin_search"
4) 1) "type"
2) "index"
3) "spec"
4) 1) "index"
2) "1"
5) "find_keys"
6) 1) "type"
2) "range"
3) "spec"
4) 1) "lastkey"
2) "0"
3) "keystep"
4) "1"
5) "limit"
6) "0"
10)
2) 1) "zadd"
2) "-4"
3) 1) "write"
2) "denyoom"
3) "fast"
4) "1"
5) "1"
6) "1"
7) 1) "@write"
2) "@sortedset"
3) "@fast"
8)
9) 1) 1) "flags"
2) 1) "RW"
2) "update"
3) "begin_search"
4) 1) "type"
2) "index"
3) "spec"
4) 1) "index"
2) "1"
5) "find_keys"
6) 1) "type"
2) "range"
3) "spec"
4) 1) "lastkey"
2) "0"
3) "keystep"
4) "1"
5) "limit"
6) "0"
10)
#最近一次执行数据持久化存储的时间
remote:0>lastsave
"1670150012"
#实时打印redis服务器接收的命令
127.0.0.1:6379> monitor
OK
1670168000.366344 [0 110.19.110.129:5518] "zrange" "height" "0" "9"
1670168046.890580 [0 110.19.110.129:5518] "role"
1670168275.620122 [0 110.19.110.129:5518] "command" "info" "lpush" "zadd"
1670168329.479631 [0 110.19.110.129:5518] "lastsave"
1670168333.407452 [0 110.19.110.129:5518] "lastsave"
查看当前服务器时间
#第一个字符串是当前时间以 UNIX 时间戳格式表示
#第二个字符串表示:当前这一秒钟已经逝去的微秒数
remote:0>time
1) "1670168383"
2) "445941"
#查看前3条日志信息
remote:0>slowlog get 3
1) 1) "2"
2) "1669866989"
3) "200629"
4) 1) "COMMAND"
2) "DOCS"
5) "127.0.0.1:33854"
6) ""
2) 1) "1"
2) "1669864245"
3) "24343"
4) 1) "scan"
2) "0"
3) "MATCH"
4) "*"
5) "COUNT"
6) "10000"
5) "110.19.110.129:4672"
6) ""
3) 1) "0"
2) "1669864242"
3) "40306"
4) 1) "INFO"
5) "110.19.110.129:4672"
6) ""
#共有多少条日志记录
remote:0>slowlog len
"3"
#清空所有日志记录
remote:0>slowlog reset
"OK"
remote:0>slowlog len
"0"
#用于同步主从服务器数据
remote:0>sync