Redis緩存以及Redis集群的簡單使用

来源:http://www.cnblogs.com/0nise/archive/2017/01/20/6323650.html
-Advertisement-
Play Games

Redis簡介 Redis是用C語言開發的一個開源的高性能鍵值對(key-value)資料庫。它通過提供多種鍵值數據類型來適應不同場景下的存儲需求,目前為止Redis支持的鍵值數據類型如 下: 字元串類型(String) 哈希類型(hash) 列表類型(list) 集合類型(set) 有序集合類型( ...


Redis簡介

Redis是用C語言開發的一個開源的高性能鍵值對(key-value)資料庫。它通過提供多種鍵值數據類型來適應不同場景下的存儲需求,目前為止Redis支持的鍵值數據類型如

下:

字元串類型(String)

哈希類型(hash)

列表類型(list)

集合類型(set)

有序集合類型(zset)(sorted set)

作用:

1、可以減輕資料庫伺服器壓力。

2、提高性能

 

1、應用場景:

緩存(數據查詢、短連接、新聞內容、商品內容等等)。(最多使用)

分散式集群架構中的session分離。

聊天室的線上好友列表。

任務隊列。(秒殺、搶購、12306等等)

應用排行榜。

網站訪問統計。

數據過期處理(可以精確到毫秒)

Redis持久化方案

rdb:快照形式,將當前的狀態保存起來,隔斷時間修改

aof:命令行形式,將命令存入到aof文件裡面,一秒保存數據。對數據安全性比較高,西歐馬性能比較差。

預設開啟rdb模式。

2Redis資料庫

 

 

數量:16

預設使用資料庫:db0

設置Redis鏈接密碼

 

允許本地區域網連接

 

Redis搭建

1、安裝c語言編譯器gcc

 

[root@localhost Desktop]# yum install gcc-c++

 

2、下載(上傳)redis的源代碼

2.1、解壓

 

[root@localhost Desktop]# tar -zxvf redis-3.0.0.tar.gz

 

3、編譯

 

[root@localhost Desktop]# cd redis-3.0.0

 

[root@localhost redis-3.0.0]# make

4、安裝

進入編譯目錄

 

[root@localhost Desktop]# cd src

 

編譯安裝

 

[root@localhost src]# make install PREFIX=/usr/local/redis

 

PREFIX指定安裝路徑

3.4.3Redis啟動

1、前段啟動模式

 

[root@localhost src]# cd /usr/local/redis/bin
[root@localhost bin]# ./redis-server

預設啟動埠號為6379

後端啟動模式

A、從redis的源碼目錄中複製redis.confredis的安裝目錄。

 

[root@localhost redis-3.0.0]# cp redis.conf /usr/local/redis/bin/

 

B、修改redis.conf配置文件

 

[root@localhost redis-3.0.0]# cd /usr/local/redis/bin/
[root@localhost redis-3.0.0]# vim redis.conf

 

 

C、啟動

 

[root@localhost bin]# ./redis-server redis.conf

 

3.4.4、查詢Redis進程

 

[root@localhost bin]# ps aux|grep redis

 

3.4.5、關閉Redis進程

 

[root@localhost bin]# ./redis-cli -p 6379 shutdown

3.4.6Redis基本命令

 

[root@localhost bin]# ./redis-cli
127.0.0.1:6379> set a 10
OK
127.0.0.1:6379> get a
"10"
127.0.0.1:6379> incr a
(integer)11
127.0.0.1:6379> decr a
(integer)10
127.0.0.1:6379> del a
(integer)1
127.0.0.1:6379> keys 
(empty list or set)

 

 

Redis緩存集群

集群原理

redis-cluster架構圖

 

架構細節:

(1)所有的redis節點彼此互聯(PING-PONG機制),內部使用二進位協議優化傳輸速度和帶寬.

(2)節點的fail是通過集群中超過半數的節點檢測失效時才生效.

(3)客戶端與redis節點直連,不需要中間proxy.客戶端不需要連接集群所有節點,連接集群中任何一個可用節點即可

(4)redis-cluster把所有的物理節點映射到[0-16383]slot,cluster 負責維護node<->slot<->value

Redis 集群中內置了 16384 個哈希槽,當需要在 Redis 集群中放置一個 key-value 時,redis 先對 key 使用 crc16 演算法算出一個結果,然後把結果對 16384 求餘數,這樣每個 key 都會對應一個編號在 0-16383 之間的哈希槽,redis 會根據節點數量大致均等的將哈希槽映射到不同的節點

redis-cluster投票:容錯

 

(1)領著投票過程是集群中所有master參與,如果半數以上master節點與master節點通信超過(cluster-node-timeout),認為當前master節點掛掉.

(2):什麼時候整個集群不可用(cluster_state:fail)? 

    a:如果集群任意master掛掉,且當前master沒有slave.集群進入fail狀態,也可以理解成集群的slot映射[0-16383]不完成時進入fail狀態. ps : redis-3.0.0.rc1加入cluster-require-full-coverage參數,預設關閉,打開集群相容部分失敗.

    b:如果集群超過半數以上master掛掉,無論是否有slave集群進入fail狀態.

  ps:當集群不可用時,所有對集群的操作做都不可用,收到((error) CLUSTERDOWN The cluster is down)錯誤

集群環境搭建

Ruby是一種面向對象的編程語言,20世紀90年代日本人開發。

搭建集群需要使用到官方提供的ruby腳本。

需要安裝ruby的環境。小編使用的是6台虛擬機搭建的Redis集群

1安裝ruby

 

[root@localhost Desktop] yum install ruby
[root@localhost Desktop] yum install rubygems

2、redis集群管理工具

 

[root@localhost Desktop]# cd redis-3.0.0/src/
[root@localhost src]# ll *.rb
-rwxrwxr-x. 1 root root 48141 Apr  1  2015 redis-trib.rb

 

3、安裝rubyredis的介面程式

將redis-3.0.0.gem上傳的到linux伺服器

安裝ruby

 

[root@localhost Desktop]# gem install redis-3.0.0.gem

 

集群搭建

1.、在/usr/local下創建redis-cluster文件夾

 

[root@localhost ]# cd /usr/local
[root@localhost local]# mkdir redis-cluster
[root@localhost redis]# cd redis/

 

2、將redis目錄下的bin目錄拷貝到/redis-cluster/redis文件下

 

[root@localhost redis]# cp -r bin ../redis-cluster/redis
[root@localhost redis]# cd ../redis-cluster/
[root@localhost redis-cluster]# ll
total 4
drwxr-xr-x. 2 root root 4096 Dec 21 20:04 redis
[root@localhost redis-cluster]# cd redis/
[root@localhost redis-cluster]# rm -f dump.rdb

 

3、修改redis-conf文件

 cluster-enabled yes這行取消註釋,開啟redis_cluster

 

進入redis源代碼拷貝redis-trib.rb/usr/local/redis-cluster/目錄下

 

[root@localhost src]cp redis-trib.rb /usr/local/redis-cluster/

 

配置其他redis伺服器略

 

[root@localhost src] ./redis-server redis.conf

 

4、創建集群

 

[root@localhost redis-cluster]# ./redis-trib.rb  create  --replicas  1  192.168.0.184:6379 192.168.0.109:6379  192.168.0.110:6379 192.168.0.114:6379  192.168.0.113:6379  192.168.0.102:6379
>>> Creating cluster
Connecting to node 192.168.0.184:6379: OK
Connecting to node 192.168.0.109:6379: OK
Connecting to node 192.168.0.110:6379: OK
Connecting to node 192.168.0.114:6379: OK
Connecting to node 192.168.0.113:6379: OK
Connecting to node 192.168.0.102:6379: OK
>>> Performing hash slots allocation on 6 nodes...
Using 3 masters:
192.168.0.102:6379
192.168.0.109:6379
192.168.0.184:6379
Adding replica 192.168.0.113:6379 to 192.168.0.102:6379
Adding replica 192.168.0.114:6379 to 192.168.0.109:6379
Adding replica 192.168.0.110:6379 to 192.168.0.184:6379
M: 347129817247251ab9b89b6b985ce4193f68269f 192.168.0.184:6379
   slots:10923-16383 (5461 slots) master
M: 202807bf910b0fe350f7a990d84671120e4e7b9f 192.168.0.109:6379
   slots:5461-10922 (5462 slots) master
S: fd0bc6dca63e917298e697a1e0ccd90be3bedf5a 192.168.0.110:6379
   replicates 347129817247251ab9b89b6b985ce4193f68269f
S: 9b9affc04e7052c3be2c75fafb4561fea5abb3bc 192.168.0.114:6379
   replicates 202807bf910b0fe350f7a990d84671120e4e7b9f
S: 4beac51798f3790d0f59d967df713459a4bfc8bf 192.168.0.113:6379
   replicates 27b8a3175ce59f4d62e4894b5abe57c64ef3e860
M: 27b8a3175ce59f4d62e4894b5abe57c64ef3e860 192.168.0.102:6379
   slots:0-5460 (5461 slots) master
Can I set the above configuration? (type 'yes' to accept): yes
>>> Nodes configuration updated
>>> Assign a different config epoch to each node
>>> Sending CLUSTER MEET messages to join the cluster
Waiting for the cluster to join.....
>>> Performing Cluster Check (using node 192.168.0.184:6379)
M: 347129817247251ab9b89b6b985ce4193f68269f 192.168.0.184:6379
   slots:10923-16383 (5461 slots) master
M: 202807bf910b0fe350f7a990d84671120e4e7b9f 192.168.0.109:6379
   slots:5461-10922 (5462 slots) master
M: fd0bc6dca63e917298e697a1e0ccd90be3bedf5a 192.168.0.110:6379
   slots: (0 slots) master
   replicates 347129817247251ab9b89b6b985ce4193f68269f
M: 9b9affc04e7052c3be2c75fafb4561fea5abb3bc 192.168.0.114:6379
   slots: (0 slots) master
   replicates 202807bf910b0fe350f7a990d84671120e4e7b9f
M: 4beac51798f3790d0f59d967df713459a4bfc8bf 192.168.0.113:6379
   slots: (0 slots) master
   replicates 27b8a3175ce59f4d62e4894b5abe57c64ef3e860
M: 27b8a3175ce59f4d62e4894b5abe57c64ef3e860 192.168.0.102:6379
   slots:0-5460 (5461 slots) master
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.

 

 

 

4、測試Redis緩存集群

./redis-cli -h 集群節點ip地址 -p 埠號 -c(代表連接集群)

 

[root@localhost redis]# ./redis-cli -h 192.168.0.109 -p 6379 -c
192.168.0.109:6379> ping
PONG
192.168.0.109:6379>

 

Redis圖形化操作

1、Redis Desktop Manager

 

只能連接單機版,不能連接集群。

2、Jedis客戶端

2.1、單機版

1、需要將jedisjar包添加到工程中,如果是maven需要添加jar包的坐標

 

<!-- Redis客戶端 --><dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
</dependency>

 

2、單機版測試

 

public static void main(String[] args) {
//創建jedis對象
Jedis jedis = new Jedis("192.168.1.101",6379);
//設置redis連接密碼
jedis.auth("woo0nise");
//調用jedis對象的方法,方法功能變數名稱和redis的命令一致
jedis.set("b", "Redis Test");
String b = jedis.get("b");
System.out.println(b);
//關閉jedis
jedis.close();
}

 

 

3、Jedis連接池

 

@Test
public void testJedisPool(){
//設置連接池的配置信息
JedisPoolConfig config = new JedisPoolConfig();
    //最大空閑連接數, 應用自己評估,不要超過AliCloudDB for Redis每個實例最大的連接數
    config.setMaxIdle(200);
    //最大連接數, 應用自己評估,不要超過AliCloudDB for Redis每個實例最大的連接數
    config.setMaxTotal(300);
    config.setTestOnBorrow(false);
    config.setTestOnReturn(false);
    String host = "192.168.1.101";
    String password = "woo0nise";
    //創建連接池
    JedisPool pool = new JedisPool(config, host, 6379, 3000, password);
//從連接池獲取連接對象
    Jedis jedis =  pool.getResource();
System.out.println("a:"+jedis.get("a"));
System.out.println("b:"+jedis.get("b"));
jedis.close();
pool.close();
}

 

2.2、集群

1、需要設置許可權(我設置的為本地區域網全部可以訪問該Redis集群)

 

@Test
public void jedisCluster(){
//集群節點集合
Set<HostAndPort> nodes = new HashSet<HostAndPort>();
nodes.add(new HostAndPort("192.168.1.101",6379));
nodes.add(new HostAndPort("192.168.1.105",6379));
nodes.add(new HostAndPort("192.168.1.102",6379));
nodes.add(new HostAndPort("192.168.1.106",6379));
nodes.add(new HostAndPort("192.168.1.107",6379));
nodes.add(new HostAndPort("192.168.1.104",6379));
//創建集群
JedisCluster cluster = new JedisCluster(nodes);
cluster.set("test", "ok");
String data = cluster.get("test");
System.out.println(data);
cluster.close();
}

 

集群自帶連接池

3.7Spring整合Jedis

3.7.1Spring整合Jedis(單機版)

applicationContext-jedis.xml

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <beans xmlns="http://www.springframework.org/schema/beans"
 3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 4 xsi:schemaLocation="http://www.springframework.org/schema/beans
 5  http://www.springframework.org/schema/beans/spring-beans.xsd">
 6  
 7 <!-- 連接池配置,可有可無 -->
 8 <bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig">
 9 <!-- 最大連接數 -->
10 <property name="maxTotal" value="30" />
11 <!-- 最大空閑連接數 -->
12 <property name="maxIdle" value="10" />
13 <!-- 每次釋放連接的最大數目 -->
14 <property name="numTestsPerEvictionRun" value="1024" />
15 <!-- 釋放連接的掃描間隔(毫秒) -->
16 <property name="timeBetweenEvictionRunsMillis" value="30000" />
17 <!-- 連接最小空閑時間 -->
18 <property name="minEvictableIdleTimeMillis" value="1800000" />
19 <!-- 連接空閑多久後釋放, 當空閑時間>該值 且 空閑連接>最大空閑連接數 時直接釋放 -->
20 <property name="softMinEvictableIdleTimeMillis" value="10000" />
21 <!-- 獲取連接時的最大等待毫秒數,小於零:阻塞不確定的時間,預設-1 -->
22 <property name="maxWaitMillis" value="1500" />
23 <!-- 在獲取連接的時候檢查有效性, 預設false -->
24 <property name="testOnBorrow" value="true" />
25 <!-- 在空閑時檢查有效性, 預設false -->
26 <property name="testWhileIdle" value="true" />
27 <!-- 連接耗盡時是否阻塞, false報異常,ture阻塞直到超時, 預設true -->
28 <property name="blockWhenExhausted" value="false" />
29 </bean>
30 <!-- 配置單機版jedis(連接池) -->
31 <bean id="jedisPool" class="redis.clients.jedis.JedisPool" >
32 <constructor-arg name="host" value="192.168.1.101" ></constructor-arg>
33 <constructor-arg name="port" value="6379" ></constructor-arg>
34 <constructor-arg name="poolConfig" ref="jedisPoolConfig" ></constructor-arg>
35 </bean>
36  
37 </beans>
applicationContext-jedis.xml

測試連接

 

@Test
public void JedisTest(){
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("classpath:/spring/applicationContext-*.xml");
JedisPool jedisPool = (JedisPool)applicationContext.getBean("jedisPool");
Jedis jedis = jedisPool.getResource();
jedis.set("a", "100");
String a = jedis.get("a");
System.out.println(a);
jedis.close();
jedisPool.close();
}

 

3.7.2Spring整合Jedis(集群版本)

 1 <!-- 配置集群版jedis -->
 2 <bean id="jedisCluster"  class="redis.clients.jedis.JedisCluster" >
 3 <constructor-arg name="nodes" >
 4 <set>
 5  <bean class="redis.clients.jedis.HostAndPort" >
 6   <constructor-arg name="host" value="192.168.1.101" ></constructor-arg>
 7   <constructor-arg name="port" value="6379" ></constructor-arg>
 8  </bean>
 9  <bean class="redis.clients.jedis.HostAndPort" >
10   <constructor-arg name="host" value="192.168.1.111" ></constructor-arg>
11   <constructor-arg name="port" value="6379" ></constructor-arg>
12  </bean>
13 <bean class="redis.clients.jedis.HostAndPort" >
14   <constructor-arg name="host" value="192.168.1.112" ></constructor-arg>
15   <constructor-arg name="port" value="6379" ></constructor-arg>
16  </bean>
17  <bean class="redis.clients.jedis.HostAndPort" >
18   <constructor-arg name="host" value="192.168.1.113" ></constructor-arg>
19   <constructor-arg name="port" value="6379" ></constructor-arg>
20  </bean>
21  <bean class="redis.clients.jedis.HostAndPort" >
22   <constructor-arg name="host" value="192.168.1.114" ></constructor-arg>
23   <constructor-arg name="port" value="6379" ></constructor-arg>
24  </bean>
25  <bean class="redis.clients.jedis.HostAndPort" >
26   <constructor-arg name="host" value="192.168.1.115" ></constructor-arg>
27   <constructor-arg name="port" value="6379" ></constructor-arg>
28  </bean>
29 </set>
30 </constructor-arg>
31 </bean>
applicationContext-jedis.xml

測試連接

 

@Test
public void jedisCluster(){
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("classpath:/spring/applicationContext-*.xml");
JedisCluster jedisCluster = (JedisCluster)applicationContext.getBean("jedisCluster");
jedisCluster.set("a", "100");
String a = jedisCluster.get("a");
System.out.println(a);
jedisCluster.close();
}

 


 

原創作品,侵權必究!
Email:[email protected]
交流QQ群:193306983

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 博客也開了挺長時間了,一直都沒有來寫博客,主要原因是自己懶~~~此篇博客算是給2017年一個好的開始,同時也給2016年畫上一個句點,不留遺憾。 那就讓我們正式進入今天的主題:貝塞爾曲線。 首先,讓我們來瞭解下什麼是貝塞爾曲線。 貝塞爾曲線(Bézier curve),又稱貝茲曲線或貝濟埃曲線,是應 ...
  • /*可以更改列的大小,只要將滑鼠指針懸停到該列標題的右邊界,再單擊並拖動該列邊界到合適的位置。雙擊右邊界使得該列自動調整大小如果選擇幾個單元,然後將其剪切並複製到其他網格,則這幾個單元可作為單獨的單元處理(如果選擇"以文本格式顯示結果"選項,剪切的數據會全部粘帖到一個單元格中)可以從多行只選擇一列或 ...
  • Java代碼 Java代碼 關註流行國外網站 facebook:http://www.fb-on.com facebook官網:http://www.facebookzh.com facebook:http://www.cn-face-book.com youtube:http://www.yout ...
  • AlwaysOn是在SQL Server 2012中新引入的一種高可用技術,從名稱中可以看出,AlwaysOn的設計目標是保持資料庫系統永遠可用。AlwaysOn利用了Windows伺服器故障轉移集群(Windows Server Failover Clustering,簡稱WSFC)的健康檢測和自 ...
  • /*僅返回一個結果集,且該結果只有很窄的幾列想要以單個文本文件來保存返回結果返回多個結果集,但該結果比較小,且不需要使用多個滾動條就可以在同一頁面上查看多個結果集。*/ ...
  • 一、前言 今天天氣很好,大晴天,心情也好好的。就將MySQL常用的語句總結一下,記錄在隨筆里,也順便分享分享。日後,這篇隨筆我將會持續更新,作為我自己的MySQL語句大全。 二、常用SQL語句 我將由外到里進行編寫(資料庫到表再到數據) 庫層: 1、SHOW DATABASES; 2、CREATE ...
  • 這是一本書的名字,叫做【Hadoop大數據分析與挖掘實戰】,我從2017.1開始學習 軟體版本為Centos6.4 64bit,VMware,Hadoop2.6.0,JDK1.7. 但是這本書的出版時間為2016.1,待到我2017.1使用時,一部分內容已經發生了翻天覆地的變化。 於是我開始寫這麼一... ...
  • pyspark 包介紹 子包 pyspark.sql module pyspark.streaming module pyspark.ml package pyspark.mllib package 子包 pyspark.sql module pyspark.streaming module pys ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...