问大家一个 memcached 缓存策略

问题描述

问题是这样的:我有一个 IP 地址库(里面有近 40万 条IP地址记录),表结构是这样的:id —— 主键,自增长fromip —— ip地址段的开始值(long型的-将ip地址转换成long型存入的)toip —— ip地址段的结束值(long型的)unit —— 该ip段分配给的单位名称我主要的任务就是:查询一个IP地址在哪个IP地址段范围内,并给出其分配的单位名称。SQL语句类似这样(976362050 ——是一个IP地址的long型值):select unit from ipglobe where fromip < 976362050 and toip > 976362050因为要大量查询一些IP地址在哪个IP地址段范围内,所以如果每次都从数据库近40万条记录中检索,速度很慢。于是就想采用 memcached 缓存策略,但是想了好几天,也没有想到该如何缓存这些数据?曾经想到这样一个方法:将近40万记录以 key = "fromip#toip" value="unit" 形式存放,然后遍历所有的 key ,取key分离出fromip和toip,然后判断给的IP值是否在该key的范围内。但是后来发现遍历memcached中所有的 key 是不行的,所以想请教一下该怎么设计存储策略?? (我用的是 Java 语言)

解决方案

1.你可不可以通过一个KEY,VALUE为FORMIP,TOIP组装成一个字串遍历memcached中所有的 key 是行的,看看下面这个方法 // memcache中的KEY遍历(当前slab) // 一个SLAB中包含 多个dump public static void keySet() { Set<String> keys = new HashSet<String>(); Map<String, Integer> dumps = new HashMap<String, Integer>(); // 获取所有的slab(由服务器地址:端口号组成KEY,dump信息组成value) Map slabs = getMemCachedClient().statsItems(); Iterator itemsItr = slabs.keySet().iterator(); // 用来收集所有slab的dump号 while (itemsItr.hasNext()) { String server = itemsItr.next().toString(); Map itemNames = (Map) slabs.get(server); System.out.println(itemNames); Iterator itemNameItr = itemNames.keySet().iterator(); while (itemNameItr.hasNext()) { String itemName = itemNameItr.next().toString(); String[] itemAtt = itemName.split(":"); // 如果是itemName中是:number来表示,那么证明是一个存储数据的dump,还有一些是age的部分 if (itemAtt[2].startsWith("number")) { System.out.println(itemAtt[1] + " " + Integer.parseInt(itemAtt[1])); // put dump区号 dumps.put(itemAtt[1], Integer.parseInt(itemAtt[1])); } } } // 根据收集到的dump来获取keys if (!dumps.values().isEmpty()) { Iterator<Integer> dumpIter = dumps.values().iterator(); while (dumpIter.hasNext()) { int dump = dumpIter.next(); // statsCacheDump支持三个参数String[],int,int,第一个参数可以省略,默认填入null,表示从那些slab中获取dump号为第二个参数的keys,如果是null就从当前所有的slab中获取。 // 第二个参数表示dump号,第三个参数表示返回最多多少个结果。 // {127.0.0.1:11211={DD=[2 b; 1223911432 s], AA=[2 b; 1223911432 s], BB=[2 b; 1223911432 s]}} Map cacheDump = getMemCachedClient().statsCacheDump(dump, 10); System.out.println(cacheDump); Iterator entryIter = cacheDump.values().iterator(); while (entryIter.hasNext()) { Map items = (Map) entryIter.next(); Iterator ks = items.keySet().iterator(); while (ks.hasNext()) { String k = (String) ks.next(); try { // 这里为什么要作decode,因为其实在我使用的这个java客户端存储的时候,默认会把key都作encoding一次,所以必须要做,不然会出现问题。 k = URLDecoder.decode(k, "UTF-8"); // key 对应的VALUE是这个值的长度,过期时间 System.out.println(k); } catch (Exception ex) { ex.printStackTrace(); } } } } } }

时间: 2024-10-16 19:05:02

问大家一个 memcached 缓存策略的相关文章

浅谈Android 中图片的三级缓存策略

什么是三级缓存? 内存缓存,优先加载,速度最快 本地缓存,次优先加载,速度快 网络缓存,最后加载,速度慢,浪费流量 为什么要进行三级缓存 三级缓存策略,最实在的意义就是 减少不必要的流量消耗,增加加载速度 . 如今的 APP 网络交互似乎已经必不可少,通过网络获取图片再正常不过了.但是,每次启动应用都要从网络获取图片,或者是想重复浏览一些图片的时候,每次浏览都需要网络获取,消耗的流量就多了,在如今的流量资费来说,肯定会容易影响用户数量. 还有就是网络加载图片,有时候会加载很慢,影响了用户体验.

