hjr-JAVA Redis使用詳解

使用

redis是KV型的內存數據庫,在java中使用Redis,需要在Pom中引用Jedis包,之後新建Config類進行基本配置,在使用處例化Jedis,之後對Redis進行各種操作

常用數據結構

  • String:普通的ky結構,value是一個字符串,可以存儲熱點數據計數值、訪問量等
  • List:(lpush lpop)操作的一個隊列,基於雙向鏈表,所有想存儲集合的地方都可以用list
  • Hash:(mset mget)value是hashmap,和java一樣採用鏈地址法的方式去處理碰撞,可以直接對hashmap裏的kv操作,如果用string類型,存儲json字符串則需要全部取出再格式轉換,可以存儲比如一個用戶對象
  • Set:(sadd spop)一種value爲null的hashmap,類似list,可以自動排重、求交集並集,如做多個用戶好友求交集然後做你可能認識的好友推薦
  • Sort Set:在set的基礎上加了一個分數,會自動根據分數排序,可以用於排行榜等業務

redis也支持消息的發佈與訂閱,一般用在聊天室或分佈式系統中的配置中心,不過還是更建議使用MQ做該功能

分佈式配置中心修改配置後,分發給每個子系統,每個子系統根據配置變化重啓或開啓關閉新服務等

持久化機制

  • RDB(默認):指定的時間間隔內將內存中的數據集快照寫入磁盤,會生成dump.rdb文件,重啓後加載改文件

  • AOF:每次進行寫操作會把操作紀錄進入日誌文件,重啓後根據日誌執行所有的語句進行數據恢復,效率低於上者,數據完整性高於上者

一般還是要寫定時任務到mysql,MySQL 在崩潰處理,數據恢復方面比 redis 要強,redis每次加載會消耗時間,並且一些報表統計等業務,在mysql中查詢效果會更好

業務場景

  • 分佈式鎖
    在分佈式系統中,爲了避免多線程競爭,可以在訪問一個共享資源的時候,如操作訂單,將訂單號作爲key存儲到Redis中,在其他線程訪問該訂單時在Redis中進行檢測,如果存在,則代表該訂單被加鎖,其餘線程等待
  • 緩存
    部分大訪問量場景,如商品瀏覽,會把熱點數據先緩存到Redis中,提高響應速度,降低數據庫壓力

Redis集羣

通過16384個哈希槽實現集羣,在配置文件中對多個節點進行配置,所有節點平分全部哈希槽,

請求會根據key 取模hash後自動分配到某個哈希槽

如果配置成主從模式,主節點掛了會自動重新選舉leader

跳躍表

redis在sort set數據結構和請求分配集羣節點處採用了跳躍表

跳躍表是一種類似於二叉查找樹的多層鏈表結構,鏈表的特點是插入刪除快,查詢慢,所以採用金字塔形的多層鏈表,查找的時候先查詢塔尖,然後找到下一層的區間,不斷往下查詢,目的是爲了提高鏈表的查詢速度

rehash

redis和rehash和java hashmap的rehash區別是

redis 和java都是先開雙倍的內存,但是redis採漸進式rehash, 即在以後的操作中慢慢的copy進去, java會直接複製到新內存中

java採用負載因子,默認0.75 當hash佔桶的75%,進行rehash

Redis 採用元素數目大於桶數目且元素數目與桶數目比值大於5時,進行rehash

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章