memcache如何定期删除不常用的数据 如题,如何防止memcache里的数据无限制增长,如何实现定期删除长时间不用或使用频率低的数据。在线等! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 我就知道memcache可以像session或cookie那样设个过期时间 定制规则;有能力可以修改memcache实现 memcache是在slab内存池的基础上, 每个slab内维护LRU链表, 每个NODE具有生命期, 所有Cache的NODE组成Hash表。memcache采用懒惰删除机制, 其内存请求步骤大致是这样一个请求链: 根据node的size定位到slab ---> 从该slab的LRU尾部向前寻找过期且reference==1的NODE, 如果找到, 则从hash表与LRU中unlink此NODE, 并将此NODE插入到LRU头部并且reference置1, 将输入存入node尾部, 重新插入到哈希表中. 如果没找到, 那么会直接向slab申请新的内存来存储NODE, 这也就是内存池的功能了, 如果申请失败, 那么接下来的策略是重新扫描LRU, 找出那些虽然没有过期, 但reference==1的NODE, 直接回收使用, 这是不得已的策略. 如果这个策略都失败了, 我印象中还有一个策略, 是对于那些生命期已经失效3天并且当前refercence != 1的结点强制回收, 我记得注释里说那是一个小BUG, 这样处理是OK的, 大概意思是:somewhere refer to this node, becuase nowhere refers to it, 不知道这个BUG发生在哪里,我当初是没研究出来, 因为get/remove都是配对出现在memcache的各个函数里的, 真不知道引用计数怎么会失效3天还不为0.所以,你看懂了没... 也就是尽可能的把内存分配向外推, 程序一开始就分配了很大的malloc内存充当内存池由slab管理, 而内存的重用是由LRU链表完成的, 不是一个线程定期扫描, 而是有需求才检测的方法, 达到了异步的效果. 楼主先弄明白什么叫memcache, 意思就是内存里的缓存, 缓存在乎的只是把最常用的数据尽可能的保留, 不在乎数据持久化, 持久化是数据库的事, Cache是为了减少数据库访问存在的.在此基础上, 每个NODE有引用计数, 这保证了超级高效的并发读, 以及非常可靠的资源回收策略, 只有位于hash与LRU的NODE才叫Cache命中, 不在hash/LRU中的NODE虽然无法Cache命中, 但其内存不一定可以被回收, 其取决于NODE的引用计数. 这个设计对于replace这个接口的实现提供了变态的简便, 也就是相同的key更改其value : ( 先unlink掉旧的NODE, 不会影响当前正在访问旧NODE的用户, 意味着该NODE Cache失效, 之后insert新的NODE, 之后的查询请求Cache可命中) , 而括号内的操作通过加锁保证了原子性, 达到的效果就是任何一刻该Node均可Cache命中, 并且老用户访问旧NODE, 新请求访问新NODE, 替换完成.精髓就在reference, LRU, 源码不复杂, 会C/LINUX的话可以去看一下. LS已经解释的很详细了...一句话总结的话....你只要在启动memcached的时候,用-m参数设定memcached所能占用的最大内存数,剩下的事情都是memcached自己搞定了,不需要你操心,它会把最没用的数据自己扔掉 记得java是有memcache的flush方法,php应该会有的至于定期的事情,你可以在一个php文件中写入flush,在linux中crontab 定时请求,例如*/10 */23 * * * wget -q --spider http://www.xxxx.com/statbyday/stat1.php > /dev/null 2>&1 导出Execl 报错,麻烦高手 救救我,分数多多,谢谢 注册的时候 用问题验证 程序该怎么写 ThinkPHP 乱码怎么解决?? 大家觉得我收多少钱合适呢?麻烦进来看一下。。。 google map v3 图标堆叠顺序问题 问一个ZEND FRAMEWORK的问题~ php写web项目 分 享 发 现 求推荐 机房管理系统,或者硬件设备管理系统 加密代码~求指点,求解密方式~ 以前是搞java的,现在做网站发现php好用,谁能说一下怎么学习php吗? (转)php实现抓取网站百度快照和百度收录数量的代码实例
楼主先弄明白什么叫memcache, 意思就是内存里的缓存, 缓存在乎的只是把最常用的数据尽可能的保留, 不在乎数据持久化, 持久化是数据库的事, Cache是为了减少数据库访问存在的.在此基础上, 每个NODE有引用计数, 这保证了超级高效的并发读, 以及非常可靠的资源回收策略, 只有位于hash与LRU的NODE才叫Cache命中, 不在hash/LRU中的NODE虽然无法Cache命中, 但其内存不一定可以被回收, 其取决于NODE的引用计数. 这个设计对于replace这个接口的实现提供了变态的简便, 也就是相同的key更改其value : ( 先unlink掉旧的NODE, 不会影响当前正在访问旧NODE的用户, 意味着该NODE Cache失效, 之后insert新的NODE, 之后的查询请求Cache可命中) , 而括号内的操作通过加锁保证了原子性, 达到的效果就是任何一刻该Node均可Cache命中, 并且老用户访问旧NODE, 新请求访问新NODE, 替换完成.精髓就在reference, LRU, 源码不复杂, 会C/LINUX的话可以去看一下.
你只要在启动memcached的时候,用-m参数设定memcached所能占用的最大内存数,剩下的事情都是memcached自己搞定了,不需要你操心,它会把最没用的数据自己扔掉
至于定期的事情,你可以在一个php文件中写入flush,在linux中crontab 定时请求,例如
*/10 */23 * * * wget -q --spider http://www.xxxx.com/statbyday/stat1.php > /dev/null 2>&1