最近在做一个类似贴吧一样的东西,在数据上想用redis缓存,但是现在有两个想法,不知道哪个更实际一些,求大家指点。

所有内容都会存mysql这个没的说

帖子列表永驻redis这个也没的说

问题是帖子内容怎么办。

一种想法是存一定数量的帖子内容到缓存里,比如1000条。用户访问时根据所在页面和条数,前1000条的请求都从redis中读取,超过1000条之后的旧数据就从mysql中读取。有新帖子且缓存达到1000条时就LPUSH新的RPOP旧的。

另一种想法是所有新增的帖子数据都存在redis中,并且都设置一个过期时间,比如24小时。用户有访问过就将这条数据的过期时间增加到24小时,如果没有访问过就从redis中删除。用户访问的时候先查redis,查不到再去mysql中查,顺便再写入redis。

这两种办法哪个好一些?

回复内容:

最近在做一个类似贴吧一样的东西,在数据上想用redis缓存,但是现在有两个想法,不知道哪个更实际一些,求大家指点。

所有内容都会存mysql这个没的说

帖子列表永驻redis这个也没的说

问题是帖子内容怎么办。

一种想法是存一定数量的帖子内容到缓存里,比如1000条。用户访问时根据所在页面和条数,前1000条的请求都从redis中读取,超过1000条之后的旧数据就从mysql中读取。有新帖子且缓存达到1000条时就LPUSH新的RPOP旧的。

另一种想法是所有新增的帖子数据都存在redis中,并且都设置一个过期时间,比如24小时。用户有访问过就将这条数据的过期时间增加到24小时,如果没有访问过就从redis中删除。用户访问的时候先查redis,查不到再去mysql中查,顺便再写入redis。

这两种办法哪个好一些?

可以说明用户规模。

我认为第二种好,因为通用性强。

第一种如果业务变大,访问增多,就要改代码

第二种当然更实用一些,代码也容易实现。第一个逻辑复杂一些不太好弄。。。。。

不过第二个,你还可以改进一下:

在缓存失效的时候,需要先查询redis,找不到数据,再查询MySQL,最后再写入redis。这里更新缓存的时候会多出两次redis查询。

比不使用缓存还要慢。。。

缓存失效的时候,如果有并发请求,则会重复更新redis缓存。

你可以参考我用Python实现的一个类解决了第一点https://github.com/lloydzhou/StaleRedisCache

给缓存多设置一段缓冲时间

若在缓冲期内,直接使用过期数据,并使用异步任务更新缓存。

你还可以借用redis实现一个内存锁,解决上面第二点的并发问题。

(我项目中没有做,是因为外面有nginx页面缓存,在里面应用层很难遇到并发问题)

我说说自己的设计,当然前提是直接查询DB是不可行的情况下,不然也没必要折腾。

首先缓存是必然,优先考虑用户在浏览贴吧时常看的基本就是前10页(举例),那么完全没必要缓存全量数据,最好是仅缓存前10页即可,这个设计无论访问量多大都不会有太大问题,只要不出现大量的用户访问10页之后的数据。对于这个缓存其实我们只需要缓存帖子列表,而非帖子具体内容,所以不会占用太大内存。

对于帖子内容可以采用热点方式解决,即LRU,因为被查看的帖子基本都是固定的,即热点帖子,缓存只需要缓存这些帖子内容即可。

综上,其实就是题主的两种方案的结合,其实这两种方案并不是针对同一个问题的解决方案。

第一种吧,如果用户更新了帖子,同样要更新对应的数据缓存,一般帖子,旧帖子翻的人很少的。

第一种。我在乐视做评论时,就用的第一种

缓存帖子内容,用mysql或redis还不如使用mongodb

本文原创发布php中文网,转载请注明出处,感谢您的尊重!

