线上系统功能有个场景,需要获取代理IP进行爬取数据。对接的代理IP的返回接口每个IP有存活时间,需要保证一直取到的IP是有效IP,之前代码实现是定时拉取代理IP,并存放在Redis中,存活时间即Redis key的过期时间,取的时候以key的前缀查找随机取一个。这种方式实现简单,也符合需求,但是上线后Redis预警很多,查看慢日志发现大部分是该功能模糊查找key这个问题。
对于这个场景可以采用Redis 有序队列sorted set来实现,相关命令是zdd-插入,zrange-获取。定时拉取代理IP,以存活时间+拉取时间秒数作为score存入Redis中,获取的时候则是按score降序,取前10中随机一个,这样能取到最新的代理IP,满足需求。这样优化后上线Redis的预警恢复正常了。
Redis keys命令用于查找所有符合给定模式 pattern 的 key ,在生产环境Redis的key可以达到几十万,所以命令会占用大量性能,一般来说生产环境会建议禁用keys命令该功能。
网友评论