java - redis 缓存方案--有没有可用的?
黄舟
黄舟 2017-04-18 09:13:22
0
6
437

现在的方案是,sql 作为key 查询结果序列化后 存入value 。表如果有数据修改添加删除,flushDB()。
但是整个项目只要有数据变更缓存就没了。
谁还有其他方案?
想知道的就是数据增删改对redis都有操作后再对数据库操作,redis里查询的永远是最新的,当某些原因redis里查不到时查数据库然后保存到reids里。
这种方案有谁实现了吗?

黄舟
黄舟

人生最曼妙的风景,竟是内心的淡定与从容!

全部回覆(6)
小葫芦

為啥要用sql當key....還每次flushdb,你可以換個思路,假如有個表是商品,主鍵是id,你可以建一個key是detail:商品id的緩存,把這行記錄作為value,資料類型hash或string都行。有些時候你的業務要根據主鍵查某條商品資訊的時候,先去redis看看有沒有detail:主鍵的緩存,有的時候就直接取緩存,沒有命中緩存然後查數據庫,並把查詢結果存入快取.還有就是當有該筆記錄變更的時候,可以直接刪除緩存,也可以update快取。
這只是一個很簡單的例子,redis資料型態很豐富的,合理使用可以用得很爽。還有,上面例子,可以設定每個快取後給這條快取設定一個有效期,好比一周,看你業務了。一般來說老的東西用戶看得比較少,那麼到期後沒人瀏覽就不重建了,保證你redis一直是熱數據。不至於一堆陳年數據,手機打字好累,有用請給讚

左手右手慢动作

快取的意義就是儲存熱門的數據,比如說在redis中儲存資料庫經常要用到的數據,這樣就不必每次查詢資料庫了。

樓主遇到的問題是快取裡的資料如何跟資料庫的資料一致的問題。
像上面說到的表如果有数据修改添加删除,flushDB(),是不可取的。

對快取資料的操作其實簡化下來就是

當你的應用程式查詢redis時,如果發現查不到,這個時候就要去查資料庫,並把查出來的資料存到redis中。
當資料庫的資料有改動時,上面說到的数据增删改对redis都有操作后再对数据库操作,其實也是不可取的,應用應先修改資料庫,成功了之後再對redis更新。如果先對redis更新,但對資料庫的更新失敗了怎麼辦? redis不就儲存有髒資料了嗎。

另外,快取中的資料是可以設定失效時間的(expire timeout),過了失效時間,就再查一次資料庫,更新一下資料(即使資料根本沒變過),在失效時間之前,至少減少了資料庫的負載。

看樓主題目的意思,有一種想把redis當做資料庫資料的備份一樣,那樣就不是用redis快取的意義了(也許應該考慮資料庫主從備份)。

至於你說的方案,看題目的描述,這並不是需要一個方案(我覺得高可用配置,考慮數據的一致性強弱等等方面才稱之為方案)。
其實是程式碼的邏輯,看程式碼怎麼寫。

伊谢尔伦

spring 有redis插件,小專案用ehcache,spring插件比較方便。

迷茫

你實作一個快取系統,一定要考慮這三個問題(第三個問題為可選)

  1. 快取的載入

  2. 緩存的失效

  3. 快取的更新(可選)

問題1:

快取的載入, 你要做的很簡單. 就是任何查詢,首先查詢快取, 快取沒有命中​​,再查資料庫.

問題2:

快取的失效,你要做的就是在任何對資料庫的修改(更新,刪除). 記得刪除快取.

問題3:

資料有更新時,不對快取做失效刪除,而是對快取進行更新.這個可選的操作,可以幫你實現快取永遠是最新的效果.

針對問題3,還有一個問題就是. 不要在資料庫還沒有更新成功之前就更新快取. 更新資料庫有可能失敗, 這時如果你的快取沒有還原, 就會出現髒資料.

Peter_Zhu

mybatis-redis有個解決方案可以參考https://github.com/mybatis/redis-cache

刘奇

實現過@Cacheable,使用在servicedao层的方法上,用来进行拦截,直接去redis取資料。

熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!