1. 程式人生 > >redis快取以及叢集詳解

redis快取以及叢集詳解

  1. redis的安裝以及啟動
  • windows環境
  1. 到官網下載zip的安裝包
  2. 如果不安裝redis服務就需要啟動redis-service.exe可執行檔案
  3. 如果不想每次啟動就安裝redis服務
  4. 安裝 :redis-server --service-install --service-name redis2 (redis2是服務的名稱)
  5. 安裝並指定日誌級別: redis-server --service-install redis.windows.conf --service-name redis3 --loglevel verbose(指定配置檔案,日誌級別)
  6. 安裝並指定埠:redis-server --service-install –service-name redisService1 –port 10001
  7. 解除安裝:redis-server --service-uninstall --service-name redis2
  8. 啟動 :redis-server --service-start --service-name redis2 也可以到service.msc中滑鼠操作
  • linux環境
  1. http://www.redis.io/下載tar.gz安裝包 ,或是線上安裝$ wget
    http://download.redis.io/releases/redis-2.8.3.tar.gz
  2. 解壓 tar xzf redis-2.8.3.tar.gz
  3. 到解壓的名錄下使用 make命令實現編譯
  4. 編譯完成到安裝目錄下src目錄下使用 make install命令安裝檔案
  5. 可以把redis配置檔案和可執行檔案(redis-service、redis-cli)放到比較上層的目錄,這樣就不需要每次都切換目錄了。
  6. 把redis配置文(redis.conf)中 daemonize 設定成yes,實現後臺啟動redis;修改資料檔案儲存路勁;
  7. 檢視redis埠 ps -ef|grep 6379
  8. 退出redis服務 pkill redis-server ;kill 程序號 ; 路徑/redis-cli shutdown(後臺啟動)/ 前置啟動就直接ctrl+c
  1. redis資料型別命令使用詳解
  • String
  set  name   value     設定值,多次設定會覆蓋 
  get  name              根據name獲得value
  del  name           刪除值
  setnx (設定值的時候有返回0,設定失敗) 設定返回1,設定成功
  setex    (設定時間)   set  name 10 value
  setrange (從第幾個位置開始設定值,0開始,並返回長度)
  mset   name value  name2  value2 (批量設定值)  
  mget   name  name1 name2
  incr /decr   age   (對age進行遞增或遞減,返回執行結果的值)
  incrby /decby  age  [步長](對age增加或減少多少,返回執行1結果的值)
  append  name value  (給name追加value,並返回長度)
  • Hash
 適合儲存物件(hset user id 1、hset user name pwade、hset user age 20)此時user就相當於一個物件
 hset  myhash  name value    hget myhash name
 hincr /hdecr  遞增遞減
 hexists 判斷key是否存在,有返回1無返回0
 hlen 返回 hash裡所有的鍵值
 hdel hash name 刪除
 hkeys  myhash 得到所有欄位
 hmget myhash  name name1 name2 (redis屬性名)
 hvals   得到所有value
 hgetall   得到欄位和value
  • List
    list 是一個連結串列結構集合,其主要功能就是push和pop,list型別是雙端連結串列的結構,可以在頭部或尾部操作資料,既可以做棧,又可以做佇列 
    lpush  從頭部新增元素,先進後出(棧)
    rpush  從尾部新增元素  ,先進先出(佇列)  
    flushdb 清空資料庫 
    lrange list 0 -1 查詢list中所有資料 
    linsert 插入元素  
    lrem list 下標位置     返回移除的個數 
    lpop 從頭部刪除元素,並返回刪除元素  
    rpop 從尾部刪除元素,並返回刪除元素  
    rpoplpush 尾部刪除資料,從頭部新增資料
    lindex list 1 返回下邊為1的元素值 
    llen list  返回元素個數
  • Set 、Zset
