Redis和MySQL數據同步及Redis使用場景

1.同步MySQL數據到Redismysql

(1) 在redis數據庫設置緩存時間,當該條數據緩存時間過時以後自動釋放,去數據庫進行從新查詢,但這樣的話,咱們放在緩存中的數據對數據的一致性要求不是很高才能放入緩存當中。redis

      例如:緩存量大但又不常變化的數據,好比商品信息的評論。sql

(2) 基於binlog使用mysql_udf_redis,將數據庫中的數據同步到Redis。數據庫

       不管MySQL仍是Redis,自身都帶有數據同步的機制,像比較經常使用的MySQL的Master/Slave模式,就是由Slave端分析Master的binlog來實現的,這樣的數據其實仍是一個異步過程,只不過當服務器都在同一內網時,異步的延遲幾乎能夠忽略。緩存

      那麼理論上咱們也能夠用一樣方式,分析MySQL的binlog文件並將數據插入Redis。可是這須要對binlog文件以及MySQL有很是深刻的理解,同時因爲binlog存在Statement/Row/Mixedlevel多種形式,分析binlog實現同步的工做量是很是大的。服務器

(3) 經過MySQL自動同步刷新Redis數據結構

     當咱們在業務層有數據查詢需求時,先到Redis緩存中查詢,若是查不到,再到MySQL數據庫中查詢,同時將查到的數據更新到Redis裏;當咱們在業務層有修改插入數據需求時,直接向MySQL發起請求,同時更新Redis緩存。 就是MySQL的CRUD發生後自動地更新到Redis裏,這須要經過MySQL UDF來實現。具體來講,咱們把更新Redis的邏輯放到MySQL中去作,即定義一個觸發器Trigger,監聽CRUD這些操做,當操做發生後,調用對應的UDF函數,遠程寫回Redis,因此業務邏輯只須要負責更新MySQL就好了,剩下的交給MySQL UDF去完成。異步

     (4) 在咱們的實際開發當中每每採用以下方式實現實現Mysql和Redis數據同步:當咱們在MySQL數據庫中進行增刪改的時候,咱們在增刪改的service層將緩存中的數據清除,這個時候用戶在此請求的時候咱們緩存中沒有數據了,直接去數據庫中查詢,查詢回來以後將緩存中的數據放緩存當中,這個時候緩存中的數據就是最新的數據。函數

 

2.同步Redis到MySql性能

    redis讀取速度快,也沒有必要把全部的數據都放到redis裏面,redis裏面只放使用頻繁,用戶操做量較大的數據,或者用戶近期使用的數據。

解決辦法:

     (1) 讀取數據的時候先從redis裏面查,若沒有,再去數據庫查,同時寫到redis裏面,而且要設置失效時間。

     (2) 存數據的時候要具體狀況具體分析,能夠選擇同時插到數據庫和redis(要是存放到redis中,最好設置失效時間),也能夠選擇直接插到數據庫裏面,少考慮一些問題。

 

3.Redis應用場景

(1) 取最新N個數據的操做

    好比典型的取你網站的最新文章,經過下面方式,咱們能夠將最新的5000條評論的ID放在Redis的List集合中,並將超出集合部分從數據庫獲取

使用LPUSH latest.comments<ID>命令,向list集合中插入數據,插入完成後再用LTRIM latest.comments 0 5000命令使其永遠只保存最近5000個ID

而後咱們在客戶端獲取某一頁評論時能夠用下面的邏輯(僞代碼)

FUNCTION get_latest_comments(start,num_items):

    id_list = redis.lrange("latest.comments",start,start+num_items-1)

    IF id_list.length < num_items

        id_list = SQL_DB("SELECT ... ORDER BY time LIMIT ...")

    END

    RETURN id_list

END

    若是你還有不一樣的篩選維度,好比某個分類的最新N條,那麼你能夠再建一個按此分類的List,只存ID的話,Redis是很是高效的。

(2) 排行榜應用,取TOP N操做

    這個需求與上面需求的不一樣之處在於,前面操做以時間爲權重,這個是以某個條件爲權重,好比按頂的次數排序,這時候就須要咱們的sorted set出馬了,將你要排序的值設置成sorted set的score,將具體的數據設置成相應的value,每次只須要執行一條ZADD命令便可。

(3) 須要精準設定過時時間的應用

    好比你能夠把上面說到的sorted set的score值設置成過時時間的時間戳,那麼就能夠簡單地經過過時時間排序,定時清除過時數據了,不只是清除Redis中的過時數據,你徹底能夠把Redis裏這個過時時間當成是對數據庫中數據的索引,用Redis來找出哪些數據須要過時刪除,而後再精準地從數據庫中刪除相應的記錄。

(4) 計數器應用

    Redis的命令都是原子性的,你能夠輕鬆地利用INCR,DECR命令來構建計數器系統。

(5) Uniq操做,獲取某段時間全部數據排重值

    這個使用Redis的set數據結構最合適了,只須要不斷地將數據往set中扔就好了,set意爲集合,因此會自動排重。

(6) 實時系統,反垃圾系統

    經過上面說到的set功能,你能夠知道一個終端用戶是否進行了某個操做,能夠找到其操做的集合並進行分析統計對比等。沒有作不到,只有想不到。

(7) Pub/Sub構建實時消息系統

    Redis的Pub/Sub系統能夠構建實時的消息系統,好比不少用Pub/Sub構建的實時聊天系統的例子。

(8) 構建隊列系統

    使用list能夠構建隊列系統,使用sorted set甚至能夠構建有優先級的隊列系統。

(9) 緩存

  性能優於Memcached,數據結構更多樣化---------------------

相關文章
相關標籤/搜索