`
我想我是海
  • 浏览: 214420 次
社区版块
存档分类
最新评论

Memcached大量数据缓存策略探讨

阅读更多
使用Memcached。需求是这样的:系统需要把大量的关键常用数据(十万条以上,在不断增长中)放到缓存中,为提高程序执行效率。那么这些数据在缓存中的存储方式是怎样的时候,效率最高?站在目前的缓存工具角度来想,假设要缓存的数据为手机的订阅关系,可以有下面两种做法:
一,在缓存中建一个Cache,键为subsription,值则是一个大哈希表,哈希表存放所有的数据,以唯一的手机做Key,相关订阅信息做Value。
如此要查询一个手机的订阅数据,要先从Cached里拿到到key为subscription的缓存,这是个大哈希表,然后再从哈希表里按手机拿出订阅信息:
Map datas = memcached.get("subscription");
Subsciption s = datas.get(mobile);

这样的缺点就是查询客户端会从Memcached的Server拿到一个巨大的Map。不仅网络开销大,并且客户端也要开辟大块内存来存放这个临时的Map。
二,每一个订阅关系作为一个缓存实体放到Memcached中。那就意味着查询极为方便:
Subscription sub = memcached.get(mobile);

但是在Memcached里就会有几十万个缓存实体了,不知道是否会给查询带来速度上的影响。另一个不便的地方就是从缓存里拿不到订阅关系的总数(当然这个需求显得很鸡肋)。

下面是我自己的一些幻想。假如我按照做法一来存放数据。查询能这样就好了:
Subscription sub = memcached.get(“subscription#” + mobile);

不需要担心服务器端给客户端返回一个大Map,又占用客户端巨大的内存资源。所有的嵌套查找工作交给服务器去做,最后返回我想要的订阅关系即可。当然,我依然可以使用get("subscription")拿回一个大Map。

不过看起来我这样的想法应该是有点不实际。更多的是我想请教下大家,在大数量缓存的情况下,大家会使用什么样的缓存策略?
分享到:
评论
12 楼 我想我是海 2007-06-27  
请看看我贴子里下面一段关于我的幻想。跟你问的是一样的。
我说的Server端是指Memcached Server。假如它本来就有这样的功能那就好了。实际上不是。我们需要通过Client API拿到Map再进行筛选。在通过Client API获得MAP的时候,网络传输、占用内存的情况就自然出现了。:)
除非Memcached加入支持嵌套查询的代码。不过使用做法二就不需要考虑这样的情形了。也罢。
11 楼 fins 2007-06-27  
Client会从Server端拿回一个大Map

那为什么不在 Server端 就对大Map进行筛选 只把客户端需要的传过去呢?
10 楼 我想我是海 2007-06-27  
@ fins
客户端是指Memcached Client。
如果按照第一种做法,Client会从Server端拿回一个大Map,然后从Map里面拿自己想要的数据。这时候要从Server那边反序列化出一个Map对象,并且此对象是相当巨大的。

BTW:这种需求的确跟命中率没关系的。
9 楼 fins 2007-06-27  
lz
"查询客户端会从Memcached的Server拿到一个巨大的Map。不仅网络开销大,并且客户端也要开辟大块内存来存放这个临时的Map"

这里的客户端是指什么???? 不是浏览器吧??

还有 我没明白这个和网络开销有什么关系
Memcached的Server端直接取得最终要查询的数据,然后传给客户端就可以了啊,没理解你的具体的场景
8 楼 fins 2007-06-27  
lihy70 写道
风往北吹 写道
采用第二种做法。
其实楼主说了一个cache的命中率的问题,在设计cache时命中率也是要考虑一下的,如果某些数据命中率非常高的,就应该单独做key来读取,程序也可以优化使得命中率高的最快get到。


扯蛋,这跟命中率有什么关系?
命中率讲get能不能得到数据,反过来说就是考虑,应该缓存那些数据,提高空间的利用率。
lz讲的是怎样快速的get到结果, 你缓存的数据的多少,对cache的get的速度并没有多大的影响。

fins 写道
如果数据量很大的话 也可以对手机号进行分类

例如 按前三位 做多个缓存
133 130 131 135 138 139 158..... 其他
或者按奇偶分

这样也可以提高一些命中率


这样做,是吃包了撑着没事干。
更不明白跟命中率有和关系?


我的意思是类似分治
从10万个对象中 挑出一个快, 还是 把10万个分类,然后从每类里取快呢
可能我确实是"吃包了撑着没事干",我只是对 "手机号码" 这个比较敏感
毕竟做了电信两年多了, 处理几千万的手机号相关的数据时, 这是一个很常规的方法.
不过也许确实 用在缓存里有些多于 毕竟缓存里的数据不会太多



风往北吹在扯淡, 我是吃饱了撑着没事干
那您的高见是????
7 楼 我想我是海 2007-06-27  
谢谢Fins的建议。
不过像这样只是将一个大Map换成了几个相对小的Map。做法一所讲的负面影响还是一样存在。
6 楼 lihy70 2007-06-27  
风往北吹 写道
采用第二种做法。
其实楼主说了一个cache的命中率的问题,在设计cache时命中率也是要考虑一下的,如果某些数据命中率非常高的,就应该单独做key来读取,程序也可以优化使得命中率高的最快get到。


扯蛋,这跟命中率有什么关系?
命中率讲get能不能得到数据,反过来说就是考虑,应该缓存那些数据,提高空间的利用率。
lz讲的是怎样快速的get到结果, 你缓存的数据的多少,对cache的get的速度并没有多大的影响。

fins 写道
如果数据量很大的话 也可以对手机号进行分类

例如 按前三位 做多个缓存
133 130 131 135 138 139 158..... 其他
或者按奇偶分

这样也可以提高一些命中率


这样做,是吃包了撑着没事干。
更不明白跟命中率有和关系?
5 楼 fins 2007-06-27  
如果数据量很大的话 也可以对手机号进行分类

例如 按前三位 做多个缓存
133 130 131 135 138 139 158..... 其他
或者按奇偶分

这样也可以提高一些命中率
4 楼 我想我是海 2007-06-27  
楼上所说的由命中率来决定是否用单独的Key来读取,看起来只能在设计阶段评估哪类的数据命中率较高。运行期中有办法可以让实际上命中率高的数据在缓存中存储的方式发生改变?我想即使可以,程序付出的代价也是相当大的。
3 楼 风往北吹 2007-06-27  
采用第二种做法。
其实楼主说了一个cache的命中率的问题,在设计cache时命中率也是要考虑一下的,如果某些数据命中率非常高的,就应该单独做key来读取,程序也可以优化使得命中率高的最快get到。
2 楼 我想我是海 2007-06-27  
我想是的。担心那几十万条数据如何存放是我过虑了。很明显我是应该使用第二种做法。
1 楼 lihy70 2007-06-27  
首先你肯定不能保存或返回所有的信息,除了你说的那些缺点, 用一个key,这样极不利于信息共享,

第二,你应该不需要担心cache怎么根据一个key得到一个相对应的内容,
不管它怎么实施,应该不会比map差,它至少可以用hash算法。
根据key快速存取内容对这种(key, value)cache来说极重要的,
具体的性能,你可以测试一下。

相关推荐

    PHP MemCached 高级缓存应用代码

    通过以上的解析,我们可以看到PHP与Memcached结合的强大之处,特别是在处理大量数据、高并发请求的场景下,合理利用缓存可以极大地提升应用的性能和用户体验。然而,值得注意的是,缓存策略的设计应当考虑到数据的...

    memcached 缓存图片

    - 使用一致性哈希:在分布式环境中,一致性哈希能确保数据在节点之间均匀分布,避免因添加或移除节点导致大量数据迁移。 - 监控与维护:定期检查Memcached的性能,确保内存使用合理,防止内存溢出,同时监控缓存命中...

    项目中使用 hibernate-memcached 做二级缓存

    总的来说,结合Hibernate的二级缓存机制和Memcached的分布式缓存能力,可以在项目中实现高效的数据缓存,提升系统的响应速度。同时,了解并掌握Memcached的基本原理和配置方法,对于提升系统架构的优化能力大有裨益...

    memcached数据完整迁移到redis

    Memcached 的主要特点包括简单的键值对存储、内存优化的数据结构以及基于内存的缓存机制,适用于处理大量临时数据。 **Redis** 相比之下,Redis 是一个更全面的、支持更多数据结构的键值存储系统。除了基本的键值对...

    memcached各种序列化策略之session共享

    标题提到的"memcached各种序列化策略之session共享",意味着本文将探讨如何在Memcached中使用不同的序列化方法来共享Web应用中的session数据。Memcached是一个高性能、分布式内存对象缓存系统,常用于减轻数据库负载...

    Memcached 分布式缓存实现原理简介

    本文主要探讨了Memcached的分布式实现,以及它如何通过简单的策略来达到高效的数据分布。 首先,让我们了解缓存的基本概念。在冯·诺依曼计算机体系结构中,存储层次理论是核心,从高速缓存到主存,再到硬盘,存储...

    ASP.NET数据缓存技术

    在这个主题中,我们将深入探讨ASP.NET数据缓存的原理、使用方法以及优化策略。 1. 缓存的基本概念 缓存是一种存储技术,用于暂时存储经常访问的数据,以便快速获取。在ASP.NET中,数据缓存分为两种主要类型:页面...

    数据缓存技术

    数据缓存技术是一种重要的优化策略,特别是在处理大量频繁查询但对数据实时性要求不高的情况下。在IT领域,数据缓存被广泛应用于减轻数据库压力,提高系统响应速度,提升用户体验。这里我们将深入探讨mybatis二级...

    phpExcel导出大量数据出现内存溢出错误的解决方法

    总之,针对phpExcel在导出大量数据时出现的内存溢出问题,我们可以通过采用不同的缓存策略和数据处理方法来有效解决。理解并灵活运用这些方法,可以在保证程序运行稳定的同时,提升处理效率和用户体验。在实际开发中...

    分布式缓存 Redis + Memcached 经典面试题!.zip

    - Redis 与 Memcached 在缓存淘汰策略上的差异 6. 应用实例: - 使用 Redis 实现计数器服务 - 使用 Memcached 缓存数据库查询结果 - 利用 Redis 的有序集合实现排行榜功能 - 通过 Redis 的发布订阅功能实现...

    Openresty 缓存策略.zip

    本文将深入探讨 OpenResty 的缓存策略,包括缓存的原理、实现方式以及优化技巧。 首先,我们需要理解缓存的基本概念。缓存是一种存储机制,用于临时存储经常访问的数据,以便后续请求能更快地获取数据,减少了网络...

    java使用memcached demo

    通过以上步骤,你可以在Java项目中成功集成并使用Memcached,实现高效的数据缓存。这不仅有助于提升应用性能,还能降低数据库的压力。在实际开发中,可以根据项目需求调整缓存策略,优化缓存效果。

    缓存应用程序页面和数据

    通过理解和熟练运用C#中的缓存机制,结合适当的数据缓存策略,可以显著提高应用程序的响应速度,为用户提供更流畅的体验。在实际开发中,根据项目需求选择合适的缓存技术和策略,同时注意缓存的维护和优化,是每个...

    memcached工具类源码

    - **缓存击穿和雪崩问题**:设计合理的缓存更新策略,避免大量请求同时导致数据库压力剧增。 6. **实际应用** Memcached工具类在实际项目中通常用于缓存常见的API响应、用户会话、热点数据等,以减少数据库的读写...

    memcached-1.5.11.tar.gz

    这种设计使得Memcached在处理大量小数据块时表现出色,特别适合于存储session、网页片段等临时性数据。 二、Memcached的安装与配置 1. 解压文件:首先,我们需要对"memcached-1.5.11.tar.gz"进行解压,这通常可以...

    .net 框架,数据缓存类

    本文将深入探讨.NET框架中的数据缓存机制,以及`DataCache`类的使用。 数据缓存的目标是减少不必要的数据库交互,从而降低服务器负载,提升响应速度。在.NET框架中,微软提供了多种缓存解决方案,包括ASP.NET缓存、...

    C#实现数据缓存控制帮助类

    本文将深入探讨如何使用C#实现一个数据缓存控制帮助类,以及其背后的原理和最佳实践。 首先,我们需要理解缓存的基本概念。缓存是一种存储系统,它保存最近或最常用的数据以便快速访问。在C#中,我们可以利用.NET...

    memcached测试的工具类

    - **压力测试**: 连续大量地设置和获取数据,观察Memcached的响应时间和稳定性,检查是否存在性能瓶颈。 - **内存占用监测**: 监控Memcached内存使用情况,确保不会超出预设的内存限制。 3. **命中率测试**: - ...

    JAVA-memcached简单例子

    - 使用适当的缓存策略,如LRU(最近最少使用)或LFU(最不常用)来控制缓存淘汰。 - 分布式环境下的多节点配置和负载均衡需要额外的考虑,如一致性哈希。 总之,Java与Memcached的结合使用可以极大地提升应用程序...

    memcached开源库源码分享

    4. **缓存策略** - **LRU(Least Recently Used)**: 当内存空间不足时,Memcached会使用LRU策略删除最近最少使用的Item,以腾出空间给新数据。 - **Hash表**: 使用哈希表存储键值对,快速查找和删除Item。 5. **...

Global site tag (gtag.js) - Google Analytics