后台需要获取访问者的ip,然后通过ip进行定位,这时候由于并发很高,并且ip库的数据大概有几百万条导致数据库查询超时而影响整个系统,有没有什么好的办法呢?
贴上代码,查询了IP之后放到缓存里面。
/// <summary>
/// 本地缓存库
/// </summary>
private static Dictionary<string, CityInfo> addressCache = new Dictionary<string, CityInfo>();
public static CityInfo GetAddress(string ip)
{
if (!regex.IsMatch(ip) || ip == NO_IP) return ip ?? string.Empty;
if (addressCache.ContainsKey(ip)) return addressCache[ip];
lock (addressCache)
{
if (!File.Exists(IPDATA_PATH)) return new CityInfo(); ;
City db = new City(IPDATA_PATH);
CityInfo info = db.findInfo(ip, "CN");
if (!addressCache.ContainsKey(ip)) addressCache.Add(ip, info);
return info;
}
}
另外,IP库如果只是要精确到城市,可以不用数据库,很多第三方的IP库文件数据库可以进行查询,把IP库加载进入内存(仅十几M而已),会减少很多不必要的IO开销。
解决应用高并发的问题方法: 第一,确认服务器硬件是否足够支持当前的流量。 普通的P4服务器一般最多能支持每天10万独立IP,如果访问量比这个还要大,那么必须首先配置一台更高性能的专用服务器才能解决问题,否则怎么优化都不可能彻底解决性能问题。 第二,优化数据库访问。 服务器的负载过大,一个重要的原因是CPU负荷过大,降低服务器CPU的负荷,才能够有效打破瓶颈。而使用静态页面可以使得CPU的负荷最小化。前台实现完全的静态化 当然最好,可以完全不用访问数据库,不过对于频繁更新的网站,静态化往往不能满足某些功能。 缓存技术 就是另一个解决方案,就是将动态数据存储到缓存文件中,动态网页直接调用这些文件,而不必再访问数据库,WordPress和Z-Blog都大量使用这种缓存技术 。我自己也写过一个Z-Blog的计数器插件,也是基于这样的原理。 如果确实无法避免对数据库的访问,那么可以尝试优化数据库的查询SQL.避免使用Select *from这样的语句,每次查询只返回自己需要的结果,避免短时间内的大量SQL查询。 来源于网络,供您参考
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。