使用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会自 ...
随机推荐
- SpringSecurityOauth RCE (CVE-2016-4977) 分析与复现
目录 0x00 前言 0x01 调试分析 0x02 补丁分析 0x03 参考 影响版本: 2.0.0-2.0.9 1.0.0-1.0.5 0x00 前言 这个漏洞与之前那个SpringBoot的SpE ...
- asp.net core系列 47 Identity 自定义用户数据
一.概述 接着上篇的WebAppIdentityDemo项目,将自定义用户数据添加到Identity DB,自定义扩展的用户数据类应继承IdentityUser类, 文件名为Areas / Ident ...
- 前端笔记之NodeJS(一)初识NodeJS&内置模块&特点
一.NodeJS简介 NodeJS是开发服务器后台的东西,和PHP.JavaEE.python类似,和传统的浏览器的关注DOM的JS完全不同,将JavaScript触角伸到了服务器端.内核是Chrom ...
- [译]PEP 380--子生成器的语法
导语: PEP(Python增强提案)几乎是 Python 社区中最重要的文档,它们提供了公告信息.指导流程.新功能的设计及使用说明等内容.对于学习者来说,PEP 是非常值得一读的第一手材料,学习中遇 ...
- FreeSql 扩展包实现 Dapper 的使用习惯
简介 FreeSql.Connection.Extensions 这是 FreeSql 衍生出来的扩展包,实现(Mysql/postgresql/sqlserver/Oracle/SQLite)数据库 ...
- SQL优化 MySQL版 - B树索引详讲
SQL优化 MySQL版 - -B树索引详讲 作者:Stanley 罗昊 [转载请注明出处和署名,谢谢!] 为什么要进行SQL优化呢?很显然,当我们去写sql语句时: 1会发现性能低 2.执行时间太 ...
- .netcore2.1使用swagger显示接口说明文档
项目之前开发完接口后,我们还需要写接口说明文档,现在有了swagger方便了很多,可以网页版直接测试,当然了也减少了我们的工作量. 使用swagger生成接口说明文档,大致需要2个步骤 1.从“管理 ...
- ArcGIS JavaScript API4.8 底图选择的几种方案
创建一个HTML页面,引入ArcGIS JavaScript API,在<body>标签内创建一个div并添加ID值,在<head>标签内设置样式<style>,在 ...
- Alpha阶段Scrum Meeting合集(江山代有才人秃队)
Day URL 第一天 第1篇Scrum冲刺博客 第二天 第2篇Scrum冲刺博客 第三天 第3篇Scrum冲刺博客 第四天 第4篇Scrum冲刺博客 第五天 第5篇Scrum冲刺博客 第六天 第6篇 ...
- #if和#ifdef的区别
学习STM32偶然发现:在Keil中直接预先定义宏USE_STDPERIPH_DRIVER,但是却没有指定宏的值.而在头文件中判断用的是如下代码: #ifdef USE_STDPERIPH_DRIVE ...