我正在开发一个网站来显示某种文章,就像stackoverflow一样 .
每篇文章都包含 Headers ,描述和一些经常更改的字段(如view_count) .
该网站还支持游标分页(max_id,since_id),过滤(按类别,标签) .
我想使用Redis添加缓存层 . 我心中有一些选择:
- 使用zset存储前1000个蚁群ID列表 . 每个过滤器都有一个zset,如
articles:category:{category_id}
articles:tag:{tag_id}
. 发布新文章时,每个zset都会更新 .
使用哈希来存储每篇文章,如 article:{article_id}
直接在缓存中为每个视图更新view_count,并在某个时刻同步到db .
使用 ZRANGEBYSCORE
实现游标分页(分数是发布时间戳) .
-
优点:永远不需要使缓存过期 . 新文章立即显示 .
-
缺点:难以实施,可能容易出错 . 需要一些像rabbitmq这样的消息传递机制 .
-
使用数据库进行过滤和分页,只返回id列表,redis中的缓存id列表,并设置一些TTL(10秒) . 仍然使用哈希来缓存每篇文章,因此可以立即更新view_count .
-
优点:易于实现,无需消息传递机制 . 缓存过期时,只需要查询id列表 .
-
缺点:需要每隔10秒查询新的id列表数据库,10秒后会显示新文章,但view_count会立即更新 .
-
使用redis缓存每个查询的acticle列表,将其序列化为json,并设置TTL .
-
优点:最容易实现(使用spring @Cacheable) .
-
缺点:缓存将经常过期,需要再次查询数据库 . 只有在缓存过期时才会更新view_count .
我不知道女巫是一个更好的选择,性能和稳定性 . 谢谢您的帮助 .