安全性能测试客户端连接管道技术

安全

查看是否设置密码

1
2
3
4
5
127.0.0.1:6379> CONFIG get requirepass
1) "requirepass"
2) ""

# 默认没有设置

设置密码

1
2
3
4
5
127.0.0.1:6379> CONFIG set requirepass "mypassword"
OK
127.0.0.1:6379> CONFIG get requirepass
1) "requirepass"
2) "mypassword"

设置密码后,客户端连接 redis 服务就需要密码验证,否则无法执行命令。

1
2
3
4
5
6
127.0.0.1:6379> AUTH "mypassword"
OK
127.0.0.1:6379> SET mykey "Test value"
OK
127.0.0.1:6379> GET mykey
"Test value"

性能测试

Redis 性能测试是通过同时执行多个命令实现的
redis-benchmark [option] [option value]

1
2
3
4
redis-benchmark -h 127.0.0.1 -p 6379 -t set,lpush -n 100000 -q

SET: 146198.83 requests per second
LPUSH: 145560.41 requests per second

客户端连接

Redis 通过监听一个 TCP 端口或者 Unix socket 的方式来接收来自客户端的连接,当一个连接建立后,Redis 内部会进行以下一些操作:

  1. 首先,客户端 socket 会被设置为非阻塞模式,因为 Redis 在网络事件处理上采用的是非阻塞多路复用模型。
  2. 然后为这个 socket 设置 TCP_NODELAY 属性,禁用 Nagle 算法
  3. 然后创建一个可读的文件事件用于监听这个客户端 socket 的数据发送
1
2
3
4
config get maxclients

1) "maxclients"
2) "10000"

启动时设置最大连接数

1
redis-server --maxclients 100000

管道技术

Redis是一种基于客户端-服务端模型以及请求/响应协议的TCP服务。这意味着通常情况下一个请求会遵循以下步骤:

客户端向服务端发送一个查询请求,并监听Socket返回,通常是以阻塞模式,等待服务端响应。
服务端处理命令,并将结果返回给客户端。

Redis 管道技术可以在服务端未响应时,客户端可以继续向服务端发送请求,并最终一次性读取所有服务端的响应。

1
2
3
4
5
6
7
8
$(echo -en "PING\r\n SET MYkey redis\r\nGET MYkey\r\nINCR visitor\r\nINCR visitor\r\nINCR visitor\r\n"; sleep 10) | nc localhost 6379

+PONG
+OK
redis
:1
:2
:3