write tcp 127.0.0.1:53008->127.0.0.1:6379: use of closed network connection原因—Go连接Redis

在使用连接redis时遇到了一些问题。容许我从头讲起

第三方开源库

go get -v github.com/garyburd/redigo/redis

使用时导入SDK包

 操作使用Redis

func main() {
	//func Dial(network, address string, options ...DialOption)
	// 连接方式: tcp   地址:本机ip+端口号
	conn, err := redis.Dial("tcp", ":6379")
	//认证redis
	_, err = conn.Do("AUTH", "123456")
	if err != nil {
		conn.Close()
	}
	fmt.Println("success")
	s, err := redis.String(conn.Do("get", "key1"))
	fmt.Println(s)
	//类型断言接口
	r, err := redis.Int(conn.Do("Get", "key1"))
	if err != nil {
		fmt.Println(err)
	}
	fmt.Println(r)
	//延时关闭
	conn.Close()
}

此时提示报错信息


说明原因:

其实一开始我也没有注意到自己的代码究竟是哪里错了,知道后面,我查看了一下关于Redis的认证问题,发现在个人自己刚刚下完Redis,并且使用go进行连接和使用时,是不需要这个安全认证的,因为自己还未进行设置安全认证(我之所以之前加这个安全认证,也是因为看的GO连接Redis的一篇博客,看着人家加了,然后自己也加了,但是却没有跑通) ,所以导致安全认证失败,无法正常使用Redis。


解决方式:

将Redis的安全认证代码注释掉即可。

func main() {
	//func Dial(network, address string, options ...DialOption)
	// 连接方式: tcp   地址:本机ip+端口号
	conn, err := redis.Dial("tcp", ":6379")
/*	//认证redis
	_, err = conn.Do("AUTH", "123456")
	if err != nil {
		conn.Close()
	}*/
	fmt.Println("success")
	s, err := redis.String(conn.Do("get", "key1"))
	fmt.Println(s)
	//类型断言接口
	r, err := redis.Int(conn.Do("Get", "key1"))
	if err != nil {
		fmt.Println(err)
	}
	fmt.Println(r)
	//延时关闭
	conn.Close()
}

PS:

关于Redis的安全认证:

Redis数据库的默认打开方式为无密码打开,现在要将其设置为以密码形式打开。

第一种方式:Redis文件夹内容

1、修改配置文件 

在redis.windows.conf文件中设置密码的命令中添加requirepass 123456一行,将Redis数据库的密码设置为123456

2、运行redis-server.exe程序

3、双击运行redis-cli.exe程序

4、输入 config get requirepass 命令

回车后,显示空字符串

5、输入auth “123456”命令

显示error

6、用带参数(配置文件)的形式运行redis-server.exe程序

创建一个bat文件,文件内容如下:

@echo offtitle rediscd /d D:\Program Files\Redis-x64-3.2.100redis-server.exe redis.windows.conf

其中D:\Program Files\Redis-x64-3.2.100为redis的安装路径。

7、输入auth “123456”命令

显示OK

8、输入config get requirepass
显示密码

第二种方式:

打开redis.conf,找到requirepass所在的地方,修改为指定的密码,再去掉前面的#号注释符,然后重启redis即可。

注意:密码为明文的,所以我们要保证redis.conf文件的权限以保证更加安全。

设置成功后,现在我们操作redis就需要密码了。

不输入密码也可以进入,但是当对key进行操作的时候,就会提示“(error) ERR operation not 

permitted”,此时输入auth reson(reson为我设置的密码)就可以操作了,如下图所示:

 

### 解决HTTP POST请求连接重置的问题 当遇到`error: connection reset by peer`错误时,这通常意味着服务器主动关闭了客户端的连接。对于尝试访问 `http://127.0.0.1:11434/api/show` 的情况,可以从以下几个方面排查并解决问题。 #### 配置超时设置 确保消费者和服务提供者之间的连接配置合理。例如,在某些情况下可以调整消费者的连接超时时间来适应网络状况或服务响应速度: ```yaml connectTimeout: 600000 # 设置较长的连接超时时间为600秒[^1] ``` 然而,此参数仅适用于特定框架下的RPC调用场景,并不直接作用于HTTP协议层面;因此还需要考虑其他因素。 #### 检查本地服务状态 确认目标地址上的应用是否正常运行以及监听指定端口。如果命令行工具返回如下提示,则表明当前环境未能成功建立到API接口所在位置的有效通信链路: ``` The connection to the server localhost:8080 was refused - did you specify the right host or port? ``` 上述信息暗示可能是因为未启动相关服务或者指定了错误的服务地址/端口号所引起的问题[^2]。针对这个问题,建议执行以下操作验证目的主机上对应进程的状态: - 使用 `netstat`, `ss` 或者 `lsof` 命令查看是否有程序正在占用所需端口; - 尝试通过浏览器或其他HTTP客户端发送GET请求测试该路径是否存在; - 查看应用程序日志文件了解更详细的报错原因。 #### 调整防火墙规则与安全组策略 有时即使服务已经就绪也可能由于网络安全机制阻止外部流量进入而导致无法完成握手过程。此时应当审查操作系统自带防火墙(如iptables)、云平台实例的安全组设定以及其他任何中间件设备(代理、负载均衡器等),确保允许来自预期源IP范围内的入站TCP连接到达目的地端口。 #### 客户端代码优化 编写健壮性的客户端逻辑也很重要,比如适当增加重试次数、处理异常情形的能力等特性能够提高整体系统的稳定性。下面给出一段Python示例用于发起带超时控制的POST请求: ```python import requests try: response = requests.post( url='http://127.0.0.1:11434/api/show', timeout=5, # 请求超时时长设为五秒钟 json={"key": "value"} # 发送JSON数据体作为payload ) except (requests.exceptions.ConnectionError, requests.exceptions.Timeout) as e: print(f"An error occurred while making request:{e}") else: if response.status_code == 200: result = response.json() print(result) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值