设为首页 收藏本站
查看: 1041|回复: 0

[经验分享] 分布式缓存---Memcached 入门

[复制链接]

尚未签到

发表于 2015-9-2 11:52:19 | 显示全部楼层 |阅读模式
    【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上。而这类功能在实际应用中却是经常用到。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-108693-1-1.html 上篇帖子: 分布式缓存---Memcached 入门 下篇帖子: 刷新Memcached有数据被踢,evictions大于0时候的分析
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表