使用redis有序集合sorted set设计高效查询ip所在地
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所在地的更多相关文章
- Redis 有序集合(sorted set),发布订阅,事务,脚本,连接,服务器(三)
Redis 有序集合(sorted set) Redis 有序集合和集合一样也是string类型元素的集合,且不允许重复的成员. 不同的是每个元素都会关联一个double类型的分数.redis正是通过 ...
- redis(十四):Redis 有序集合(sorted set)
Redis 有序集合(sorted set) Redis 有序集合和集合一样也是string类型元素的集合,且不允许重复的成员. 不同的是每个元素都会关联一个double类型的分数.redis正是通过 ...
- Redis 有序集合(sorted set)
Redis 有序集合和集合一样也是string类型元素的集合,且不允许重复的成员. 不同的是每个元素都会关联一个double类型的分数.redis正是通过分数来为集合中的成员进行从小到大的排序. 有序 ...
- Python 操作redis有序集合(sorted set)
#coding:utf8 import redis r =redis.Redis(host=") 1.Zadd Zadd 命令用于将一个或多个成员元素及其分数值加入到有序集当中.如果某个成员 ...
- (六)Redis有序集合Sorted set操作
Sorted set全部命令如下: zadd key score1 member1 score2 member2 ... # 将一个或多个member元素及其score值加入到有序集合key当中 z ...
- redis(十五):Redis 有序集合(sorted set)(python)
#coding:utf8 import redis r =redis.Redis(host="23.226.74.190",port=63279,password="66 ...
- redis有序集合的使用
Redis 有序集合(sorted set) Redis 有序集合和集合一样也是string类型元素的集合,且不允许重复的成员. 不同的是每个元素都会关联一个double类型的分数.redis正是通过 ...
- python 操作redis之——有序集合(sorted set) (七)
#coding:utf8 import redis r =redis.Redis(host=") 1.Zadd 命令用于将一个或多个成员元素及其分数值加入到有序集当中.如果某个成员已经是有序 ...
- (PHP)redis Zset(有序集合 sorted set)操作
/** * * Zset操作 * sorted set操作 * 有序集合 * sorted set 它在set的基础上增加了一个顺序属性,这一属性在修改添加元素的时候可以指定,每次指定后,zset会自 ...
随机推荐
- .net core使用Apollo做统一配置管理
做开发这么多年,经常因配置的问题引发生产环境的bug.有些年久的项目,几百个密密麻麻的配置项,经常容易搞混,有时好几个项目有好多同样的配置项,配置工作也不厌其烦.所幸,携程开源了新一代配置中心 - A ...
- BZOJ_3170_[Tjoi2013]松鼠聚会_切比雪夫距离+前缀和
BZOJ_3170_[Tjoi2013]松鼠聚会_切比雪夫距离+前缀和 题意:有N个小松鼠,它们的家用一个点x,y表示,两个点的距离定义为:点(x,y)和它周围的8个点即上下左右四个点和对角的四个点, ...
- BZOJ_3173_[Tjoi2013]最长上升子序列_splay
BZOJ_3173_[Tjoi2013]最长上升子序列_splay Description 给定一个序列,初始为空.现在我们将1到N的数字插入到序列中,每次将一个数字插入到一个特定的位置.每插入一个数 ...
- [Noi2015]软件包管理器 BZOJ4196
分析:水题 每次安装的时候和根节点求lca的过程中区间覆盖+区间查询 每次删除的时候查询子树中安装的数量+区间覆盖 附上代码: #include <cstdio> #include < ...
- EntityFramework Core依赖注入上下文方式不同造成内存泄漏了解一下?
前言 这个问题从未遇见过,是一位前辈问我EF Core内存泄漏问题时我才去深入探讨这个问题,刚开始我比较惊讶,居然还有这种问题,然后就有了本文,直接拿前辈的示例代码并稍加修改成就了此文,希望对在自学E ...
- java.lang.NoSuchMethodError: org.springframework.boot.builder.SpringApplicationBuilder.<init>([Ljava
搭建spring cloud的时候,报以下错误: java.lang.NoSuchMethodError: org.springframework.boot.builder.SpringApplica ...
- css中常见margin塌陷问题之解决办法
塌陷问题 当两个盒子在垂直方向上设置margin值时,会出现一个有趣的塌陷现象. ①垂直并列 首先设置两个DIV,并为其制定宽高 1 /*HTML部分*/ 2 <body> 3 <d ...
- 流程控制之while循环
目录 语法(掌握) while+break while+continue while循环的嵌套(掌握) tag控制循环退出(掌握) while+else(了解) 语法(掌握) 循环就是一个重复的过程, ...
- MySQL - 扩展性 2 扩展策略:氪金氪脑任君选
如果将应用的所有数据简单地放在一台 MySQL 服务器实例上,就不用谈什么扩展性了.但是业务能稳定持续的增长,那么应用肯定会碰到性能瓶颈. 对于很多类型的应用而言,购买更高性能的机器能解决一大部分性能 ...
- Java进阶篇设计模式之九----- 解释器模式和迭代器模式
前言 在上一篇中我们学习了行为型模式的责任链模式(Chain of Responsibility Pattern)和命令模式(Command Pattern).本篇则来学习下行为型模式的两个模式, 解 ...