php内存缓存设计,求选择哪个缓存设计好一些?相关推荐

  1. python的选择结构教学设计_python选择结构教学设计

    <python选择结构教学设计>由会员分享,可在线阅读,更多相关<python选择结构教学设计(3页珍藏版)>请在人人文库网上搜索. 1.项目主题用选择结构程序做出判断备课人张 ...

  2. cpu,内存,虚拟内存,硬盘,缓存之间是什么关系??

    1.CPU即中央处理器,是英语"Central Processing Unit"的缩写.CPU从内存或缓存中取出指令,放入指令寄存器,并对指令译码分解成一系列的微操作,然后发出各种 ...

  3. [读书笔记]大型分布式网站架构设计与实践.分布式缓存

    前言:本书是对分布式系统架构涉及到的相关技术的一本科普书籍.由于很难作为开发参考,只能但求了解.所以通篇浅读,对分布式系统进行大致的了解.因为写的非常好,感觉非常有意思,自己也做不出总结.所谓的读书笔 ...

  4. Redis缓存设计(key、value设计)与性能优化(缓存击穿、缓存穿透、缓存雪崩)

    一.多级缓存架构 二.缓存设计 1.缓存穿透 缓存穿透是指查询一个根本不存在的数据, 缓存层和存储层都不会命中, 通常出于容错的考虑, 如果从存储层查不到数据则不写入缓存层. 缓存穿透将导致不存在的数 ...

  5. 工作于内存和文件之间的页缓存, Page Cache, the Affair Between Memory and Files

    原文作者:Gustavo Duarte 原文地址:http://duartes.org/gustavo/blog/post/what-your-computer-does-while-you-wait ...

  6. linux内存加速硬盘缓存,linux块设备加速缓存之bcache

    linux块设备加速缓存之bcache 什么是bcache 转载请注明出处:http://blog.csdn.net/liumangxiong bcache是linux内核块层cache.它使用类似S ...

  7. linux内存给hdd当缓存,linux块设备加速缓存之bcache [转]

    转载请注明出处:http://blog.csdn.net/liumangxiong bcache是linux内核块层cache.它使用类似SSD来作为HDD硬盘的cache,从而起到加速作用. HDD ...

  8. java map缓存6_Java内存缓存-通过Map定制简单缓存

    缓存 在程序中,缓存是一个高速数据存储层,其中存储了数据子集,且通常是短暂性存储,这样日后再次请求此数据时,速度要比访问数据的主存储位置快.通过缓存,可以高效地重用之前检索或计算的数据. 为什么要用缓 ...

  9. Java内存缓存-通过Google Guava创建缓存

    谷歌Guava缓存 Guava介绍 Guava是Google guava中的一个内存缓存模块,用于将数据缓存到JVM内存中.实际项目开发中经常将一些公共或者常用的数据缓存起来方便快速访问. Guava ...

最新文章

  1. strchr strstr函数php,PHP字符串函数之 strstr stristr strchr strrchr
  2. lucene搜索之facet查询原理和facet查询实例——TODO
  3. Linux Centos7.x 安装部署Mysql5.7几种方式的操作手册
  4. 中科院超牛的物理学家,摇滚界无人不知的“李白”,你一定听过他的歌!
  5. cc2530i2c可同时接受两个传感器的数据吗_汽车方向及维修_玉树沃尔沃S40方向机,宝马531电子方向机进水可以维修吗...
  6. 270 扩展固态硬盘_游戏人的扩展坞应该是怎样?
  7. 杭州一高中推刷脸吃饭:8秒搞定;乌海市与上海荷福签署合作协议 进入人工智能矿业安全领域...
  8. 「ECharts」交互 API (echarts、echartsInstance)
  9. TCP三次握手与DDOS***原理
  10. 二叉树平衡因子应用举例
  11. 剑指offer——面试题29:数组中出现次数超过一半的数字
  12. MR室内室外用户区分
  13. 用傅里叶变换求单位原点的格林函数
  14. 1.1模式识别的重要性
  15. Python NLP 入门
  16. linux最后一行awk,51CTO博客-专业IT技术博客创作平台-技术成就梦想
  17. tcpip命令全面汇总
  18. 怎么桌面给计算机设密码,怎么设置电脑桌面密码
  19. 服务器购买之后要做什么(二)
  20. 云安全问题及其解决方案

热门文章

  1. flask 基础 宏的使用
  2. filebeat配置详解
  3. poj3264 - Balanced Lineup(RMQ_ST)
  4. XOOM MZ606 刷机
  5. Nagios监控Linux系统
  6. The bag-of-words model
  7. Nokia是否还有未来 - 小议诺基亚和微软的战略布局
  8. 解散了地图接口讨论群
  9. 项目通用环境使用说明
  10. 零基础Java学习之初始化块