实战:php环境下redis实现IP查找

2012 年 9 月 3 日8590

【IT168技术】redis中提供了丰富的数据类型,如字符串(string)、列表(list)、哈希表(hash)、集合(set)及有序集合(Sorted set)等,可以实各种有趣的应用,如使用有序集合,实IP查找。在这里,我们进行一下比较,测试一下使用redis实现ip查找在php中的效率,并与使用二分查找IP方法进行比较。

  一、准备

  搭建测试环境,安装Redis 2.4.6、php 5.2.17以及phpredis扩展。

  通常我们需要根据用户的ip地址,获得归属地信息,而ip库中的ip信息一般是这种格式:“1.12.0.0-1.15.255.255 北京方正宽带”,表示1.12.0.0-1.15.255.255这个段内的ip,是北京的ip,使用方正宽带上网。

  针对这种情况,我们构造两个数组,格式分别是

  以及

  $ip数组中存放IP段起始、截止ip经过ip2long函数转换后的数值。根据ip,可以获得存放在$ipadd数组中对应的ip段(17563648-1782579),然后就可以在$ipinfo数组中唯一确定该IP所在地的信息“北京方正宽带”。在这里,就是测试根据ip查找对应的ip段的效率。

  把$ipadd数组,保存到redis里面,保存成有序集合格式。其中ipaddress.dat中保存了完整的按照$ipadd格式组织的ip库信息,共有11万多条记录。

  进入redis,查看集合情况

  可以看到,ip集合中有21万多条,包括了10万多条ip信息(实际上是11万多条,因为起始ip有重复,这里简单的认为起始ip就是唯一的)。

  准备测试数据,采用某个网站的实际访问日志test.access_log,ip分布在全国各地。格式如下:

  测试记录条数:200000

0 0