ngnix 发表于 2012-04-05 11:25

memcache到底是怎么运行的?

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


还请各位指教下,谢谢!

owenliang1990 发表于 2012-04-06 13:51

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

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

owenliang1990 发表于 2012-04-06 13:55

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


   
页: [1]
查看完整版本: memcache到底是怎么运行的?