背景:
从自建 redis(CacheCloud)到迁移到 aliyun redis
1. 踩“坑”一
问题:
平常小伙伴们在项目中可能用到redis key expire nofity的场景(比如:处理延时任务等),但是发现迁移后 key 过期通知总是比未迁移之前的时间慢一个数量级(基本上分钟级别,社区版基本上秒级别),及时在很少的 key 情况也是一样的;之前也和 aliyun support 小伙伴沟通过,给出反馈都一个星期多了~
定位:
了解过 redis 的过期策略以及淘汰策略的小伙伴,应该都知道针对惰性删除测试,是遍历整个 db,随机选取 20 个 key(默认),淘汰;但是,aliyun redis(使用的是 4.x 版本)的默认 db 数是 256(社区版的是 16)
解决:
调整项目 redis db 数为16
参考:
redis 的数据过期和淘汰策略
https://yq.aliyun.com/articles/257459
https://juejin.im/entry/5bbf5de3e51d450e9b06229d
2. 踩“坑”二
问题:
迁移后的 redis,在域名(aliyun redis 针对社区版的主从,哨兵,集群模式等暴露出一个域名)指向 ip 发生变化的时候,客户端通过域名访问的时候,依然解析指向的是老的 ip,导致连接不上 redis~
定位:
查看 JedisConnectionFactory 的源码可以发现(以集群为例),在初始化 afterPropertiesSet 时,已经将域名解析成对应的 ip 缓存起来了,故之后域名切换 ip 后,依然访问的是之前的 ip
private JedisCluster createCluster() {
JedisCluster cluster = createCluster(this.clusterConfig, getPoolConfig());
JedisClusterConnection.JedisClusterTopologyProvider topologyProvider = new JedisClusterConnection.JedisClusterTopologyProvider(cluster);
this.clusterCommandExecutor = new ClusterCommandExecutor(topologyProvider,
new JedisClusterConnection.JedisClusterNodeResourceProvider(cluster, topologyProvider), EXCEPTION_TRANSLATION);
return cluster;
}
解决:
切换域名 ip 后重启服务