1、将纯真版ip数据  xxx.data 导入至 redis(整个过程只花费了几秒)

引入nuget包 CSRedisCore,使用方法见:https://github.com/2881099/csredis

/// <summary>
/// 更新ip库,请先将ip库上传至 /data/qqwry.dat,gb2312格式
/// </summary>
/// <returns></returns>
[HttpPost("update_ip")]
public APIReturn 更新ip库() {
RedisHelper.Remove("iplib");
var lines = Encoding.GetEncoding("GB2312").GetString(System.IO.File.ReadAllBytes("/data/qqwry.dat")).Split(new string[] { "\r\n" }, StringSplitOptions.None);
var lines_index = 0;
while(lines_index < lines.Length) {
var members = new List<(double, string)>();
for (var b = 0; b < 50000; b++) {
try {
var ipstart = Lib.Ip2Long(lines[lines_index].Substring(0, 15).Trim());
var ipend = Lib.Ip2Long(lines[lines_index].Substring(16, 15).Trim());
var location = lines[lines_index].Substring(32).Replace("CZ88.NET", "").Trim(); members.Add((ipend, $"{ipstart}-{ipend} {location}"));
} catch { }
if (++lines_index >= lines.Length) break;
}
if (members.Count > 0)
RedisHelper.ZAdd("iplib", members.ToArray());
} return AR.成功;
}
public static long Ip2Long(string ip) {
char[] separator = new char[] { '.' };
string[] items = ip.Split(separator);
return long.Parse(items[0]) << 24
| long.Parse(items[1]) << 16
| long.Parse(items[2]) << 8
| long.Parse(items[3]);
}
public static string Long2Ip(long ipInt) {
StringBuilder sb = new StringBuilder();
sb.Append((ipInt >> 24) & 0xFF).Append(".");
sb.Append((ipInt >> 16) & 0xFF).Append(".");
sb.Append((ipInt >> 8) & 0xFF).Append(".");
sb.Append(ipInt & 0xFF);
return sb.ToString();
}

2、定义根据ip查询所在地的函数(单次查询效率在1ms以内)

public static string GetLocationByIpAddress(string ip) {
if (string.IsNullOrEmpty(ip)) return "未知";
var find = RedisHelper.ZRangeByScore("iplib", Lib.Ip2Long(ip), double.MaxValue, 1, 0);
if (find.Any()) return find.First().Substring(find.First().IndexOf(' '));
return "未知";
}

使用redis有序集合sorted set设计高效查询ip所在地的更多相关文章

  1. Redis 有序集合(sorted set),发布订阅,事务,脚本,连接,服务器(三)

    Redis 有序集合(sorted set) Redis 有序集合和集合一样也是string类型元素的集合,且不允许重复的成员. 不同的是每个元素都会关联一个double类型的分数.redis正是通过 ...

  2. redis(十四):Redis 有序集合(sorted set)

    Redis 有序集合(sorted set) Redis 有序集合和集合一样也是string类型元素的集合,且不允许重复的成员. 不同的是每个元素都会关联一个double类型的分数.redis正是通过 ...

  3. Redis 有序集合(sorted set)

    Redis 有序集合和集合一样也是string类型元素的集合,且不允许重复的成员. 不同的是每个元素都会关联一个double类型的分数.redis正是通过分数来为集合中的成员进行从小到大的排序. 有序 ...

  4. Python 操作redis有序集合(sorted set)

    #coding:utf8 import redis r =redis.Redis(host=") 1.Zadd Zadd 命令用于将一个或多个成员元素及其分数值加入到有序集当中.如果某个成员 ...

  5. (六)Redis有序集合Sorted set操作

     Sorted set全部命令如下: zadd key score1 member1 score2 member2 ... # 将一个或多个member元素及其score值加入到有序集合key当中 z ...

  6. redis(十五):Redis 有序集合(sorted set)(python)

    #coding:utf8 import redis r =redis.Redis(host="23.226.74.190",port=63279,password="66 ...

  7. redis有序集合的使用

    Redis 有序集合(sorted set) Redis 有序集合和集合一样也是string类型元素的集合,且不允许重复的成员. 不同的是每个元素都会关联一个double类型的分数.redis正是通过 ...

  8. python 操作redis之——有序集合(sorted set) (七)

    #coding:utf8 import redis r =redis.Redis(host=") 1.Zadd 命令用于将一个或多个成员元素及其分数值加入到有序集当中.如果某个成员已经是有序 ...

  9. (PHP)redis Zset(有序集合 sorted set)操作

    /** * * Zset操作 * sorted set操作 * 有序集合 * sorted set 它在set的基础上增加了一个顺序属性,这一属性在修改添加元素的时候可以指定,每次指定后,zset会自 ...

随机推荐

  1. MAC下的mysql忘记密码该怎么办??

    不要着急,不要慌,好多人会忙手忙脚,以为自己安装了一个假软件,其实是你打开的方式不对而已! step1: 苹果->系统偏好设置->最下边点mysql 在弹出页面中 关闭mysql服务(点击 ...

  2. Oracle的nvl

    在Oracle中nvl(字段名,value)函数用于对没有值的字段做处理在MySql中ifnull(字段名,value)是一样的功能

  3. C++中使用引用作为函数参数的优点

    1.传递引用给函数与传递指针的效果是一样的.这时,被调函数的形参就成为原来主调函数中的实参变量或对象的一个别名来使用,所以在被调函数中对形参变量的操作就是对其相应的目标 对象(在主调函数中)的操作. ...

  4. Appium 【已解决】提示报错:Attempt to re-install io.appium.android.ime without first uninstalling.

    详细报错:Failed to install D:\AutoTest\appium\Appium\node_modules\appium\build\unicode_ime_apk\UnicodeIM ...

  5. Docker 镜像之进阶篇

    笔者在<Docker 基础 : 镜像>一文中介绍了 docker 镜像的基本用法,本文我们来介绍 docker 镜像背后的技术原理. 什么是 docker 镜像 docker 镜像是一个只 ...

  6. Spark学习之编程进阶总结(二)

    五.基于分区进行操作 基于分区对数据进行操作可以让我们避免为每个数据元素进行重复的配置工作.诸如打开数据库连接或创建随机数生成器等操作,都是我们应当尽量避免为每个元素都配置一次的工作.Spark 提供 ...

  7. 【重学计算机】操作系统D1章:计算机操作系统概述

    1. 计算机软硬件系统 冯诺伊曼结构 以运算单元为核心,控制流由指令流产生 程序和数据存储在主存中 主存是按地址访问,线性编址 指令由操作码和地址码组成 数据以二进制编码 其他:参考<重学计算机 ...

  8. 使用NSSM把.Net Core部署至 Windows 服务

    为什么部署至Windows Services 在很多情况下,很少会把.Net Core项目部署至Windows服务中,特别是Asp.net Core就更少了.一般情况下,Asp.net Core会部署 ...

  9. Java基础面试知识点总结

    微信公众号[程序员江湖] 作者黄小斜,斜杠青年,某985硕士,阿里 Java 研发工程师,于 2018 年秋招拿到 BAT 头条.网易.滴滴等 8 个大厂 offer,目前致力于分享这几年的学习经验. ...

  10. 小步快跑的公司可以最简化操作直接通过log4net将日志写入ElasticSearch

     很多小步快跑的公司,开发人员多则3-4个,面对巨大业务压力,日连夜的赶着上线,快速试错,自然就没时间搭建一些基础设施,比如说logCenter,但初期 项目不稳定,bug又多,每次都跑到生产去找日志 ...