views:

12

answers:

1

Hello,

Let's imagine that we have blog with category A. Category A is currently having 1000 posts on 100 pages. All pages are cached in files (for example, cached by Smarty template engine). I'm adding post and want it to be displayed on first page immediately. So, I have to clear or invalidate cache for all 100 pages of category A.

Deleting cached pages is not a good idea because we can have too much files (for example, thousands of pages). I think that invalidating cache and regenerating page on request is much more efficient way.

My only thought is to add number of posts in category to cache id. So, first we should get number of posts in category (for example, from memcache) and then check if cached version valid by this number.

Everything looks fine and simple. But let's imagine situation when I'm adding new post and then after 1 minute I'm removing another (older) post. Number of posts still 1000 and some category pages will stay old (if they were not viewed during this 1 minute).

What is the solution?

PS: Sorry for my English, but I think that my question will be clear from people who have already faced such problem.

Thank you

A: 

Number of posts is not a good solution because when you edit some post you would want to refresh cache as well.

Couple of strategies I can think of:

  • Use time when a change was made as a reference.

When new post is added (removed, edited) - store current timestamp in a category, lets call it cache_threshold. When a page is requested - check when this page was cached. If it is older than our threshold - page needs to be regenerated.

  • Switch to object caching rather than page caching.

Instead of caching whole pages, you can cache each individual post. If new post is added (removed, edited) you would just immediately regenerate its cache as it is not time consuming. In order to display the page you would just need to grab a required amount of cached posts and display them.

This solution requires more work but it is more flexible and effective.

serg
I have 2 levels of caching in my application. 1st level is caching objects (I'm using memcache or redis for this purpose), 2nd level caching is caching page by parts (it help to avoid executing a lot of php code to build page). Your idea about last_update_timestamp seems to me very simple and nice! Thank you.
Kirzilla