线上系统功能有个场景,需要获取代理IP进行爬取数据。对接的代理IP的返回接口每个IP有存活时间,需要保证一直取到的IP是有效IP。
第一种实现方案,使用redis key 过期时间的特性,定时拉取代理IP,并存放在Redis中,存活时间即Redis key的过期时间,取的时候以key的前缀查找随机取一个。这种方式实现简单,也符合需求,但是上线后Redis预警很多,查看慢日志发现大部分是该功能模糊查找key这个问题。
对这个问题需要优化一下,采用第二种方案 ,使用Redis 有序队列sorted set来实现,sorted set可以对元素设置分值属性,并且支持按分值排序获取。相关命令是zdd-插入,zrange-获取,zrem-移除。定时拉取代理IP,以存活时间+拉取时间秒数作为score存入Redis中,获取的时候则是按score降序,取前10中随机一个,这样能取到最新的代理IP,满足需求。这样优化后上线Redis的预警恢复正常了。
Redis keys命令用于查找所有符合给定模式 pattern 的 key ,在生产环境Redis的key可以达到几十万,所以该命令会占用大量性能,一般来说生产环境会建议禁用keys命令该功能。
代理ip用的快代理,性价比高,文档也比较完善。之前使用过站大爷,发现费用比这边贵一半就没用了,IP质量差不多