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模式。
2、Redis資料庫
數量: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.3、Redis啟動
1、前段啟動模式
[root@localhost src]# cd /usr/local/redis/bin
[root@localhost bin]# ./redis-server
預設啟動埠號為6379埠
後端啟動模式
A、從redis的源碼目錄中複製redis.conf到redis的安裝目錄。
[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.6、Redis基本命令
[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、安裝ruby和redis的介面程式
將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、需要將jedis的jar包添加到工程中,如果是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.7、Spring整合Jedis
3.7.1、Spring整合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.2、Spring整合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