`
phpseyo
  • 浏览: 158294 次
  • 性别: Icon_minigender_1
  • 来自: 广西
社区版块
存档分类
最新评论

利用memcached做实时分页缓存

阅读更多

假设我们有个文章页要以分页形式显示,分页类型有按分类分页、按热点分页、按最新分页、按自定义方式分页等。这就出现了一个问题:对数据的更新影响到哪些分页是不可知的,不知道需要删除哪些相关的缓存。下文讲介绍一个简单的解决方案来处理这个问题。其实,需要解决的核心问题就一个:增加、删除、修改数据时能够让分页缓存都失效,实现这一点只需要引入版本号就可以了,在所有受影响的memcachedkey中都加入版本号,当我们增加、修改、删除文章数据时,版本号+1,这样就等于所有分页相关缓存都失效了。

代码如下:

<?php

//备注:假设下面函数都已初始化$memcached
class Article 

private $article_version = 'article_version'
public function getArticle($type='new',$page='1',$limit=0){ 
//设置memcached的key,在key的末端加上版本号 
$cache_id = 'art_type'.$type.'_page'.$page.'_limit'.$limit.'v_'.$this->_getArticleVersion(); 
//得到分页数据 
$artdata = $memcached->get($cache_id); 
if( FALSE === $artdata) { 
//重新从数据库得到数据并设置新的memcached缓存 

return $artdata

public function updateArticle($conditions,$data){ 
//更新数据库数据操作 
//更新Article的版本,这样所有Article表相关的缓存就都失效了,下次调用getArticle函数的时候将生成新的缓存数据 
$this->_setArticleVersion(); 

private function _getArticleVersion(){ 
$article_version_num = $memcached->get($this->article_version); 
if( FALSE === $article_version_num){ 
$article_version_num = 1; 
$memcached->set($this->article_version, $article_version_num, 86400); 

return $article_version_num

private function _setArticleVersion(){ 
$article_version_num = $memcached->get($this->article_version); 
$article_version_num++; 
$memcached->set($this->article_version, $article_version_num, 86400); 


?> 

  解决方案就比平常的memcached缓存多两个函数:_ getArticleVersion()_ setArticleVersion(),这样当增加、删除、修改文章时调用_ setArticleVersion()函数,版本号+1,使之前版本的数据都失效,因为在获得文章分页缓存数据时key都加入了_ getArticleVersion()函数,所以得不到新版本号的缓存数据就从数据库查到,再生成新版本的缓存,旧的缓存在时间过期之后会自动释放。

分享到:
评论
1 楼 bingxiaotian 2013-06-21  
                

相关推荐

    可缓存的分页控件

    为了实现缓存,控件可能使用内存缓存(如ASP.NET的Cache对象)或者更复杂的数据缓存解决方案(如Redis、Memcached)来存储部分或全部数据,避免每次用户翻页时都去数据库查询。 总的来说,这个项目包含了一个自定义...

    PHP MemCached 高级缓存应用代码

    2. **Memcache::addServer()**: 通过这个方法,你可以向Memcached客户端添加新的服务器地址,以便扩展或备份缓存服务。 3. **Memcache::close()**: 关闭与指定Memcached对象的连接。 4. **Memcache::connect()**: ...

    Linq to sql Memcached封装

    Memcached支持多种编程语言,包括.NET,使得.NET开发者可以利用它来缓存经常查询但更新不频繁的数据,减少数据库负载。 【Linq to SQL与Memcached结合】 在大型应用中,数据库往往是性能瓶颈之一,尤其是在高并发...

    ibatis_with_memcached

    总的来说,"ibatis_with_memcached"项目提供了一个实用的参考,展示了如何在实际开发中利用Ibatis与Memcached集成来优化数据访问,对于提升Java Web应用的性能具有很大的指导价值。开发者可以通过该项目学习到缓存...

    分页控件aspnet分页。很好用

    7. **分页性能优化**:为了提高分页效率,可以考虑缓存部分或全部数据,或者利用缓存技术如Redis或Memcached。此外,避免在分页查询中使用过多的JOIN操作,也可以提升性能。 8. **分页参数处理**:在处理分页请求时...

    新浪分页技术,挺不错的分页技术思路

    3. 数据缓存:为了提高响应速度,新浪可能会对分页数据进行缓存,如使用Redis或Memcached等内存数据库。缓存策略可以是基于LRU(Least Recently Used)或者TTL(Time To Live)等,确保数据的实时性和系统性能。 4....

    非常优秀的Java分页代码

    8. **缓存策略**:在高并发场景下,考虑使用缓存技术如Redis、Memcached等,缓存分页结果,降低数据库压力。 9. **前端展示**:在前端页面,通常需要展示分页导航,包括“上一页”、“下一页”、页码选择等,这部分...

    java 数据分页显示

    7. **缓存策略**:对于静态或变化不频繁的数据,可以考虑使用缓存技术(如Redis、Memcached)来存储已分页的结果,减少数据库查询次数,提高性能。 8. **安全性**:在处理用户输入的分页参数时,需要防止参数被篡改...

    memcached与JAVA实例文档

    - 分页数据:缓存部分分页数据,降低数据库查询频率。 ### 5. 注意事项 - 数据过期策略:Memcached不支持自动更新,需要应用程序控制数据更新。 - 数据一致性:如果数据需要强一致,需要结合CAS操作来保证。 - ...

    Memchached数据库缓存缓存思路

    3. **优化资源利用**:在高并发场景下,缓存技术能够帮助系统更好地分配和管理资源,避免不必要的资源浪费。 #### 三、Memcached缓存策略解析 ##### 3.1 单个对象缓存 - **实现方式**:使用`HashMap`进行简单存储...

    java动态分页类

    6. **缓存优化**:在高并发场景下,为了减少数据库访问,可以考虑使用缓存策略,如Redis或Memcached,将部分分页结果缓存起来。 7. **异常处理**:良好的错误处理机制是必不可少的,如处理无效的页码请求或数据库...

    分页(一级栏目分页)

    同时,可以通过缓存技术,如Redis或Memcached,减少数据库查询频率。 综上所述,"分页(一级栏目分页)"在PHP CMS中的实现涉及到了数据库设计、查询优化、MVC架构的运用以及用户体验的考量。通过合理的分页策略,可以...

    海量数据库查询优化及分页算法方案

    4. **分页缓存**:为了进一步提升分页性能,可以缓存每一页的结果,减少对数据库的依赖。 在示例中,虽然没有展示具体的分页查询,但可以假设在实际应用中,可以结合`ROW_NUMBER()`或`LIMIT`、`OFFSET`来实现分页...

    velocity实现静态页面分页

    - 缓存:对于频繁访问的静态页面,可以考虑使用缓存技术,如Memcached或Redis,减少数据库查询,提高性能。 - 延迟加载:只有当用户滚动到页面底部时才加载下一页内容,这称为无限滚动或懒加载,可以改善用户体验。 ...

    PythonWeb从入门到实战教程之10Ajax会话、日志、缓存、分页.zip

    Django支持多种缓存机制,包括内存缓存(如Memcached或Redis)、文件系统缓存以及数据库缓存。通过缓存,可以显著减少服务器负载,提升响应速度。 5. **分页**:在处理大量数据时,分页是必不可少的功能,它将大...

    JAVA分页源代码需要可以看下

    对于经常访问且变化不大的分页数据,可以考虑使用缓存技术(如Redis或Memcached)来提高性能。 以上就是Java分页的一些常见实现方式和相关知识点,实际开发中应根据项目需求和数据量选择合适的方法。通过阅读提供...

    PHP简单分页原理

    3. 分页缓存:对于静态内容,可以考虑使用缓存技术,如Memcached或Redis,减少数据库访问。 4. 高级分页:在大型项目中,可能需要考虑预加载相邻页数据,或者使用无限滚动等更复杂的分页策略。 总结,PHP分页原理...

    Memcached之java客户端开发

    通过以上介绍,我们可以看到使用Java客户端开发Memcached并不复杂,关键在于理解其工作原理,并结合业务需求进行有效利用。在实际项目中,结合缓存策略和优化技巧,可以显著提升系统的响应速度和性能。

    Net分页典型--2.rar

    10. 分页缓存:对于静态或变化不频繁的数据,可以考虑使用缓存技术(如Redis、Memcached)来存储分页结果,减少数据库压力。 11. 前端分页:通过Ajax异步请求,每次只加载当前页数据,降低服务器负担,提高用户体验...

    基于PHP的分页技术

    2. 缓存:对于静态或频繁访问的分页数据,可以使用缓存技术,如Redis或Memcached,提高数据获取速度。 3. 预加载和懒加载:预加载是指加载当前页及相邻几页的数据,而懒加载是在用户滚动到页面底部时动态加载更多...

Global site tag (gtag.js) - Google Analytics