分布式缓存---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上。而这类功能在实际应用中却是经常用到。
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。