分散式系統架構——Redis快取的安裝和使用
Redis是一個開源的使用ANSI C語言編寫、支援網路、可基於記憶體亦可持久化的日誌型、Key-Value資料庫,並提供多種語言的API。從2010年3月15日起,Redis的開發工作由VMware主持。
一、Redis的單機版
1.1 安裝步驟
- 安裝gcc編譯環境
sudo apt-get install gcc
- 把redis上傳到伺服器
可以使用SecureCRT上傳 - 解壓縮
tar -zxvf redis-3.2.0.tar.gz
- make
cd redis-3.2.0
make
- 安裝
make install PREFIX=/home/muxiaocao/redis-3.2.0
這時候在redis根目錄下就會出現一個bin資料夾,裡面就是編譯好的一些可執行檔案
1.2 啟動redis
兩種啟動方式:前端啟動
`./redis-server`後臺啟動
- 複製redis.conf到redis的bin目錄下
cd /home/muxiaocao/redis-3.2.0
cp redis.conf bin
- 修改bin目錄下的redis.conf中的daemonize yes和bing
vim redis.conf
bind 192.168.3.111
注意:這裡的bind是需要繫結自己的ip而不是訪問這的ip。
bind localhost 只能本機訪問,區域網內計算機不能訪問
bind 區域網IP 只能區域網內IP的機器訪問, 本地localhost都無法訪問. - 啟動:
./redis-server redis.conf
./redis-server redis.conf
- 檢視程序:
ps aux|grep redis
1.3 命令列客戶端
`redis-cli -p 埠 -h ip地址 連結叢集時使用此引數`預設埠是6379,ip預設是localhost
1.4 Redis Desktop Manager客戶端
![這裡寫圖片描述](https://img-blog.csdn.net/20160604223112307)Redis Desktop Manager是redis的影象介面
二、Redis叢集
2.1 架構
![這裡寫圖片描述](https://img-blog.csdn.net/20160605151323570) **架構細節:**- 所有的redis節點彼此互聯(PING-PONG機制),內部使用二進位制協議優化傳輸速度和頻寬.
- 節點的fail是通過叢集中超過半數的節點檢測失效時才生效.
- 客戶端與redis節點直連,不需要中間proxy層.客戶端不需要連線叢集所有節點,連線叢集中任何一個可用節點即可
- redis-cluster把所有的物理節點對映到[0-16383]slot上,cluster 負責維護node<->slot<->value
Redis 叢集中內建了 16384 個雜湊槽,當需要在 Redis 叢集中放置一個 key-value 時,redis 先對 key 使用 crc16 演算法算出一個結果,然後把結果對 16384 求餘數,這樣每個 key 都會對應一個編號在 0-16383 之間的雜湊槽,redis 會根據節點數量大致均等的將雜湊槽對映到不同的節點
2.2 叢集搭建
叢集中應該至少有三個節點,每個節點有一備份節點。需要6臺伺服器。
所以搭建偽分散式,需要6個redis例項。
步驟1:
第一步:建立6個redis例項指定埠從7001到7006
第二步:修改redis.conf 開啟Cluster-enable yes前面的註釋。
第三步:需要一個ruby指令碼。在redis原始碼資料夾下的src目錄下。redis-trib.rb第四步:把redis-trib.rb檔案複製到到redis-cluster目錄下。
第五步:執行ruby指令碼之前,需要安裝ruby環境:
1. sudo apt-get install ruby 2.2.2
檢視ruby版本:ruby -version
如果小於2.2.2,則需要手動下載較高版本步驟如下:
1. wget http://cache.ruby-lang.org/pub/ruby/2.2/ruby-2.2.2.tar.gz
2. tar -xvf ruby-2.2.2.tar.gz
3. ./configure --prefix=/home/muxiaocao/redis/ruby-2.2.2
4. make && make install
5. gem install redis
2. sudo apt-get install gems
3. gem install rubygems-update
4. 安裝redis-trib.rb執行依賴的ruby的包。sudo gem install redis-3.2.1.gem
第六步:啟動所有的redis例項
1. 建立指令碼vim start-all.sh寫入:
2. 賦予執行許可權chmod +x start-all.sh
3. 執行./start-all
第七步:使用redis-trib.rb建立叢集。
./redis-trib.rb create –replicas 1 192.168.3.111:7001 192.168.3.111:7002 192.168.3.111:7003 192.168.3.111:7004 192.168.3.111:7005 192.168.3.111:7006
注意:如果出現以下情況,是需要重新安裝redis
成功結果:
在看視覺化介面:
如果想了解redis的更多命令,可點選這裡
三、Redis的java客戶端使用
Redis的java客戶端需要使用Jedis,我們可以使用maven依賴:
<!-- Redis客戶端 -->
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>${jedis.version}</version>
</dependency>
3.1 單機版
// 單機版測試
@Test
public void testJedisSingle() throws Exception {
Jedis jedis = new Jedis("192.168.3.111", 6379);
jedis.set("test", "hello jedis");
String result = jedis.get("test");
System.out.println(result);
jedis.close();
}
3.2 連線池版
// 使用連線池
@Test
public void testJedisPool() throws Exception {
// 建立一個連線池物件
// 在系統中應該是單例的
JedisPool jedisPool = new JedisPool("192.168.3.111", 6379);
Jedis jedis = jedisPool.getResource();
String string = jedis.get("test");
System.out.println(string);
// 使用完jedis必須關閉
jedis.close();
// 當系統關閉時,關閉連線池
jedisPool.close();
}
3.3 叢集版
// 叢集版測試
@Test
public void testJedisCluster() throws Exception {
Set<HostAndPort> nodes = new HashSet<>();
nodes.add(new HostAndPort("192.168.3.111", 7001));
nodes.add(new HostAndPort("192.168.3.111", 7002));
nodes.add(new HostAndPort("192.168.3.111", 7003));
nodes.add(new HostAndPort("192.168.3.111", 7004));
nodes.add(new HostAndPort("192.168.3.111", 7005));
nodes.add(new HostAndPort("192.168.3.111", 7006));
// 在系統中是單例的
JedisCluster jedisCluster = new JedisCluster(nodes);
jedisCluster.set("name", "張三");
jedisCluster.set("value", "1000");
String name = jedisCluster.get("name");
String value = jedisCluster.get("value");
System.out.println(name + "," + value);
// 在系統關閉時關閉
jedisCluster.close();
}
3.4 Spring結合版
第一步:定義介面
package com.taotao.rest.service;
/**
* <p>Description:Dubbo快取服務提供者介面</p>
* <p>JedisClient.java</P>
* <p>個人主頁:www.muxiaocao.cn/me </p>
* @author 木小草
* @date: 2016年6月4日 下午8:15:07
* @version: 1.0
*/
public interface JedisClientService {
public String set(String key,String value);
public String get(String key);
public Long hset(String key,String item,String value);
public String hget(String key,String item);
public Long incr(String key);
public Long decr(String key);
// 設定有效時間
public Long expire(String key,int second);
// 返回有效時間:-1:永久儲存 -2:已經失效 大於0:有效時間(單位s)
public Long ttl(String key);
}
第二步:介面實現
單機版實現:
叢集版實現:
第三步:配置檔案
<!-- ======================Redis快取=========================== -->
<!-- 配置redis客戶端單機版 -->
<bean id="jedisPool" class="redis.clients.jedis.JedisPool">
<constructor-arg name="host" value="192.168.3.111"></constructor-arg>
<constructor-arg name="port" value="6379"></constructor-arg>
</bean>
<!-- 配置redis客戶端實現類 -->
<bean id="jedisClientService" class="com.taotao.rest.service.impl.JedisClientSingle"/>
<!-- 配置redis客戶端叢集版 -->
<!-- <bean id="jedisCluster" class="redis.clients.jedis.JedisCluster">
<constructor-arg>
<set>
<bean class="redis.clients.jedis.HostAndPort">
<constructor-arg name="host" value="192.168.3.111"></constructor-arg>
<constructor-arg name="port" value="7001"></constructor-arg>
</bean>
<bean class="redis.clients.jedis.HostAndPort">
<constructor-arg name="host" value="192.168.3.111"></constructor-arg>
<constructor-arg name="port" value="7002"></constructor-arg>
</bean>
<bean class="redis.clients.jedis.HostAndPort">
<constructor-arg name="host" value="192.168.3.111"></constructor-arg>
<constructor-arg name="port" value="7003"></constructor-arg>
</bean>
<bean class="redis.clients.jedis.HostAndPort">
<constructor-arg name="host" value="192.168.3.111"></constructor-arg>
<constructor-arg name="port" value="7004"></constructor-arg>
</bean>
<bean class="redis.clients.jedis.HostAndPort">
<constructor-arg name="host" value="192.168.3.111"></constructor-arg>
<constructor-arg name="port" value="7005"></constructor-arg>
</bean>
<bean class="redis.clients.jedis.HostAndPort">
<constructor-arg name="host" value="192.168.3.111"></constructor-arg>
<constructor-arg name="port" value="7006"></constructor-arg>
</bean>
</set>
</constructor-arg>
</bean>
<bean id="jedisClientService" class="com.taotao.rest.service.impl.JedisClientCluster"/> -->
注意:轉載請標明,轉自itboy-木小草。
尊重原創,尊重技術。