免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 4294 | 回复: 2
打印 上一主题 下一主题

memcache到底是怎么运行的? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-04-05 11:25 |只看该作者 |倒序浏览
memcache怎么保证与mysql数据库数据的一致,例如缓存某条数据是1   用户UPDATE数据变成了2   那么每次用户查询的时候

1  用户在提交查询,memcache已经有数据1,但是memcache先与数据库比对一下,相同则直接反馈给用户,如果不一样,先把数据库的数据更新到memcache中,然后用户再从memcache中读取
2  用户在提交查询,memcache已经有数据1,但是memcache先与数据库比对一下,相同则直接反馈给用户,如果不一样,用户则直接查询数据库,memcache则直接丢弃此过期数据,同时在用在查询数据库的同时,数据库也反馈一份数据给memcache

memcache采取的是上面哪种模式?   另外这2种模式memcache都需要与mysql数据库进行连接,这样会不会增加mysql开销?

有的文档中说是memcache中会有$key表示数据位置  $id 来表示数据的值那么
1  mysql与memcache是怎么维护$key $id值的呢?例如要缓存了mysql的数据值1 那么是不是可以理解 在mysql 和memcache中分别建立了2个同样的表,而这个表包括key  id这2个字段,如果mysql更新了数据,那么mysql中的这个表中的id字段也会更新,并且也更新到memcache的这个表?   这个更新是自动还是手动?
2  用户用PHP写的代码中的$key $id这个值是怎么确定的呢 ,例如php代码要查询一个条数据select a from house where b=2 ,但是我根本不知道$key $id那么我的提交怎么会走memcache呢?


还请各位指教下,谢谢!

论坛徽章:
0
2 [报告]
发表于 2012-04-06 13:51 |只看该作者
memcache是libevent+多线程架构的, 监听线程accept的连接利用管道+队列+互斥锁 触发工作线程获取连接加入线程自己的libevent监听中, 对于UDP则直接采取了惊群方式监听, 数据存储方面采取哈希表+内存池slab + slab桶内LRU维护缓存过期机制, 整个哈希表与内存池的操作是加同一把全局锁的, 所以都说memcache锁粒度大, 另外每个Hash node采用reference的方式保证足够高的并发读能力, 这个设计是很巧妙的, 对于Node内容的更新, 则采用了移除旧结点, 插入新结点的策略, 保证了读写的高并发能力, 这里面涉及到reference和哈希表和内存池slab回收的共同作用, 简单说就是读操作是依靠reference维护NODE内存生命期的,写操作是依靠大粒度锁保证互斥操作的。

源码很简单,我花了3天看完的,如果C编程基础不行的话还是继续用就行了。

论坛徽章:
0
3 [报告]
发表于 2012-04-06 13:55 |只看该作者
另外,缓存与数据库不要求一致性,一般都是写数据库或者读数据库之后就立即更新一下缓存,缓存具有有效期,合理的设置即可,当然也不是所有业务都适合使用分布式缓存,还是需要考虑具体需求使用,另外缓存的使用分读缓存和写缓存,读缓存是指数据库读之后插入缓存以便下次加速访问,写缓存是指数据写操作先写入缓存,当累计一定次数后一次性写入数据库,看需求使用。再另外不得不提,如果缓存不适合业务而不能使用,可以考虑数据库优化,比如分区分表,读写分离,甚至是冗余。回复 1# ngnix


   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP