昨天介绍了《Windows&Linux&MacOS如何快速搭建Redis》。搭建完成,往往会出现同一内网下其他主机无法连接redis-server的情况,原因可能有:protected-mode(保护模式)已开启、bind绑定了无效的主机地址、bind设置了本地回环地址......为了彻底弄清楚protected-mode和bind对远程访问redis-server的影响,我特地设计了一些测试场景,像测试产品需求一样测试这两项配置。
同软件测试的流程一样,在测试设计前,需要先弄懂产品需求(redis配置项bind和protected-mode)是什么
弄清楚了redis配置项bind和protected-mode的需求,就可以进行测试场景设计了
redis所在主机地址为:192.168.1.123
运行python测试代码的主机地址为:192.168.1.122
场景 | 前提:redis.conf配置 | 测试步骤 | 期望结果 | 测试结果 |
---|---|---|---|---|
1.开启保护模式,生效 | protected mode:yes,即开启状态bind:注释掉,未绑定任何IP没有设置访问密码 | 1.通过python代码远程连接redis2.插入键值对:{"test1":0}3.获取键test1的值 | 连接失败 | |
2.开启保护模式,不生效(设置bind ip) | protected mode:yesbind:192.168.1.123没有设置访问密码 | 1.通过python代码远程连接redis2.插入键值对:{"test1":0}3.获取键test1的值 | 1.连接成功2.插入成功3.value为0 | |
3.开启保护模式,不生效(设置访问密码) | protected mode:yesbind:注释掉,未绑定任何IP设置访问密码 | 1.通过python代码远程连接redis2.插入键值对:{"test1":0}3.获取键test1的值 | 1.连接成功2.插入成功3.value为0 | |
4.绑定无效ip | protected mode:nobind:192.168.1.122没有设置访问密码 | 1.通过python代码远程连接redis2.插入键值对:{"test1":0}3.获取键test1的值 | 连接失败 | |
5.绑定本地回环地址-开启保护模式 | protected mode:nobind:127.0.0.1没有设置访问密码 | 1.通过python代码远程连接redis2.插入键值对:{"test1":0}3.获取键test1的值 | 连接失败 | |
6.绑定本地回环地址-关闭保护模式 | protected mode:yesbind:127.0.0.1没有设置访问密码 | 1.通过python代码远程连接redis2.插入键值对:{"test1":0}3.获取键test1的值 | 连接失败 |
1.通过python代码远程连接redis 2.插入键值对:{"test1":0} 3.获取键test1的值连接失败 2.开启保护模式,不生效(设置bind ip)
1.通过python代码远程连接redis 2.插入键值对:{"test1":0} 3.获取键test1的值1.连接成功 2.插入成功 3.value为0 3.开启保护模式,不生效(设置访问密码)
1.通过python代码远程连接redis 2.插入键值对:{"test1":0} 3.获取键test1的值1.连接成功 2.插入成功 3.value为0 4.绑定无效ip
1.通过python代码远程连接redis 2.插入键值对:{"test1":0} 3.获取键test1的值连接失败 5.绑定本地回环地址-开启保护模式
1.通过python代码远程连接redis 2.插入键值对:{"test1":0} 3.获取键test1的值连接失败 6.绑定本地回环地址-关闭保护模式
1.通过python代码远程连接redis 2.插入键值对:{"test1":0} 3.获取键test1的值连接失败
通过一段Python代码简单测试redis连通性:
import redis
class RedisHandler:
def __init__(self, host, port=6379, db=0):
self.client = redis.StrictRedis(host=host, port=port, db=db) # 生成客户端连接,StrictRedis()默认使用连接池,不必再单独使用ConnectPool
def set_string(self, name: str, value, ex=None, px=None, nx=False, xx=False) -> None:
"""
缓存中写入str(单个)
:param name: 缓存名称
:param value: 缓存值
:param ex: 过期时间(秒)
:param px: 过期时间(毫秒)
:param nx: 如果设置为True,则只有name不存在时,当前set操作才执行(新增)
:param xx: 如果设置为True,则只有name不存在时,当前set操作才执行(修改)
:return:
"""
self.client.set(name, value=value, ex=ex, px=px, nx=nx, xx=xx)
def get_key(self, name):
"""读取缓存"""
print(self.client.get(name))
if __name__ == '__main__':
redis = RedisHandler(host='192.168.1.123')
redis.set_string("test1", 0)
redis.get_key("test1")
① 设置redis.conf
② 测试连通性
执行后报错如下:
通过上图可以看出:
连接Redis被拒绝了,此时Redis正在保护模式下运行,因为已启用保护模式,未指定绑定地址,未设置访问密码。在此模式下,仅接受来自环回接口的连接,即本地连接。验证通过,与期望的结果一致。
① 设置redis.conf
② 测试连通性
尽管protected mode处于开启状态,但是因为bind绑定了本机IP地址,所以保护模式是不生效的,客户端连接redis时,也能够连接成功,如下图所示,连接redis成功,并成功获取到名为test1的key的value值为0,验证通过,与期望的结果一致:
① 设置redis.conf
② 测试连通性
暂未验证
尽管protected mode处于开启状态,但是因为设置了访问密码,所以保护模式理论上是不生效的,即本地内网其他主机仍可以远程连接访问。
① 设置redis.conf
② 测试连通性
此时redis配置的是无效的IP地址,服务无法成功启动,所以客户端连接被拒。验证通过,符合预期。
① 设置redis.conf
② 测试连通性
通过上图可以看出:由于绑定了本地回环地址,只能本地连接,所以客户端在连接redis的时候被拒了。验证通过,与期望结果一致。
① 设置redis.conf
② 测试连通性
通过上图可以看出:由于绑定了本地回环地址,只能本地连接,所以客户端在连接redis的时候被拒了。验证通过,与期望结果一致。