set和String的無序集合,是通過hashtable實現的
sadd set1 aaa  新增資料
smembers set1  檢視set1裡面的資料
srem set1  刪除
spop 隨機返回刪除的key
sdiff  返回兩個集合不同的元素
sdiffstore  返回兩個集合不同的元素,儲存到set3集合裡面、
sinter 取交集
sunion 取並集
smove 將一個集合移動但另外一個集合
scard 檢視集合裡面的元素個數
sismember 是否為集合中的元素,是返回1,否返回0
zadd zset1 5 aaa  向有序集合set1新增一個aa元素,位置下標在5
zrange  zset1 0 -1 withscores
zrem zset1  key 刪除元素
zincrby 元素遞增或遞減
zrangebyscore  返回指定區間內的資料
zremrangebyrank  只刪除索引
zremrangebyscore  刪除指定序號
zrank  根據從小到 排序
  1. 高階命令
exists key  key是否存在
keys  name*  模糊查詢
expire name  time 設定過期時間   ttl name 檢視過期時間
persist name 取消過期時間
select   選擇資料庫(0-15)  select 0
move name [資料庫下標] 移動資料到其他資料庫
rname name name1 修改name為name1
echo 列印資訊
dbsize 資料數量
info   redis資料庫資訊
config get *    config配置檔案
flushdb  清除當前資料庫 
flushall 清除所有資料庫
monitor       #實時監控
quit           退出連線
  1. redis安全性
設定密碼:
auth 密碼 /自啟動redis-cli時 加上 -a 密碼 

退出redis服務:
netstat -tunpl |grep redis     
kill  程序號    redis-cli shutdown
  1. 主從複製

目的::主要實現讀寫分離
實現 :在從伺服器配置檔案中新增主伺服器的IP以及埠號

master可以擁有多個slave,slave還可以連線其他slave
scp  -r   檔名  ip  遠端檔案copy
slaveof 192.168.15.130  6379  
主伺服器讀寫都可以,從伺服器主能讀
  1. redis事務

multi :開啟事物
exec:執行

multi 開啟事物,所有操作多在佇列中。若執行中有一個個錯誤,其中有一個操作錯誤,但是這個操作不影響其它操作的,也就是說只有它操作失敗,其它是操作成功。

執行exec,將佇列中的操作都執行
  1. redis持久化

snapshotting 快照方式

   snapshotting 快照的方式將資料寫入二進位制檔案中,預設是dump.rdb,這是預設方式 
   snapshotting設定格: save 900  1 在900秒內如果有一個key發生了改變,則發起快照儲存

append-only 模式(跟oracle日誌一樣的),啟開appendonly yes註解,啟動aof模式

     appendfsync always  //收到命令就寫入磁碟,速度慢
     appendfsync everysec  //每秒鐘寫入
     appendfsync  no  //完全依賴os,效能最好,持久化沒保障

選擇:由於snapshotting是一定時間儲存資料,可能會導致資料丟失,所以一般都是使用aop方式 always儲存。

  1. redis釋出和訂閱

操作流程:現在監聽的視窗輸入 subscribe 需要監聽頻道----》在需要釋出的視窗使用publish 內容釋出的頻道 內容

subscribe  【頻道】訂閱、監聽
publish    【頻道】【釋出內容】進行釋出訊息廣播
  1. redis使用JavaApi

分片概念:3.0以前使用分片,3.0後使用叢集 將資料分為固定的多個槽,根據下標取資料

jedis使用:jedis操作redis和命令操作redis是一致的

redis篩選: 多種資料型別配合使用

  1. redis叢集

下面修改都是在redis配置檔案中操作

修改redis埠號 (port)
綁定當前伺服器地址 (bind ip),如果沒有設定可能導致執行速度慢
修改資料檔案儲存地址 (dir )
cluster-enabled yes  註釋放開,開啟器群模式
cluster-config-file nodes-7001.conf    與埠對應
cluster-node-timeout 15000 
開啟appendonly 模式
安裝ruby  apt-get install ruby
安裝ruby gems: apt-get install rubygems-integration

