`

分布式缓存---Memcached 入门

阅读更多
【1】Memcached是使用基于Key-value值对形式的内存缓冲,它不是使用磁盘缓冲来充当缓冲,而是使用实实在在的物理内存。

【2】Memcached需要在启动时就指定分配的内存大小。命令如:memcached -d -m 内存大小(M为单位) -l IP地址 -p 端口

【3】Memcached是一种单索引的结构化数据组织形式,所有数据项之间彼此独立(不想传统的数据是关系型的),每个数据项都以key为唯一索引,不要以关系型的思维来对待缓存

【4】Memcached使用基于key的hash算法来存储数据,查询的时间复杂度达到O(1)

【5】Memcached使用LRU算法来淘汰缓冲数据项,但同时允许使用者设定缓存过期时间,这个时间需要根据测试而定

【6】Memcached使用libevent函数库来实现网络并发模型,支持较大并发用户数环境下的缓存操作

【7】Memcached使用对象序列化技术,可以把对象序列化成二进制数据,在网络中传输

【8】Memcached可以和JSON格式结合,把内存中对象以JSON形式表示,然后序列化为字符串后缓存起来

【9】Memcached的客户端API可以支持直接把对象保存到缓存中,也可以直接从缓存中取出对象,隐藏了转换的细节

【10】使用Memcached的一个核心问题就是:什么内容是可以缓存的?什么是没有必要实时发生的

【11】不要在Memcached上使用锁来防止线程竞争,而是使用其提供的原子递增操作

【12】Memcached的状态参数中:total_items、bytes、get_hits、bytes_read、bytes_written、limit_maxBytes都是很常用的参考数据

【13】Memcached的状态中,要关注的有空间使用率、缓存命中率、IO流量

【14】Memcached的缓存数据分区,最好不要基于业务数据内容种类,而是采用和业务无关的分区算法,否则容易造成负载不平衡

【15】Memcached扩展后,需要在前端通过一个“缓存连接器”来根据散列算法分配缓存数据

【16】Memcached的数据理论上都来自于底层的持久化资源,所以当缓存扩展后,可以清除它。前提是必要的数据已经持久化了

【17】缓存不是持久化设施,不要用持久化的理念去对待缓存中的数据。它本来就已经存在对应的持久化资源了

【18】缓存中的数据最好是临时性数据(无必要持久化,而只是作为流程控制用)或者已经有对应的持久化资源存在的(必要时可以重建)

【19】Memcached采用的是“块分配”的内存分配模式,同时对key的限制是250字节,对value的限制是1M大小

【20】Memcached采用是偷懒替代法,不会开额外的进程来实时监测过时的kv对并删除,而是当且仅当,新来一个插入的数据,而此时又没有多余的空间放了,才会进行清除动作。

【21】一旦数据库的数据发现变化,我们一定要及时更新cache中的数据,来保证app读到的是同步的正确数据。当然我们可以通过定时器方式记录下cache中数据的失效时间,时间一过就会激发事件对cache进行更新,但这之间总会有时间上的延迟,导致app可能从cache读到脏数据,这也被称为狗洞问题。

【22】当一个ms上丢失了数据之后,app还是可以从数据库中取得数据。不过更谨慎的做法是在某些ms不能正常工作时,提供额外的ms来支持cache,这样就不会因为app从cache中取不到数据而一下子给数据库带来过大的负载。

【23】有了缓存的支持,我们可以在传统的app层和db层之间加入cache层,每个app服务器都可以绑定一个mc,每次数据的读取都可以从ms中取得,如果没有,再从db层读取。而当数据要进行更新时,除了要发送update的sql给db层,同时也要将更新的数据发给mc,让mc去更新ms中的数据。

【24】为了最小化数据库的负载压力,我们可以部署数据库复写,用slave数据库来完成读取操作,而master数据库永远只负责三件事:1.更新数据;2.同步slave数据库;3.更新cache。

【25】因为现在key是散列在不同的server上的,所以对某类key进行大批量清理是很麻烦的。因为memcached本身是一个大hash表,是不具备key的检索功能的。所以memcached是压根不知道某一类的key到底存了多少个,都存在哪些server上。而这类功能在实际应用中却是经常用到。
分享到:
评论

相关推荐

    Memcached分布式缓存入门

    Memcached分布式缓存入门,全面具体讲解Memcached原理,并有相关例子,是入门学习好资料.

    .NET分布式缓存Memcached从入门到实战源码下载

    .NET分布式缓存Memcached从入门到实战源码下载

    memcached1.4.31

    memcached是一套分布式的高速缓存系统

    memcached入门文档

    Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载。它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提供动态、数据库驱动网站的速度。Memcached基于一个存储键/值对的...

    memcached全面剖析

    这篇连载语言简洁、通俗易懂,非常适合 memcached 入门的人阅读。 因此我将它翻译成中文,发表在我的技术 blog( tech.idv2.com)上。然后将翻译结果合并后稍作加 工, 形成了这篇 PDF 文档,以方便阅读。

    Memcached 入门介绍(安装与配置)

    Memcached是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载。 它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提供动态、数据库驱动网站的速度。 Memcached基于一个存储键值对的...

    dubbo技术介绍

    入门 背景 需求 架构 用法 快速启动 服务提供者 服务消费者 依赖 必需依赖 缺省依赖 可选依赖 成熟度 功能成熟度 策略成熟度 配置 Xml配置 属性配置 注解配置 API配置 示例 启动时检查 集群容错 负载均衡 线程模型 ...

    java开源包1

    可以将列表数据缓存到redis中,其他kv结构数据继续缓存到memcached 6. 支持redis的主从集群,可以做读写分离。缓存读取自redis的slave节点,写入到redis的master节点。 Java对象的SQL接口 JoSQL JoSQL...

    java开源包10

    可以将列表数据缓存到redis中,其他kv结构数据继续缓存到memcached 6. 支持redis的主从集群,可以做读写分离。缓存读取自redis的slave节点,写入到redis的master节点。 Java对象的SQL接口 JoSQL JoSQL...

    网络架构师148讲视频课程

    │ 第58节:Memcached入门和缓存的含义.avi │ 第59节:Memcached基本的工作原理.avi │ 第60节:Memcached基本的操作命令.avi │ 第61节:理解Memcached的数据存储方式.avi │ 第62节:内存分配的Chunk、Slab演示....

    java开源包11

    可以将列表数据缓存到redis中,其他kv结构数据继续缓存到memcached 6. 支持redis的主从集群,可以做读写分离。缓存读取自redis的slave节点,写入到redis的master节点。 Java对象的SQL接口 JoSQL JoSQL...

    java开源包2

    可以将列表数据缓存到redis中,其他kv结构数据继续缓存到memcached 6. 支持redis的主从集群,可以做读写分离。缓存读取自redis的slave节点,写入到redis的master节点。 Java对象的SQL接口 JoSQL JoSQL...

    java开源包3

    可以将列表数据缓存到redis中,其他kv结构数据继续缓存到memcached 6. 支持redis的主从集群,可以做读写分离。缓存读取自redis的slave节点,写入到redis的master节点。 Java对象的SQL接口 JoSQL JoSQL...

    java开源包6

    可以将列表数据缓存到redis中,其他kv结构数据继续缓存到memcached 6. 支持redis的主从集群,可以做读写分离。缓存读取自redis的slave节点,写入到redis的master节点。 Java对象的SQL接口 JoSQL JoSQL...

    java开源包5

    可以将列表数据缓存到redis中,其他kv结构数据继续缓存到memcached 6. 支持redis的主从集群,可以做读写分离。缓存读取自redis的slave节点,写入到redis的master节点。 Java对象的SQL接口 JoSQL JoSQL...

    java开源包4

    可以将列表数据缓存到redis中,其他kv结构数据继续缓存到memcached 6. 支持redis的主从集群,可以做读写分离。缓存读取自redis的slave节点,写入到redis的master节点。 Java对象的SQL接口 JoSQL JoSQL...

    java开源包8

    可以将列表数据缓存到redis中,其他kv结构数据继续缓存到memcached 6. 支持redis的主从集群,可以做读写分离。缓存读取自redis的slave节点,写入到redis的master节点。 Java对象的SQL接口 JoSQL JoSQL...

    java开源包7

    可以将列表数据缓存到redis中,其他kv结构数据继续缓存到memcached 6. 支持redis的主从集群,可以做读写分离。缓存读取自redis的slave节点,写入到redis的master节点。 Java对象的SQL接口 JoSQL JoSQL...

    java开源包9

    可以将列表数据缓存到redis中,其他kv结构数据继续缓存到memcached 6. 支持redis的主从集群,可以做读写分离。缓存读取自redis的slave节点,写入到redis的master节点。 Java对象的SQL接口 JoSQL JoSQL...

Global site tag (gtag.js) - Google Analytics