做web,经常会用到key-value的缓存,虽然快,但缓存的维护是个问题,就拿sgementfault举例来说,如果我来做,首页的问题分页就涉及到
1.问题总数缓存
2.每页问题清单缓存
现在管理员删除了一个问题,那么为满足实时性,肯定需要更新缓存
1.问题总数缓存-1
2.每页问题清单缓存如何更新?
当然可以查数据库算出来,是否有这个必要?
这只是个例子,为了说明问题,为了更新一个缓存而造成了另外的数据库查询开销。在实际过程中,我经常用查询条件的组合作为key,这使得我在更新缓存时无从下手(虽然我自己手工维护了一个缓存key的清单,但难免会有遗漏,终归不是好办法)。但如果把缓存的key都定义死,则缓存的使用不是那么灵活。
다음과 같이 처리하는 것이 좋습니다.
1. 총 질문 개수 캐시
으아아아참고: http://www.php.net/manual/zh/memcache...
2. 각 페이지의 질문 목록 캐시를 업데이트하는 방법은 무엇입니까?
저라면 별로 생각해보지 않았습니다. 아마도 end_id를 끝 스탬프로 사용한 다음 새로운 질문이 들어올 때마다 증가시킬 것입니다. 100개 이상의 요약이 새로 고쳐질 것입니다. 중요한 것은 볼륨을 보는 것입니다. 볼륨이 없으면 작동하지 않습니다. 좋은 판단입니다. (작게 시작하는 경우 3분에 한 번씩 db를 브러싱하면 문제 없습니다.)
1. 총 질문 개수를 캐시하려면 @jawa에서 제공하는 memcache incr/decr을 사용하는 것이 좋습니다
2. 각 페이지의 질문 목록을 유지하려면 목록을 유지할 필요가 없으며 목록 자체를 데이터베이스에서 확인할 수 있습니다. 실제로 @jawa가 말했듯이 수량에 따라 다릅니다. 세부적인 방법에는 여러 가지가 있는데, 예를 들어 위에서 언급한 것처럼 목록 자체를 데이터베이스에서 직접 확인하는 방법도 있습니다. Sina Weibo의 댓글은 두 번 획득되며 콘텐츠 변경(적음)과 개수 변경(자주)이 분리됩니다.
캐시를 사용하는 주요 목적은 데이터베이스에 대한 부담을 줄이는 것입니다. 캐시를 너무 자주 업데이트하는 것은 무리입니다.
1. 데이터가 정의된 특정 임계값에 도달하면 실시간 성능을 포기하고 캐시를 업데이트합니다.
2. 스핑크스와 같은 검색 엔진의 실시간 증분 색인을 사용하십시오.