標籤:
http://blog.csdn.net/hpb21/article/details/7852934
找了點資料看了下。學習心得如下:
1 Mysql更新Redis
Mysql更新Redis借鑒memcache與mysql通訊,利用mysql udf,每有更新操作觸發更新redis操作。不足在高並發時mysql壓力較大,且針對每張表均需增刪改觸發,且Redis伺服器不好更換(不知道有沒有方法)。
2 Redis更新Mysql
最簡單的就是讀redis->寫mysql.但是在高並發下,這樣就不太適合了,因此考慮利用訊息佇列每隔的固定時間更新Mysql。
但是資料中主鍵為自增時,目前想法如下:
第一,Redis採用tempId為key,id為空白,通過mysql udf重寫資料到緩衝如 ,清空緩衝臨時資料。
第二,redis key值不採用Id,採用欄位uuid,再通過mysql udf 同步redis緩衝 id。
第三,Redis讀取Mysql表最新自增鍵Id值,Redis傳遞id。
Redis更新Mysql需注意,Redis在系統中的定位,作快取服務器時,需規劃儲存哪些資料,儲存多長時間等等。
並發訪問
Redis為單進程單線程模式,採用隊列模式將並發訪問變為串列訪問。Redis本身沒有鎖的概念,Redis對於多個用戶端串連並不存在競爭,但是在Jedis用戶端對Redis進行並發訪問時會發生連線逾時、資料轉換錯誤、阻塞、用戶端關閉串連等問題,這些問題均是由於用戶端串連混亂造成。對此有2種解決方案:
1.用戶端角度,為保證每個用戶端間正常有序與Redis進行通訊,對串連進行池化,同時對用戶端讀寫Redis操作採用內部鎖synchronized。
2.伺服器角度,利用setnx實現鎖。如某用戶端要獲得一個名字list的鎖,用戶端使用下面的命令進行擷取:
Setnx lock.list current time + lock timeout
- 如返回1,則該用戶端獲得鎖,把lock. list的索引值設定為時間值表示該鍵已被鎖定,該用戶端最後可以通過DEL lock.list來釋放該鎖。
- 如返回0,表明該鎖已被其他用戶端取得,等對方完成或等待鎖逾時。
3.線程池
mysql通訊
資料一致性主要針對系統中Redis與mysql中的資料而言。為保證二者資料一致可採用以下策略:對於重要的資料,系統可以採取先寫資料庫再寫緩衝的方式來保證,而對於一般而響應速度要求很高的資料可以採取先寫緩衝然後通過訊息佇列再寫入資料庫的方式,同時做好錯誤記錄檔記錄以及能根據日誌恢複資料。(jms/Redis訊息佇列)
存在問題:
(1)當使用者進行添加操作, Redis與Mysql如何同步?
首先伺服器啟動,Redis讀取Mysql表最新自增鍵Id值,然後Redis 讀取id並封裝緩衝,同時保持mysql最後由隊列完成mysql更新
(2)訊息佇列處理?
定位Redis操作:
定位dao:定義類、方法對應規則,結合儲存Redis key定位方法,更新mysql
分類處理:按照類、方法。
[轉]Redis 與Mysql通訊