目录
回复内容:
首页 后端开发 php教程 求选择哪个缓存设计好一些?

求选择哪个缓存设计好一些?

Jun 06, 2016 pm 08:10 PM
mysql php redis 缓存 缓存设计

最近在做一个类似贴吧一样的东西,在数据上想用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查询。

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

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

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

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

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

  3. 你还可以借用redis实现一个内存锁,解决上面第二点的并发问题。
    (我项目中没有做,是因为外面有nginx页面缓存,在里面应用层很难遇到并发问题)

我说说自己的设计,当然前提是直接查询DB是不可行的情况下,不然也没必要折腾。
首先缓存是必然,优先考虑用户在浏览贴吧时常看的基本就是前10页(举例),那么完全没必要缓存全量数据,最好是仅缓存前10页即可,这个设计无论访问量多大都不会有太大问题,只要不出现大量的用户访问10页之后的数据。对于这个缓存其实我们只需要缓存帖子列表,而非帖子具体内容,所以不会占用太大内存。
对于帖子内容可以采用热点方式解决,即LRU,因为被查看的帖子基本都是固定的,即热点帖子,缓存只需要缓存这些帖子内容即可。


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

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

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

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

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

<🎜>:泡泡胶模拟器无穷大 - 如何获取和使用皇家钥匙
3 周前 By 尊渡假赌尊渡假赌尊渡假赌
北端:融合系统,解释
3 周前 By 尊渡假赌尊渡假赌尊渡假赌
Mandragora:巫婆树的耳语 - 如何解锁抓钩
3 周前 By 尊渡假赌尊渡假赌尊渡假赌

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

热门话题

Java教程
1665
14
CakePHP 教程
1424
52
Laravel 教程
1322
25
PHP教程
1270
29
C# 教程
1249
24
MySQL:数据库,PHPMYADMIN:管理接口 MySQL:数据库,PHPMYADMIN:管理接口 Apr 29, 2025 am 12:44 AM

MySQL和phpMyAdmin可以通过以下步骤进行有效管理:1.创建和删除数据库:在phpMyAdmin中点击几下即可完成。2.管理表:可以创建表、修改结构、添加索引。3.数据操作:支持插入、更新、删除数据和执行SQL查询。4.导入导出数据:支持SQL、CSV、XML等格式。5.优化和监控:使用OPTIMIZETABLE命令优化表,并利用查询分析器和监控工具解决性能问题。

作曲家:通过AI的帮助开发PHP 作曲家:通过AI的帮助开发PHP Apr 29, 2025 am 12:27 AM

AI可以帮助优化Composer的使用,具体方法包括:1.依赖管理优化:AI分析依赖关系,建议最佳版本组合,减少冲突。2.自动化代码生成:AI生成符合最佳实践的composer.json文件。3.代码质量提升:AI检测潜在问题,提供优化建议,提高代码质量。这些方法通过机器学习和自然语言处理技术实现,帮助开发者提高效率和代码质量。

怎样卸载MySQL并清理残留文件 怎样卸载MySQL并清理残留文件 Apr 29, 2025 pm 04:03 PM

要安全、彻底地卸载MySQL并清理所有残留文件,需遵循以下步骤:1.停止MySQL服务;2.卸载MySQL软件包;3.清理配置文件和数据目录;4.验证卸载是否彻底。

session_start()函数的意义是什么? session_start()函数的意义是什么? May 03, 2025 am 12:18 AM

session_start()iscucialinphpformanagingusersessions.1)ItInitiateSanewsessionifnoneexists,2)resumesanexistingsessions,and3)setsasesessionCookieforContinuityActinuityAccontinuityAcconActInityAcconActInityAcconAccRequests,EnablingApplicationsApplicationsLikeUseAppericationLikeUseAthenticationalticationaltication and PersersonalizedContentent。

给MySQL表添加和删除字段的操作步骤 给MySQL表添加和删除字段的操作步骤 Apr 29, 2025 pm 04:15 PM

在MySQL中,添加字段使用ALTERTABLEtable_nameADDCOLUMNnew_columnVARCHAR(255)AFTERexisting_column,删除字段使用ALTERTABLEtable_nameDROPCOLUMNcolumn_to_drop。添加字段时,需指定位置以优化查询性能和数据结构;删除字段前需确认操作不可逆;使用在线DDL、备份数据、测试环境和低负载时间段修改表结构是性能优化和最佳实践。

MySQL批量插入数据的高效方法 MySQL批量插入数据的高效方法 Apr 29, 2025 pm 04:18 PM

MySQL批量插入数据的高效方法包括:1.使用INSERTINTO...VALUES语法,2.利用LOADDATAINFILE命令,3.使用事务处理,4.调整批量大小,5.禁用索引,6.使用INSERTIGNORE或INSERT...ONDUPLICATEKEYUPDATE,这些方法能显着提升数据库操作效率。

如何使用MySQL的函数进行数据处理和计算 如何使用MySQL的函数进行数据处理和计算 Apr 29, 2025 pm 04:21 PM

MySQL函数可用于数据处理和计算。1.基本用法包括字符串处理、日期计算和数学运算。2.高级用法涉及结合多个函数实现复杂操作。3.性能优化需避免在WHERE子句中使用函数,并使用GROUPBY和临时表。

Laravel 最佳扩展包推荐:2024 年必备工具 Laravel 最佳扩展包推荐:2024 年必备工具 Apr 30, 2025 pm 02:18 PM

2024年必备的Laravel扩展包包括:1.LaravelDebugbar,用于监控和调试代码;2.LaravelTelescope,提供详细的应用监控;3.LaravelHorizon,管理Redis队列任务。这些扩展包能提升开发效率和应用性能。

See all articles