求选择哪个缓存设计好一些?
最近在做一个类似贴吧一样的东西,在数据上想用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

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

在MySQL中,外鍵的作用是建立表與表之間的關係,確保數據的一致性和完整性。外鍵通過引用完整性檢查和級聯操作維護數據的有效性,使用時需注意性能優化和避免常見錯誤。

MySQL和MariaDB的主要區別在於性能、功能和許可證:1.MySQL由Oracle開發,MariaDB是其分支。 2.MariaDB在高負載環境中性能可能更好。 3.MariaDB提供了更多的存儲引擎和功能。 4.MySQL採用雙重許可證,MariaDB完全開源。選擇時應考慮現有基礎設施、性能需求、功能需求和許可證成本。

多次調用session_start()會導致警告信息和可能的數據覆蓋。 1)PHP會發出警告,提示session已啟動。 2)可能導致session數據意外覆蓋。 3)使用session_status()檢查session狀態,避免重複調用。

Redis是一种内存数据结构存储系统,主要用作数据库、缓存和消息代理。它的核心特点包括单线程模型、I/O多路复用、持久化机制、复制与集群功能。Redis在实际应用中常用于缓存、会话存储和消息队列,通过选择合适的数据结构、使用管道和事务、以及进行监控和调优,可以显著提升其性能。

AI可以幫助優化Composer的使用,具體方法包括:1.依賴管理優化:AI分析依賴關係,建議最佳版本組合,減少衝突。 2.自動化代碼生成:AI生成符合最佳實踐的composer.json文件。 3.代碼質量提升:AI檢測潛在問題,提供優化建議,提高代碼質量。這些方法通過機器學習和自然語言處理技術實現,幫助開發者提高效率和代碼質量。

MySQL和phpMyAdmin可以通過以下步驟進行有效管理:1.創建和刪除數據庫:在phpMyAdmin中點擊幾下即可完成。 2.管理表:可以創建表、修改結構、添加索引。 3.數據操作:支持插入、更新、刪除數據和執行SQL查詢。 4.導入導出數據:支持SQL、CSV、XML等格式。 5.優化和監控:使用OPTIMIZETABLE命令優化表,並利用查詢分析器和監控工具解決性能問題。

要安全、徹底地卸載MySQL並清理所有殘留文件,需遵循以下步驟:1.停止MySQL服務;2.卸載MySQL軟件包;3.清理配置文件和數據目錄;4.驗證卸載是否徹底。

HTML5帶來了五個關鍵改進:1.語義化標籤提升了代碼清晰度和SEO效果;2.多媒體支持簡化了視頻和音頻嵌入;3.表單增強簡化了驗證;4.離線與本地存儲提高了用戶體驗;5.畫布與圖形功能增強了網頁的可視化效果。
