redis 连接遇到的坑

一、安装服务器

Q: redis.exceptions.ConnectionError: Error 111 connecting to localhost:6379. Connection refused.

A: redis 安装redis服务

sudo apt-get install redis-server

二、防火墙关闭

Q:redis exceptions ConnectionError Error 113 connecting  ...... no route to host

A: 关闭防火墙

sudo iptables -F

但是关闭之后,还是会出现no route to host 的问题,查询进程,发现用kill的方式杀不掉进程(会自动重启 /usr/bin/redis-server 127.0.0.1:6379)

ps -ef | grep -i redis #查看redis进程id
#杀死进程
sudo kill -9 id

 关闭redis服务

/etc/init.d/redis-server stop

重启redis:

redis-server

三、修改配置文件

重启redis后,redis.exceptions.ResponseError: DENIED Redis is running in protected mode because protected mode is enabled, no bind address was specified, no authentication password is requested to clients.

找到配置文件  /etc/redis/redis-conf

1. 将绑定的ip号注释

#bind 127.0.0.1

2. 在配置文件最后加上

protected-mode no

重启后顺利连接

 

附:

发送程序:

import time
import redis
r = redis.StrictRedis(host = "10.11.80.200", port = 6379, db=1)
#r = redis.StrictRedis(host = "127.0.0.1", port = 6379, db=1)
i = 0
while True:
    i += 1
    r.publish("first channel", "the i is " + str(i))
    print("the i is " + str(i))
    time.sleep(1)

 接收程序:

import time
import redis
r = redis.StrictRedis(host = "10.11.80.200", port = 6379, db=1)
p = r.pubsub()
p.subscribe("first channel")
for item in p.listen():		#监听状态:有消息发布了就拿过来
    if item['type'] == 'message':
        print(item['data'])

 

### JedisCluster 使用中常见问题与解决方法 #### 连接超时或失败 在高并发场景下,可能会遇到连接超时或失败的情况。这通常是因为JedisCluster默认的连接池配置不足以应对大量请求。 为了优化这个问题,可以通过调整`GenericObjectPoolConfig`来增加最大活动对象数(`maxTotal`)以及等待获取连接的最大时间(`maxWaitMillis`): ```java GenericObjectPoolConfig poolConfig = new GenericObjectPoolConfig(); poolConfig.setMaxTotal(64); poolConfig.setMaxIdle(10); poolConfig.setMinIdle(5); poolConfig.setMaxWaitMillis(2000L); Set<HostAndPort> jedisClusterNodes = new HashSet<>(); jedisClusterNodes.add(new HostAndPort("127.0.0.1", 7001)); // 添加其他节点... JedisCluster jc = new JedisCluster(jedisClusterNodes, poolConfig); ``` 上述设置能够有效缓解因资源不足而导致的服务不可达现象[^2]。 #### 节点信息更新延迟 由于JedisCluster会在本地缓存各个Redis实例的信息并维持相应的连接池,因此在网络状况不佳或者集群拓扑发生变化的时候可能出现旧的数据未及时刷新的问题。对于这种情况,建议适当缩短心跳检测的时间间隔以便更快感知到变化;另外也可以通过手动调用`refreshSlotsCache()`强制重新同步最新的槽位分配情况。 ```java jc.getConnectionHandler().getSlotCache().clear(); // 清除现有缓存 jc.refreshSlotsCache(); // 刷新slot映射表 ``` 此操作有助于保持客户端所持有的元数据始终处于最新状态从而减少错误发生几率[^1]。 #### 多键事务处理局限性 值得注意的是,在分布式环境下实现跨多个物理机器间的原子性操作是非常复杂且代价高昂的事情。鉴于这一点,Redis本身仅提供了针对单一服务器内部多条记录的同时修改能力——即所谓的MULTI/EXEC机制。一旦涉及到了不同主机之间的协调,则不再适用此类方式完成一致性保障的任务了[^5]。 如果应用程序确实存在这方面的需求,则需考虑采用诸如两阶段提交协议(Two-phase Commit Protocol)或者其他更高级别的补偿措施来弥补这一缺陷所带来的影响。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值