浅谈公司核心业务数据表的重构——结合Memcache分析缓存策略与系统数据交互

 接着上一篇的预告,本文将结合本人近来的一些思考,谈谈对于企业核心业务数据的重构,配合Memcached构思对现有架构上的一些改造.本文观点纯属一家之言,可能受制于眼界之窄,业务之浅,欢迎各位共同探讨,也欢迎拍砖! Background 公司从事GPRS车载终端产品的研发.作为配合,软件这块主要开发车辆管理信息系统,以提供对装有终端车辆的全面服务. 说到这里,我想大家应该明白,这里最核心的就是--车辆.大部分的功能几乎都是围绕着车辆在展开.给购买车机终端的厂家,提供对车辆的有效管理和控制,是系统

Redis的缓存策略和主键失效机制

作为缓存系统都要定期清理无效数据,就需要一个主键失效和淘汰策略. >>EXPIRE主键失效机制 在Redis当中,有生存期的key被称为volatile, 在创建缓存时,要为给定的key设置生存期,当key过期的时候(生存期为0),它可能会被删除. (1)影响生存时间的一些操作 生存时间可以通过使用 DEL 命令来删除整个 key 来移除,或者被 SET 和 GETSET 命令覆盖原来的数据, 也就是说,修改key对应的value和使用另外相同的key和value来覆盖以后,当前数据的生存时间

ASP.NET 2.0实现依赖Oracle的缓存策略

asp.net|oracle|策略|缓存 ASP.NET 2.0中的缓存提供了对SQL依赖项的支持,也就是说当SQL SERVER数据库中的表或行中的数据被更改后,缓存中的页面就失效,否则,页面输出可一直保留在缓存当中.这确实为程序员提供了方便.但微软一向很小家子气,只为使用自家产品SQL SERVER的程序员提供了方便,那些用Oracle数据库的ASP.NET程序员怎么办呢? 其实不用着急,因为ASP.NET 2.0中的缓存还提供了对文件依赖项的支持,也就是缓存依赖于某个文件,该文件被修改后,

Laravel中扩展Memcached缓存驱动实现使用阿里云OCS缓存

这篇文章主要介绍了Laravel中扩展Memcached缓存驱动实现使用阿里云OCS缓存,本文扩展了一个支持SASL 认证模式的Memcached缓存驱动,需要的朋友可以参考下 Laravel 是我最近用得非常多而且越用就越喜欢的一款PHP框架,由于没有向下兼容的历史包袱,完全面向对象的风格,借助 Facades 优雅的IoC Container 实现,采用 Composer 进行包管理,可以方便地引入和使用开源社区里的优秀组件--总而言之,这是一款真正让你能够 "code happy"

Universal-Image-Loader源码分析,及常用的缓存策略

讲到图片请求,主要涉及到网络请求,内存缓存,硬盘缓存等原理和4大引用的问题,概括起来主要有以下几个内容: 原理示意图     主体有三个,分别是UI,缓存模块和数据源(网络).它们之间的关系如下: ① UI:请求数据,使用唯一的Key值索引Memory Cache中的Bitmap. ② 内存缓存:缓存搜索,如果能找到Key值对应的Bitmap,则返回数据.否则执行第三步. ③ 硬盘存储:使用唯一Key值对应的文件名,检索SDCard上的文件. ④ 如果有对应文件,使用BitmapFactory.

extjs中js资源缓存策略

http的缓存协商 浏览器对静态文件的缓存主要是通过cache-control来控制的,cache-control可以设置no-cache,max-age以及must-revalidate等来设置缓存策略. 如果max-age> 0则会在max-age的时间内不访问服务器,用本地缓存的静态文件代替. 如果max-age<=0则会每次都询问服务器,资源文件是否有修改,有则200,无则304.这相当于f5操作. no-cache表示不理会缓存协商,全部重新加载.这相当于是ctrl+f5操作. mu

chrome浏览器-问大伙一个关于js的问题

问题描述 问大伙一个关于js的问题 问大伙一个关于js的问题,这是我的一句html代码 <a href="/admin/beanType/delete?_id=${idValue}" onclick="return confirm('确定要删除这条记录吗')">删除</a> 执行结果是点击删除按钮会弹出确认框,点击确定或者取消,在IE和Firefox下都正常,但在chrome下却会执行该href而且使用调试工具看不到发起这个动作的请求,我很奇

【CDN 最佳实践】CDN缓存策略解读和配置策略

CDN 作为内容分发网络主要是将资源缓存在 CDN 节点上,然后后续访问即可直接通过 CDN 节点将资源返回给客户端,而不再需要回到源站服务器以加快请求速度.那么 CDN 到底对于哪些请求加速呢?其缓存规则和缓存时间是怎么样的呢?怎么样的缓存规则更加合理呢?本文就对 CDN 的缓存规则解读. CDN 的缓存适用范围 CDN 对于常见的 HTTP 请求均是支持的,具体对不同请求方式的支持情况请参考表一.但是有一点需要注意的是虽然对这些类型的 HTTP 请求均是支持的,但是并不是对所有请求方式都会进