大数据 互联网架构阶段 Redis
生活随笔
收集整理的這篇文章主要介紹了
大数据 互联网架构阶段 Redis
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
Redis
零、 目錄
- 高并發思路
- 電商網站中緩存數據庫的設計
- 緩存介紹
- 按照redis
- redis常用命令
- redis其他數據結構
- 數據分布式存儲
- Jedis客戶端
- 哈希一致性
- 補充
一、 高并發思路
二、 電商網站中緩存數據庫如何設計
三、緩存介紹
1. 雪崩(緩存擊穿): 海量用戶訪問請求涌入 , 一旦緩存失效(宕機后緩存數據丟失) , 所有訪問涌入數據庫 , 數據庫無法承受海量的數據的查詢 , 導致數據庫服務器宕機 , 這時重啟數據庫 , 但是請求沒有消失甚至用戶在不斷的刷新(請求瞬間翻倍) , 就發生了數據庫在重啟->宕機->重啟中循環 , 導致整個系統崩潰。
四、 安裝redis
下載安裝包并解壓
下載命令wget "http://bj-yzjd.cn-bj.ufileos.com/redis-3.2.11.tar.gz" 解壓tar -xvf redis-3.2.11.tar.gz進入解壓之后的文件 , 執行安裝
make && make install啟動redis
redis-server則啟動成功
使用redis
使用redis需要啟動redis客戶端
redis-cli如果想在同一個連接中啟動服務和客戶端 , 則啟動redis時可以使redis服務器在后臺運行
redis-server &停止redis服務
在客戶端中
shutdown檢查后臺 運行的 redis
ps -ef|grep redis五、 redis常用命令
六、 redis其他數據結構
七、 數據分布式存儲
八、 Jedis客戶端
在使用之前需要先導入Jedis的jar包
<jedis.version>2.6.0</jedis.version><!-- jedis --> <dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId><version>${jedis.version}</version> </dependency>Jedis示例:
/*** 測試單個結點(單個redis)連接* */@Testpublic void test_01() {//創建Jedis對象 , 并在構造方法中設置redis主機的ip和占用的端口Jedis jedis = new Jedis("106.75.48.3",6379);//使用Jedis進行簡單的操作//存數據jedis.set("name", "tianjie");//取數據String name = jedis.get("name");System.out.println("name="+name);} /*** 模擬數據緩存執行邏輯 , 數據庫的查詢操作* */ @Test public void test_02() {System.out.println("用戶開始查詢數據");//模擬客戶端傳來的參數String name = "name";//創建一個Jedis客戶端Jedis jedis = new Jedis("106.75.48.3" , 6379);//執行邏輯 //1. 先查詢緩存中是否有數據 , 如果有則返回緩存中的數據//2. 如果緩存中沒有數據則去數據庫中查詢數據 , 并且 把查詢到的數據存入緩存中 , 供后續使用 , 返回數據庫中查詢到的信息String gname = jedis.get("name");if(gname != null && !gname.equals("")) {//緩存中有數據System.out.println("從緩存中獲取到的數據為:name = "+gname);}else {//緩存中沒有數據//執行從數據庫查詢數據 略String dbname = "outman";//數據庫查詢到的數據//將查詢到的數據存入緩存中 jedis.set("name", dbname);//返回從數據庫中查到的數據System.out.println("從數據庫獲取到的數據為:name = "+dbname);}//第一次執行結果為從數據庫中獲取//第二次執行結果我從緩存中獲取數據 }自定義分片算法 ,將數據分片存入多個redis實例
/*** 自定義分片計算邏輯* */@Testpublic void test_03() {//模擬需要存儲的數據String k1 = "四十二章經第一章";String v1 = "111111111111111111";String k2 = "四十二章經第二章";String v2 = "222222222222222222";String k3 = "四十二章經第三章";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("四十二章經第一章".equals(key)) {//存入第一個redis結點Jedis jedis = new Jedis("106.75.48.3" , 6379);jedis.set(key, map.get(key));}else if("四十二章經第二章".equals(key)) {//存入第二個redis結點Jedis jedis = new Jedis("106.75.48.3" , 6380);jedis.set(key, map.get(key));}else if("四十二章經第三章".equals(key)) {//存入第三個redis結點Jedis jedis = new Jedis("106.75.48.3" , 6381);jedis.set(key, map.get(key));}}}使用hash取余法將數據分片存儲
/*** 哈希取余分片存儲邏輯* */@Testpublic void test_04() {//模擬需要被存儲的數據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);}//使用哈希取余法分片存儲//定義結點(redis實例)數量int n = 3;for(String key : keyList) {//執行哈希取余 , 哈希結果可能為負數 , 此時需要與Integer的最大數進行與操作Integer num =( key.hashCode()&Integer.MAX_VALUE )%n; if(num == 0) {//存入第一個結點Jedis jedis = new Jedis("106.75.48.3" , 6379);jedis.set(key, map.get(key));jedis.close();}else if(num == 1) {//存入第二個結點Jedis jedis = new Jedis("106.75.48.3" , 6380);jedis.set(key, map.get(key));jedis.close();}else if(num == 2) {//存入第三個結點Jedis jedis = new Jedis("106.75.48.3" , 6381);jedis.set(key, map.get(key));jedis.close();}}//執行結果 100個鍵值對幾乎均勻的 分布存儲在三臺redis實例上}jedis分片 , 使用的hash一致性
/*** Jedis分片 使用哈希一致型完成數據分片存儲(Jedis默認的分片算法)* */@Testpublic void test_05() {//需要構造存儲多個reids實例信息 的listList<JedisShardInfo> jedisList = new ArrayList<JedisShardInfo>();//創建結點信息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保存結點信息jedisList.add(info1);jedisList.add(info2);jedisList.add(info3);//構造一個Jedis分片對象 , 將list闖入構造方法中 , 狗后續分片ShardedJedis jedis = new ShardedJedis(jedisList);//模擬海量數據執行數據分片存儲for( int i= 0 ; i<1000 ; i++) {jedis.set("key_"+i, "value_" + i);}jedis.close();//數據通過哈希一致型算法分片存儲在了多個reids實例中//單數每一個reids的實例的數據量并不是完全平均的 , 會有一定量的數據偏移}jedis池的使用
/*** Jedis池* */@Testpublic void test_06() {//需要構造存儲多個reids實例信息 的listList<JedisShardInfo> jedisList = new ArrayList<JedisShardInfo>();//創建結點信息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保存結點信息jedisList.add(info1);jedisList.add(info2);jedisList.add(info3);//對于連接來將 類似于JDBC連接處可以設置很多參數JedisPoolConfig config = new JedisPoolConfig();//設置最大連接數config.setMaxTotal(200);//創建Jeids連接池ShardedJedisPool pool = new ShardedJedisPool(config, jedisList);//使用連接處獲取數據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);}九、哈希一致性
哈希一致型
解決數據偏移問題
有可能在映射時的各自分布位置并不平均,導致數據偏移量非常大
解決數據的平衡性引入虛擬節點 node1的ip是192.168.40.156 node2的ip是192.168.40.157 各自引入2個虛擬節點(虛擬節點的數量是非常大的) 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) 每一個虛擬節點在哈希環上也會接收順時針尋找最近節點的key們 通過增加節點數量(虛擬的),完成數據的映射平衡 凡是投影到node1-1,node1-2的key,都會中真實存儲在node1中 所以虛擬節點越多平衡性越好補充:
總結
以上是生活随笔為你收集整理的大数据 互联网架构阶段 Redis的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 大数据 互联网架构阶段 电商项目简介
- 下一篇: 大数据互联网架构阶段 Redis(二)