解決ruby版本過低:檢視版本 ruby -v

安裝apt-get  install curl 
執行 gpg --keyserver hkp://keys.gnupg.net --recv-keys 409B6B1796C275462A1703113804BB82D39DC0E3 ,
安裝curl -L get.rvm.io | bash -s stable,
source  /etc/profile.d/rvm.sh
rvm list known
rvm autolibs disable(不然安裝報錯404)
rvm install 2.4.1

叢集操作開始

啟動6個例項
檢視redis服務是否啟動  ps -ef|grep redis
安裝redis叢集介面  gem install redis
redis-trib.rb(redis 安裝目錄src下執行) create  --replicas(命令)   主節點數/從節點數 叢集的多個伺服器:埠號

在這裡插入圖片描述

  1. redis叢集瞭解,以及常用命令

叢集節點開啟客戶端:./redis-cli -c -h 【ip】 -p 【埠號】,資料儲存到0-16383中隨機槽,設定值後客戶端自動自動跳轉到槽所在的客戶端。

圖片展示的是主節點上分佈的槽的下標:
     節點7001覆蓋0-5460;
     節點7002覆蓋5461-10922;
     節點7003覆蓋10923-16383.

redis叢集ruby命令:(叢集的IP隨意一個)

./redis-trib.rb create --replicas 建立叢集  
./redis-trib.rb check   【ip:埠】  查詢節點狀態  
./redis-trib.rb add-node 【新節點ip:埠 +  叢集中ip:埠】,新增主節點 ,剛加入的節點是沒有槽的  ,從節點需要在redis-cli客戶端執行cluster replicate  主節點id
./redis-trib.rb info 【ip:埠號】檢視節點資訊  或者是登入cli客戶端檢視  
./redis-trib.rb set-timeout 【ip:埠】設定心跳時間   
./redis-trib.rb reshard  【ip:埠號】-需要操作的節點,新增是:新節點id:埠    刪除:刪除的節點id:埠   
./redis-trib.rb add-node --slave --master-id $[nodeid]   (新建從節點的又一種方式)新節點ip:埠號  叢集ip:埠號
./redis-trib del-node 127.0.0.1:7001 ${node-id}

重新分配槽:

redis-trib.rb reshard 【ip:埠號】
在這裡插入圖片描述
輸入需要分配的槽:4096 ,需要剛加入叢集節點id,ee3efb90e5ac0725f15238a64fc60a18a71205d7
在這裡插入圖片描述
詢問你從哪裡提取雜湊槽:all /節點id
在這裡插入圖片描述
最後輸入:done

  1. 叢集操作JavaApi
// 叢集JavaApi:
Set <HostAndPort> jedisClusterNode=new HashSet<HostAndPort>();
//定義叢集中的
HostAndPort hostAndPort=new HostAndPort (ip,port)
jedisClusterNode.add( hostAndPort);
jedisPoolConfig  cfg=new jedisPoolConfig ();
//設定連線屬性
cfg.setMaxTotal(1000);
//使用
jedisCluster  jc=new  jedisCluster (jedisClusterNode,600,100.cfg);
使用jc操作redis
  1. spring整合redis實現redisTemplate
redisTemplate.opsForValue();//操作字串
redisTemplate.opsForHash();//操作hash
redisTemplate.opsForList();//操作list
redisTemplate.opsForSet();//操作set
redisTemplate.opsForZSet();//操作有序set

redisTemplate快取中資料亂碼:

@Resource
private RedisTemplate redisTemplate; 
@Bean
public RedisTemplate<String, Object> stringSerializerRedisTemplate() {
RedisSerializer<String> = new StringRedisSerializer();
redisTemplate.setKeySerializer(stringSerializer);
redisTemplate.setValueSerializer(stringSerializer);
redisTemplate.setHashKeySerializer(stringSerializer);
redisTemplate.setHashValueSerializer(stringSerializer);
return redisTemplate;
}