84669 人學習
152542 人學習
20005 人學習
5487 人學習
7821 人學習
359900 人學習
3350 人學習
180660 人學習
48569 人學習
18603 人學習
40936 人學習
1549 人學習
1183 人學習
32909 人學習
现在的方案是,sql 作为key 查询结果序列化后 存入value 。表如果有数据修改添加删除,flushDB()。但是整个项目只要有数据变更缓存就没了。谁还有其他方案?想知道的就是数据增删改对redis都有操作后再对数据库操作,redis里查询的永远是最新的,当某些原因redis里查不到时查数据库然后保存到reids里。这种方案有谁实现了吗?
人生最曼妙的风景,竟是内心的淡定与从容!
為啥要用sql當key....還每次flushdb,你可以換個思路,假如有個表是商品,主鍵是id,你可以建一個key是detail:商品id的緩存,把這行記錄作為value,資料類型hash或string都行。有些時候你的業務要根據主鍵查某條商品資訊的時候,先去redis看看有沒有detail:主鍵的緩存,有的時候就直接取緩存,沒有命中緩存然後查數據庫,並把查詢結果存入快取.還有就是當有該筆記錄變更的時候,可以直接刪除緩存,也可以update快取。 這只是一個很簡單的例子,redis資料型態很豐富的,合理使用可以用得很爽。還有,上面例子,可以設定每個快取後給這條快取設定一個有效期,好比一周,看你業務了。一般來說老的東西用戶看得比較少,那麼到期後沒人瀏覽就不重建了,保證你redis一直是熱數據。不至於一堆陳年數據,手機打字好累,有用請給讚
快取的意義就是儲存熱門的數據,比如說在redis中儲存資料庫經常要用到的數據,這樣就不必每次查詢資料庫了。
樓主遇到的問題是快取裡的資料如何跟資料庫的資料一致的問題。 像上面說到的表如果有数据修改添加删除,flushDB(),是不可取的。
表如果有数据修改添加删除,flushDB()
對快取資料的操作其實簡化下來就是讀和寫
當你的應用程式查詢redis時,如果發現查不到,這個時候就要去查資料庫,並把查出來的資料存到redis中。 當資料庫的資料有改動時,上面說到的数据增删改对redis都有操作后再对数据库操作,其實也是不可取的,應用應先修改資料庫,成功了之後再對redis更新。如果先對redis更新,但對資料庫的更新失敗了怎麼辦? redis不就儲存有髒資料了嗎。
数据增删改对redis都有操作后再对数据库操作
另外,快取中的資料是可以設定失效時間的(expire timeout),過了失效時間,就再查一次資料庫,更新一下資料(即使資料根本沒變過),在失效時間之前,至少減少了資料庫的負載。
看樓主題目的意思,有一種想把redis當做資料庫資料的備份一樣,那樣就不是用redis快取的意義了(也許應該考慮資料庫主從備份)。
至於你說的方案,看題目的描述,這並不是需要一個方案(我覺得高可用配置,考慮數據的一致性強弱等等方面才稱之為方案)。 其實是程式碼的邏輯,看程式碼怎麼寫。
spring 有redis插件,小專案用ehcache,spring插件比較方便。
你實作一個快取系統,一定要考慮這三個問題(第三個問題為可選)
快取的載入
緩存的失效
快取的更新(可選)
快取的載入, 你要做的很簡單. 就是任何查詢,首先查詢快取, 快取沒有命中,再查資料庫.
快取的失效,你要做的就是在任何對資料庫的修改(更新,刪除). 記得刪除快取.
資料有更新時,不對快取做失效刪除,而是對快取進行更新.這個可選的操作,可以幫你實現快取永遠是最新的效果.
針對問題3,還有一個問題就是. 不要在資料庫還沒有更新成功之前就更新快取. 更新資料庫有可能失敗, 這時如果你的快取沒有還原, 就會出現髒資料.
mybatis-redis有個解決方案可以參考https://github.com/mybatis/redis-cache
實現過@Cacheable,使用在service或dao层的方法上,用来进行拦截,直接去redis取資料。
@Cacheable
service
dao
redis
為啥要用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:
資料有更新時,不對快取做失效刪除,而是對快取進行更新.這個可選的操作,可以幫你實現快取永遠是最新的效果.
針對問題3,還有一個問題就是. 不要在資料庫還沒有更新成功之前就更新快取. 更新資料庫有可能失敗, 這時如果你的快取沒有還原, 就會出現髒資料.
mybatis-redis有個解決方案可以參考https://github.com/mybatis/redis-cache
實現過
@Cacheable
,使用在service
或dao
层的方法上,用来进行拦截,直接去redis
取資料。