日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

大数据 互联网架构阶段 Redis

發(fā)布時間:2024/4/30 数据库 46 豆豆
生活随笔 收集整理的這篇文章主要介紹了 大数据 互联网架构阶段 Redis 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

Redis

零、 目錄

  • 高并發(fā)思路
  • 電商網(wǎng)站中緩存數(shù)據(jù)庫的設(shè)計
  • 緩存介紹
  • 按照redis
  • redis常用命令
  • redis其他數(shù)據(jù)結(jié)構(gòu)
  • 數(shù)據(jù)分布式存儲
  • Jedis客戶端
  • 哈希一致性
  • 補(bǔ)充

一、 高并發(fā)思路

  • 技術(shù): tomcat集群+ nginx
  • 理論上引入20臺nginx — 100萬/s的并發(fā)量
  • 問題: 當(dāng)100萬個用戶同時增刪該查時 , 就出現(xiàn)了系統(tǒng)瓶頸
  • 系統(tǒng)瓶頸: 后臺程序能支持100萬/秒的訪問 , 但是數(shù)據(jù)庫扛不住100萬/s的訪問
  • redis
  • 分布式 、 nosql 、 可以持久化+內(nèi)存 、 內(nèi)存 、 數(shù)據(jù)庫
  • 分布式: 數(shù)據(jù)庫被劃分
  • nosql(not only sequence query language): 不僅僅支持關(guān)系型 、 結(jié)構(gòu)化的數(shù)據(jù)庫 , 而且支持非關(guān)系型 、 非結(jié)構(gòu)化數(shù)據(jù)
  • 可持久化+內(nèi)存: 啟動恢復(fù)機(jī)制(redis啟動之后立即恢復(fù)之前的數(shù)據(jù))
  • 數(shù)據(jù)庫: 數(shù)據(jù)存儲
  • 作用: 可以分布式的存儲海量的數(shù)據(jù) , 放到內(nèi)存中 , 可以做緩存數(shù)據(jù)庫
  • 二、 電商網(wǎng)站中緩存數(shù)據(jù)庫如何設(shè)計

  • 緩存可以如何添加
  • 數(shù)據(jù)庫緩存:
  • 執(zhí)行的過程包括sql和組織查詢結(jié)果 , 根據(jù)sql可以創(chuàng)建緩存 , 存儲已經(jīng)查過的resultSet , 節(jié)省了資源調(diào)度重組resultSet
  • 持久層緩存:
  • 減少數(shù)據(jù)庫獲取的結(jié)果轉(zhuǎn)化為對象的過程 , 緩存直接調(diào)用保存的對象結(jié)果
  • 業(yè)務(wù)層緩存:減少調(diào)用層次
  • 控制層緩存: 減少調(diào)用層次
  • 問題: 可以不可以過多的使用緩存?
  • 緩存是占用內(nèi)存空間的 ,過多的緩存插入 , 容易造成數(shù)據(jù)的冗余 , 在內(nèi)存不夠時 , 清空邏輯會交叉導(dǎo)致數(shù)據(jù)庫失效
  • 結(jié)論: 緩存引入的最終目的:
  • 減少數(shù)據(jù)庫的訪問壓力
  • 減少網(wǎng)路傳輸
  • 減少封裝層次
  • 三、緩存介紹

  • 主流的緩存結(jié)構(gòu):
  • ehcache(很多數(shù)據(jù)庫底層緩存用的就是ehcache)并發(fā)量差
  • memoryCache , 10年前 , 并發(fā)量高(100萬左右/秒) , 缺點(diǎn): 不落地(數(shù)據(jù)不能持久化 , 在宕機(jī)后不能立即恢復(fù)丟失的數(shù)據(jù) , 嚴(yán)重的情況下容易造成緩存擊穿 , 這也是被redis取代的主要原因)
  • redis: 持久化 , 可以在宕機(jī)恢復(fù)后迅速的解決數(shù)據(jù)丟失的問題
  • 問題: 如果在緩存服務(wù)器宕機(jī)后 , 無法進(jìn)行數(shù)據(jù)恢復(fù)/沒有解決數(shù)據(jù)丟失的問題 , 會導(dǎo)致“雪崩”(也叫緩存擊穿)
    1. 雪崩(緩存擊穿): 海量用戶訪問請求涌入 , 一旦緩存失效(宕機(jī)后緩存數(shù)據(jù)丟失) , 所有訪問涌入數(shù)據(jù)庫 , 數(shù)據(jù)庫無法承受海量的數(shù)據(jù)的查詢 , 導(dǎo)致數(shù)據(jù)庫服務(wù)器宕機(jī) , 這時重啟數(shù)據(jù)庫 , 但是請求沒有消失甚至用戶在不斷的刷新(請求瞬間翻倍) , 就發(fā)生了數(shù)據(jù)庫在重啟->宕機(jī)->重啟中循環(huán) , 導(dǎo)致整個系統(tǒng)崩潰。
  • 解決雪崩問題:
  • 緩存永不宕機(jī): 啟動集群 , 永遠(yuǎn)讓集群的一部分起作用 , 剩余的一部分做備用
  • 緩存技術(shù)必須要支持恢復(fù)數(shù)據(jù) , 持久化 。
  • 四、 安裝redis

  • 登錄linux , 并創(chuàng)建管理目錄
  • 下載安裝包并解壓

    下載命令wget "http://bj-yzjd.cn-bj.ufileos.com/redis-3.2.11.tar.gz" 解壓tar -xvf redis-3.2.11.tar.gz
  • 進(jìn)入解壓之后的文件 , 執(zhí)行安裝

    make && make install
  • 啟動redis

    redis-server

    則啟動成功

  • 使用redis

  • redis啟動成功之后該linux主機(jī)立即成為一臺redis服務(wù)器 , 此時使用redis時需要再打開一個該虛擬機(jī)的連接之后啟動redis客戶端
  • 使用redis需要啟動redis客戶端

    redis-cli
  • 如果想在同一個連接中啟動服務(wù)和客戶端 , 則啟動redis時可以使redis服務(wù)器在后臺運(yùn)行

    redis-server &
  • 停止redis服務(wù)

  • 在占用控制臺的服務(wù)連接中直接Ctrl+c即可停止服務(wù)
  • 在客戶端中

    shutdown
  • 檢查后臺 運(yùn)行的 redis

    ps -ef|grep redis
  • redis-server 表示redis服務(wù)
  • *表示所有IP都能夠訪問當(dāng)前redis服務(wù) , 如果列出一些列的IP地址 , 則除這些ip地址以外的訪問都被拒絕。
  • 五、 redis常用命令

  • redis存儲的數(shù)據(jù)實(shí)際上是map形式(key-value|{key , value}|list)的字符串
  • keys : 獲取當(dāng)前存儲空間中所有存在的key
  • set [key] [value] : 設(shè)置key-value , key和value都是字符串
  • get[key] :通過key獲取對應(yīng)的值
  • select[整數(shù)值0~15] : redis默認(rèn)存在0~15標(biāo)號的數(shù)據(jù)庫 分庫 , 默認(rèn)使用第一個庫(0號庫) , 這個功能是早期版本的冗余功能 , 現(xiàn)在的java代碼不支持分庫, 所以select 的功能逐漸不被使用
  • exists [key] : 判斷該key是否存在
  • 與get的區(qū)別:
  • 分析get: 在redis中一個字段允許存儲的最大大小為512M
  • 如果使用get查詢 , 如果存在則會返回值 , 此時如果值過大會占用過多的資源 。
  • 而exists只是判斷key是否存在 , 如果存在會返回1 , 如果不存在則返回0.
  • del [key] : 刪除該key對應(yīng)的鍵值對
  • type [key] : 獲取key對應(yīng)值的類型 , 普通的數(shù)據(jù)類型都是string , 復(fù)雜的數(shù)據(jù)類型有map 和list
  • help type/help[命令名稱] 如:help set : 查看該命令的作用
  • 實(shí)際問題可以在官網(wǎng)中查詢對應(yīng)的命令細(xì)節(jié)
  • flushall : 將所有的數(shù)據(jù)(0~15號庫) , flush到持久化文件中
  • flushdb : flush當(dāng)前分庫的所有數(shù)據(jù)到持久化文件中 。
  • incr [key] : 自增 , Integer類型的數(shù)據(jù)自增(redis中存儲是都是String類型 , 在需要自增時, 會先試圖轉(zhuǎn)換成Integer在再增) , 如果轉(zhuǎn)換不成功 , 則會報錯, incrby [key] index 自增指定的步數(shù)
  • decr [key]: 自減 decr [key] index 自減指定的步數(shù)
  • append [key] [appendValue]: 在value后追加數(shù)據(jù)
  • mget [k1] [k2] … : 獲取一批key對應(yīng)的值
  • mset [k1] [v1] [k2] [v2] … : 設(shè)置一批數(shù)據(jù) 常用的編程語言的API一般不支持這個命令 ,因為使用這中群體操作k-v的命令后不支持?jǐn)?shù)據(jù)分片(使用key取hash值取余后 散列存儲)和集群計算 ; 這是一個早期的冗余功能
  • expire [key] 時間數(shù)字(單位:秒) :設(shè)置當(dāng)前key對應(yīng)的value的過期時間
  • ttl [key] : 查看當(dāng)前key-value的存活時間
  • -2 代表過期
  • -1 代表永久
  • 可以使用數(shù)據(jù)中的過期時間來做倒計時 , 或者秒殺 , 但是這個倒計時是秒級別的 。
  • pexpire [key] 時間(單位毫秒) :做精確時間的秒殺
  • 六、 redis其他數(shù)據(jù)結(jié)構(gòu)

  • Hash結(jié)構(gòu):
  • 本身是key-value 的形式 , 但是這里的key也是key-value的形式
  • hset [key] [field] [value] : 賦值
  • hget [key] [field] : 取值
  • hmset [key] [field] [value] [field1] [value1] :批量賦值
  • hmget [key] [field] [field1]: 批量取值
  • hexists : 查看屬性是否存在 , 存在返回1 , 不存在返回0
  • hdel [key] [field] :刪除字段
  • hkeys [key]:只獲取字段名
  • hvals [key] : 只獲取字段值
  • hlen [key]:獲取字段數(shù)量
  • list結(jié)構(gòu)
  • key-value(雙向鏈表 , 左->上 , 右→下)
  • lrange [listkey] start end :查看list
  • lpush [key] value :向?qū)?yīng)的list的頭部添加信息 , 如果沒有改;list則創(chuàng)鍵后添加
  • rpush [key] [v1] : 向?qū)?yīng)的list的尾部添加字符串元素
  • linsert : 向?qū)?yīng)的list的特定位置之前或之后添加字符串元素
  • lset:設(shè)置list中指定下標(biāo)的元素值
  • lrem : 從key對應(yīng)的list中刪除count個value相同的元素
  • count>0按從頭到尾的順序刪除
  • count<0 時按照從尾到頭的順序刪除
  • count=0 時 刪除所有與value相同的元素
  • ltrim : 保留指定key的值得范圍內(nèi)的數(shù)據(jù)
  • lpop : 從list頭部刪除元素, 并返回刪除的元素
  • rpop : 從list尾部刪除元素并返回刪除的元素
  • rpoplpush [list1] [list2]:從第一個尾部刪除一個數(shù)據(jù)并將刪除的數(shù)據(jù)添加到第二個list頭部 , 整個操作是原子級的如果第一個list不存在或為空 則執(zhí)行結(jié)果為nil , 如果第二個list不存在則創(chuàng)建
  • lindex : 返回名稱為key的list中index位置的元素
  • llen : 返回list的長度
  • 七、 數(shù)據(jù)分布式存儲

  • 要完成數(shù)據(jù)的分片存儲 , 需要至少多個redis實(shí)例
  • 啟動多個redis時 , 每一個redis會占用一個端口 , 如果端口沖突 , 則會發(fā)生啟動失敗 , 所以要更改redis的默認(rèn)配置文件
  • 修改配置文件
  • 進(jìn)入到redis根目錄下的redis.conf文件修改
  • 直接輸入:set number 使左側(cè)的行號顯示
  • 第61行 把bind注釋掉
  • 第80行 保護(hù)模式關(guān)閉
  • 第84行修改默認(rèn)端口 , 避免和其他redis沖突 , redis默認(rèn)是6379
  • 第105行當(dāng)客戶端空閑時間1小時就自動斷開連接 , 0秒表示不啟用超時設(shè)置
  • 第128行daemonize設(shè)置成yes讓redis啟動時由守護(hù)進(jìn)程管理(也就是在后臺執(zhí)行)
  • 第150行 , 不同的redis設(shè)置不同的pid文件(和端口同名)
  • 設(shè)置日志級別 , 使用默認(rèn)就行
  • 設(shè)置flush動作規(guī)則 , 默認(rèn)900秒以內(nèi) 至少有1條數(shù)據(jù)改動 則執(zhí)行flush , 在300秒以內(nèi)至少有10條數(shù)據(jù)變動則執(zhí)行flush , 在60秒以內(nèi)至少有10000條數(shù)據(jù)有變動則執(zhí)行flush操作 。 默認(rèn)即可
  • 修改完之后保存并退出
  • 復(fù)制整個redis文件夾 為 r2 , r3
  • 并且修改r2 r3中配置文件的端口和pid dump文件的名字
  • 進(jìn)入到r1目錄下 , 執(zhí)行redis-server redis6379.conf
  • 進(jìn)入到r2目錄下 , 執(zhí)行redis-server redis6380.conf
  • 進(jìn)入到r3目錄下 , 執(zhí)行redis-server redis6381.conf
  • 執(zhí)行完之后檢測三個redis實(shí)例是否啟動成功 ps -ef|grep redis
  • 此時如果需要開啟redis客戶端 字需要 執(zhí)行 redis-cli -p 端口號
  • 八、 Jedis客戶端

  • redis集群部署完成 , 就是執(zhí)行數(shù)據(jù)的存儲
  • 數(shù)據(jù)來源: 代碼 執(zhí)行過程中產(chǎn)生
  • 如何使用代碼來做redis數(shù)據(jù)的緩存? Jedis客戶端
  • 在使用之前需要先導(dǎo)入Jedis的jar包

    <jedis.version>2.6.0</jedis.version><!-- jedis --> <dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId><version>${jedis.version}</version> </dependency>
  • Jedis示例:

    /*** 測試單個結(jié)點(diǎn)(單個redis)連接* */@Testpublic void test_01() {//創(chuàng)建Jedis對象 , 并在構(gòu)造方法中設(shè)置redis主機(jī)的ip和占用的端口Jedis jedis = new Jedis("106.75.48.3",6379);//使用Jedis進(jìn)行簡單的操作//存數(shù)據(jù)jedis.set("name", "tianjie");//取數(shù)據(jù)String name = jedis.get("name");System.out.println("name="+name);} /*** 模擬數(shù)據(jù)緩存執(zhí)行邏輯 , 數(shù)據(jù)庫的查詢操作* */ @Test public void test_02() {System.out.println("用戶開始查詢數(shù)據(jù)");//模擬客戶端傳來的參數(shù)String name = "name";//創(chuàng)建一個Jedis客戶端Jedis jedis = new Jedis("106.75.48.3" , 6379);//執(zhí)行邏輯 //1. 先查詢緩存中是否有數(shù)據(jù) , 如果有則返回緩存中的數(shù)據(jù)//2. 如果緩存中沒有數(shù)據(jù)則去數(shù)據(jù)庫中查詢數(shù)據(jù) , 并且 把查詢到的數(shù)據(jù)存入緩存中 , 供后續(xù)使用 , 返回數(shù)據(jù)庫中查詢到的信息String gname = jedis.get("name");if(gname != null && !gname.equals("")) {//緩存中有數(shù)據(jù)System.out.println("從緩存中獲取到的數(shù)據(jù)為:name = "+gname);}else {//緩存中沒有數(shù)據(jù)//執(zhí)行從數(shù)據(jù)庫查詢數(shù)據(jù) 略String dbname = "outman";//數(shù)據(jù)庫查詢到的數(shù)據(jù)//將查詢到的數(shù)據(jù)存入緩存中 jedis.set("name", dbname);//返回從數(shù)據(jù)庫中查到的數(shù)據(jù)System.out.println("從數(shù)據(jù)庫獲取到的數(shù)據(jù)為:name = "+dbname);}//第一次執(zhí)行結(jié)果為從數(shù)據(jù)庫中獲取//第二次執(zhí)行結(jié)果我從緩存中獲取數(shù)據(jù) }
  • 自定義分片算法 ,將數(shù)據(jù)分片存入多個redis實(shí)例

    /*** 自定義分片計算邏輯* */@Testpublic void test_03() {//模擬需要存儲的數(shù)據(jù)String k1 = "四十二章經(jīng)第一章";String v1 = "111111111111111111";String k2 = "四十二章經(jīng)第二章";String v2 = "222222222222222222";String k3 = "四十二章經(jīng)第三章";String v3 = "333333333333333333";List<String> keyList = new ArrayList<String >();keyList.add(k1);keyList.add(k2);keyList.add(k3);Map<String , String > map = new HashMap<String , String >();map.put(k1, v1);map.put(k2, v2);map.put(k3, v3);for(String key : keyList) {if("四十二章經(jīng)第一章".equals(key)) {//存入第一個redis結(jié)點(diǎn)Jedis jedis = new Jedis("106.75.48.3" , 6379);jedis.set(key, map.get(key));}else if("四十二章經(jīng)第二章".equals(key)) {//存入第二個redis結(jié)點(diǎn)Jedis jedis = new Jedis("106.75.48.3" , 6380);jedis.set(key, map.get(key));}else if("四十二章經(jīng)第三章".equals(key)) {//存入第三個redis結(jié)點(diǎn)Jedis jedis = new Jedis("106.75.48.3" , 6381);jedis.set(key, map.get(key));}}}
  • 使用hash取余法將數(shù)據(jù)分片存儲

    /*** 哈希取余分片存儲邏輯* */@Testpublic void test_04() {//模擬需要被存儲的數(shù)據(jù)List<String> keyList = new ArrayList<String>();Map<String , String> map = new HashMap<String, String>();for(int i = 0 ; i<100 ; i++) {String key = "key_"+i;String value = "value_"+i;keyList.add(key);map.put(key, value);}//使用哈希取余法分片存儲//定義結(jié)點(diǎn)(redis實(shí)例)數(shù)量int n = 3;for(String key : keyList) {//執(zhí)行哈希取余 , 哈希結(jié)果可能為負(fù)數(shù) , 此時需要與Integer的最大數(shù)進(jìn)行與操作Integer num =( key.hashCode()&Integer.MAX_VALUE )%n; if(num == 0) {//存入第一個結(jié)點(diǎn)Jedis jedis = new Jedis("106.75.48.3" , 6379);jedis.set(key, map.get(key));jedis.close();}else if(num == 1) {//存入第二個結(jié)點(diǎn)Jedis jedis = new Jedis("106.75.48.3" , 6380);jedis.set(key, map.get(key));jedis.close();}else if(num == 2) {//存入第三個結(jié)點(diǎn)Jedis jedis = new Jedis("106.75.48.3" , 6381);jedis.set(key, map.get(key));jedis.close();}}//執(zhí)行結(jié)果 100個鍵值對幾乎均勻的 分布存儲在三臺redis實(shí)例上}
  • jedis分片 , 使用的hash一致性

    /*** Jedis分片 使用哈希一致型完成數(shù)據(jù)分片存儲(Jedis默認(rèn)的分片算法)* */@Testpublic void test_05() {//需要構(gòu)造存儲多個reids實(shí)例信息 的listList<JedisShardInfo> jedisList = new ArrayList<JedisShardInfo>();//創(chuàng)建結(jié)點(diǎn)信息JedisShardInfo info1 = new JedisShardInfo("106.75.48.3" , 6379);JedisShardInfo info2 = new JedisShardInfo("106.75.48.3" , 6380);JedisShardInfo info3 = new JedisShardInfo("106.75.48.3" , 6381);//list保存結(jié)點(diǎn)信息jedisList.add(info1);jedisList.add(info2);jedisList.add(info3);//構(gòu)造一個Jedis分片對象 , 將list闖入構(gòu)造方法中 , 狗后續(xù)分片ShardedJedis jedis = new ShardedJedis(jedisList);//模擬海量數(shù)據(jù)執(zhí)行數(shù)據(jù)分片存儲for( int i= 0 ; i<1000 ; i++) {jedis.set("key_"+i, "value_" + i);}jedis.close();//數(shù)據(jù)通過哈希一致型算法分片存儲在了多個reids實(shí)例中//單數(shù)每一個reids的實(shí)例的數(shù)據(jù)量并不是完全平均的 , 會有一定量的數(shù)據(jù)偏移}
  • jedis池的使用

    /*** Jedis池* */@Testpublic void test_06() {//需要構(gòu)造存儲多個reids實(shí)例信息 的listList<JedisShardInfo> jedisList = new ArrayList<JedisShardInfo>();//創(chuàng)建結(jié)點(diǎn)信息JedisShardInfo info1 = new JedisShardInfo("106.75.48.3" , 6379);JedisShardInfo info2 = new JedisShardInfo("106.75.48.3" , 6380);JedisShardInfo info3 = new JedisShardInfo("106.75.48.3" , 6381);//list保存結(jié)點(diǎn)信息jedisList.add(info1);jedisList.add(info2);jedisList.add(info3);//對于連接來將 類似于JDBC連接處可以設(shè)置很多參數(shù)JedisPoolConfig config = new JedisPoolConfig();//設(shè)置最大連接數(shù)config.setMaxTotal(200);//創(chuàng)建Jeids連接池ShardedJedisPool pool = new ShardedJedisPool(config, jedisList);//使用連接處獲取數(shù)據(jù)ShardedJedis jedis = pool.getResource();for(int i = 0 ; i<100 ; i++) {String value = jedis.get("key_"+i);System.out.println("獲取到key_"+i+"的值為"+value);}//歸還連接pool.returnResource(jedis);}
  • 九、哈希一致性

  • 哈希是一種散列算法
  • 使用哈希取余算法進(jìn)行分片存儲的問題 :
  • 會造成大規(guī)模的數(shù)據(jù)傾斜(散列必定傾斜) , 而哈希一致型一定程度的解決了數(shù)據(jù)傾斜
  • 使用哈希取余算法進(jìn)行分片 存儲之后 , 如果redis實(shí)例有變動 , 則數(shù)據(jù)遷移量過大 。
  • 哈希取余算法導(dǎo)致數(shù)據(jù)遷移量巨大
  • 當(dāng)redis集群數(shù)量進(jìn)行增加減少的時候 , n變化導(dǎo)致數(shù)據(jù)命中的變化量非常大 , 所以需要進(jìn)行數(shù)據(jù)遷移
  • 而且redis結(jié)點(diǎn)越多 , 數(shù)據(jù)遷移量越大
  • 哈希一致型

  • jedis中引入另外一種hash散列算法 — hash一致性
  • 是由1997年麻繩理工的學(xué)生發(fā)明 : 其原理是引入一個 2^32-1個結(jié)點(diǎn)的整數(shù)環(huán)
  • 把節(jié)點(diǎn)使用ip+端口做哈希散列計算 , 得到43億中的一個值 , 投射到環(huán)中
  • 然后把所有的數(shù)據(jù)key進(jìn)行hash散列計算 也投射到環(huán)上
  • 其中node代表的是redis , 其余的是數(shù)據(jù)
  • 環(huán)上的數(shù)據(jù)會順時針尋找最近的結(jié)點(diǎn)后存儲
  • 這樣在redis增加或減少時 , 數(shù)據(jù)量的遷移是較少的 , 而且reids結(jié)點(diǎn)越多 , 數(shù)據(jù)量遷移越少
  • 解決數(shù)據(jù)偏移問題

  • 單獨(dú)的使用節(jié)點(diǎn)的ip+端口做映射,畢竟節(jié)點(diǎn)數(shù)量是有限的
  • 有可能在映射時的各自分布位置并不平均,導(dǎo)致數(shù)據(jù)偏移量非常大

    解決數(shù)據(jù)的平衡性引入虛擬節(jié)點(diǎn) node1的ip是192.168.40.156 node2的ip是192.168.40.157 各自引入2個虛擬節(jié)點(diǎn)(虛擬節(jié)點(diǎn)的數(shù)量是非常大的) node1-1=hash(192.168.40.156#1) node1-2=hash(192.168.40.156#2) node2-1=hash(192.168.40.157#1) node2-2=hash(192.168.40.157#2) 每一個虛擬節(jié)點(diǎn)在哈希環(huán)上也會接收順時針尋找最近節(jié)點(diǎn)的key們 通過增加節(jié)點(diǎn)數(shù)量(虛擬的),完成數(shù)據(jù)的映射平衡 凡是投影到node1-1,node1-2的key,都會中真實(shí)存儲在node1中 所以虛擬節(jié)點(diǎn)越多平衡性越好
  • 補(bǔ)充:

  • 數(shù)據(jù)庫緩存
  • hash特性
  • 自己查去吧 哈哈
  • 總結(jié)

    以上是生活随笔為你收集整理的大数据 互联网架构阶段 Redis的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。