Memcache针对不同场景数据应用缓存策略
Memcache主要的作用是为减轻大访问量对数据库的冲击,所以一般的逻辑是首先从memcache中读取数据,如果没有就从数据库中读取数据写入到memcache中,等下一次读取的时候就可以从memcache中读取了。但在项目中的具体应用策略(也就是哪些数据应该缓存?怎么样缓存?过期策略?)就是个问题了。它的一个总原则是将经常需要从数据库读取的数据缓存在memcache中。这些数据也分为几类:
一、经常被读取并且实时性要求不强可以等到自动过期的数据。例如网站首页最新文章列表、某某排行等数据。也就是虽然新数据产生了,但对用户体验不会产生任何影响的场景。
这类数据就使用典型的缓存策略,设置一过合理的过期时间,当数据过期以后再从数据库中读取。当然你得制定一个缓存清除策略,便于编辑或者其它人员能马上看到效果。
二、经常被读取并且实时性要求强的数据。比如用户的好友列表,用户文章列表,用户阅读记录等。
这类数据首先被载入到memcache中,当发生更改(添加、修改、删除)时就清除缓存。在缓存的时候,我将查询的SQL语句md5()得到它的hash值作为key,结果数组作为值写入memcache,并且将该SQL涉及的table_name以及hash值配对存入memcache中。当更改了这个表时,我就将与此表相配对的key的缓存全部删除。
三、统计类缓存,比如文章浏览数、网站PV等
此类缓存是将在数据库累加的数据放在memcache来累加。获取也通过memcache来获取。但这样就产生了一个问题,如果memcache服务器down掉的话这些数据就有可能丢失,所以一般使用memcache永久性存储,这方面新浪使用memcachedb。
四、活跃用户的基本信息或者某篇热门文章。
此类数据的一个特点就是数据都是一行,也就是一个一维数组,当数据被update时(比如修改昵称、文章的评论数),在更改数据库数据的同时,使用Memcache::replace替换掉缓存里的数据。这样就有效了避免了再次查询数据库。
五、session数据
使用memcache来存储session的效率是最高的。memcache本身也是非常稳定的,不太用担心它会突然down掉引起session数据的丢失,即使丢失就重新登录了,也没啥。
注:Memcache作为缓存服务器,其PHP插件分为memcache和memcached两种,区别不大,应用一种即可。
最新文章
- js异步加载的3种方式(转载)
- IOS跳转到设置特定项
- Lua 栈的理解
- Asp.net默认配置下,Session莫名丢失的原因及解决
- 更改gps.conf来加快GPS搜星速度
- 使用Keil建立工程和烧录到89C52板上
- C#中DataGridView控件使用大全
- Oracle不能导入空表解决方案
- HTML5实际和离线应用分析
- jquery.validate 验证(支持前台js验证通过,然后ajax后台数据校验)二
- SQL点滴4—筛选数据列的类型,字段大小,是否可为空,是否是主键,约束等等信息
- jq 滚轮监听事件
- mysql 开源 ~ canal+otter系列(1)
- seller vue 编写接口请求【mock数据】
- hive-client heap内存大小的配置优先级
- 新建django需要设置的地方
- HTTPS加密传输数据,加强P2P平台网络安全和信任
- Linux 系统的/var目录
- (a*b)%c 小的技巧
- 下拉刷新和UITableView的section headerView冲突的原因分析与解决方案
热门文章
- 为什么32位系统最大支持4G内存??我自己悟出来了 终于 。。。。。
- CF985B Switches and Lamps【矩阵操作/枚举】
- Python与数据结构[0] ->; 链表/LinkedList[2] ->; 链表有环与链表相交判断的 Python 实现
- Python的程序结构[0] ->; 属性/Property[0] ->; 类属性、实例属性和私有属性
- FZU -2212 Super Mobile Charger(水题)
- 八. 输入输出(IO)操作3.面向字符的输出流
- Spring项目搭建
- Ubifs Support
- .net的远程调用
- 如何设计好的RESTful API 之好的RESTful API 特征