6 回答

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

TA貢獻1850條經驗 獲得超11個贊
緩存的意義就是存儲熱門的數據,比如說在redis中存儲數據庫經常要用到的數據,這樣就不必每次查詢數據庫了。
樓主遇到的問題是緩存里的數據如何跟數據庫的數據保持一致的問題。
像上面說到的表如果有數據修改添加刪除,flushDB()
,是不可取的。
對緩存數據的操作實際上簡化下來就是讀和寫
當你的應用查詢redis時,如果發現查不到,這個時候就要去查數據庫,并把查出來的數據存到redis中。
當數據庫的數據有改動時,上面說到的數據增刪改對redis都有操作后再對數據庫操作
,其實也是不可取的,應用應先修改數據庫,成功了之后再對redis更新。如果先對redis更新,但對數據庫的更新失敗了怎么辦?redis不就存儲有臟數據了嗎。
另外,緩存中的數據是可以設置失效時間的(expire timeout),過了失效時間,就再查一次數據庫,更新一下數據(即使數據根本沒變過),在失效時間之前,至少減少了數據庫的負載。
看樓主題目的意思,有一種想把redis當做數據庫數據的備份一樣,那樣就不是用redis緩存的意義了(也許應該考慮數據庫主從備份)。
至于你說的方案,看題目的描述,這并不是需要一個方案(我覺得高可用配置,考慮數據的一致性強弱等等方面才稱之為方案)。
實際上是代碼的邏輯,看代碼怎么寫。
添加回答
舉報