首頁  >  問答  >  主體

java - redis 缓存方案--有没有可用的?

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

黄舟黄舟2765 天前472

全部回覆(6)我來回復

  • 高洛峰

    高洛峰2017-04-18 09:15:22

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

    回覆
    0
  • ringa_lee

    ringa_lee2017-04-18 09:15:22

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

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

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

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

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

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

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

    回覆
    0
  • 伊谢尔伦

    伊谢尔伦2017-04-18 09:15:22

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

    回覆
    0
  • 迷茫

    迷茫2017-04-18 09:15:22

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

    1. 快取的載入

    2. 緩存的失效

    3. 快取的更新(可選)

    問題1:

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

    問題2:

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

    問題3:

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

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

    回覆
    0
  • 天蓬老师

    天蓬老师2017-04-18 09:15:22

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

    回覆
    0
  • 怪我咯

    怪我咯2017-04-18 09:15:22

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

    回覆
    0
  • 取消回覆