1. Redis基礎
1.1 Redis概述
Redis是一個開源、先進的key-value存儲,並用於構建高性能、可擴展的應用程序的完美解決方案。
Redis從它的許多競爭繼承了三個主要特點:
①Redis數據庫完全在內存中,使用磁盤僅用於持久性;
②相比許多鍵值對數據存儲,Redis擁有一套較為豐富的數據類型;
③Redis可以將數據復制到任意數據量的從服務器;
1.2 Redis優勢
異常快速:Redis的速度非常快,每秒能執行約11萬次set操作,每秒約81000次get操作;
支持豐富的數據類型:Redis支持字符串string、列表list、集合set、有序集合sorted set、散列map數據類型,這使得它非常容易解決各種各樣的問題;
操作都是原子性:所有Redis操作都是原子的;
多功能使用工具:Redis是一個多實用的工具,可用於多種用例,如緩存、消息隊列(Redis原生支持發布/訂閱),應用程序中的任何短期數據,例如:web應用程序中的會話、網頁命中計數等;
原子性(atomicity)說明:一個事務是一個不可分割的最小工作單位,要么都成功要么都失敗。
2. Redis單機安裝部署
2.1 從Redis官網上下載redis源碼包,並通過Xftp5上傳到機器集群上
下載redis-4.0.9.tar.gz 版本,並通過Xftp5上傳到機器集群的第一個節點node1上的/opt/uploads/目錄:
2.2 解壓redis-4.0.9.tar.gz,並把解壓的安裝包移動到/opt/app/目錄上
tar zxvf redis-4.0.9.tar.gz
mv redis-4.0.9.tar.gz /opt/app/ && cd /opt/app/
2.3 編譯Redis源碼
編譯之前的准備工作
進入Redis目錄,cd /opt/app/redis-4.0.9
在該目錄下創建Redis源碼目錄source並把/opt/app/redis-4.0.9目錄下的所有源碼文件移到源碼目錄source下,之后再創建安裝目錄redis
mkdir source
# "|"表示下一個表達式從上一個表達式獲取結果數據
# "grep -v source"表示反向選擇,即找沒有source的行
# "xargs -i mv {} /opt/app/redis-4.0.9/source/"中,xargs表示上一個表達式的結果集合作為該表達式的參數,{}表示遍歷
ls | grep -v source | xargs -i mv {} /opt/app/redis-4.0.9/source/
創建redis安裝目錄
開始編譯
進入redis編譯目錄source,cd /opt/app/redis-4.0.9/source
先安裝gcc,再make編譯
sudo yum install gcc
make
把make編譯后的可執行文件安裝到/opt/app/redis-4.0.9/redis目錄下
make PREFIX=/opt/app/redis-4.0.9/redis install
在redis安裝目錄/opt/app/redis-4.0.9/redis ll查看,可以看到新創建bin目錄
可以看到bin目錄有幾個可執行文件
2.4 修改環境變量(每台機器都要執行),編輯/etc/profile,並生效環境變量,輸入如下命令:
sudo vi /etc/profile
添加如下內容:
export REDIS_HOME=/opt/app/redis-4.0.9/redis
export PATH=:$PATH:$REDIS_HOME/bin
使環境變量生效:source /etc/profile
2.5 Redis部署啟動方式
啟動方式一:Redis前台默認啟動
直接啟動Redis服務
啟動方式二:Redis使用配置文件啟動:
進入Redis的安裝目錄,cd /opt/app/redis-4.0.9/redis
創建conf目錄,並將redis的源碼目錄/opt/app/redis-4.0.9/redis中的redis.conf拷貝到conf目錄里:
cp /opt/app/redis-4.0.9/source/redis.conf /opt/app/redis-4.0.9/redis/conf/
進入conf目錄,修改配置文件redis.conf,有三點需要修改:
①修改屬性 daemonize no -> daemonize yes
②修改生成默認日志文件位置
在redis.conf相應的位置添加 logfile "/opt/app/redis-4.0.9/redis/logs/redis.log"
在/opt/app/redis-4.0.9/redis/目錄下創建logs目錄,mkdir logs目錄
③配置持久化文件存放位置
在redis.conf相應的位置添加 dir /opt/app/redis-4.0.9/redis/data
在/opt/app/redis-4.0.9/redis/目錄下創建data目錄,mkdir data目錄
啟動Redis服務,redis-server /opt/app/redis-4.0.9/redis/conf/redis.conf
啟動方式三:配置Linux自動啟動:
1、准備自啟動配置文件redisd
拷貝Redis源碼目錄source的utils目錄下redis_init_script文件到/etc/init.id目錄下
sudo cp /opt/app/redis-4.0.9/source/utils/redis_init_script /etc/init.d/redisd (通常都以d結尾表示是后台自啟動服務)
2、修改自啟動配置文件redisd
redisd原本內容:
REDISPORT=6379
EXEC=/usr/local/redis/bin/redis-server
CLIEXEC=/usr/local/redis/bin/redis-cli
PIDFILE=/var/run/redis.pid
CONF="/usr/local/redis/${REDISPORT}.conf"
將redistask文件內容修改為如下:
REDISPORT=6379
EXEC=/opt/app/redis-4.0.9/redis/bin/redis-server
CLIEXEC=/opt/app/redis-4.0.9/redis/bin/redis-cli
PIDFILE=/var/run/redis_${REDISPORT}.pid
CONF="/opt/app/redis-4.0.9/redis/conf/${REDISPORT}.conf"
3、准備開機啟動的配置文件
cp /opt/app/redis-4.0.9/redis/conf/redis.conf /opt/app/redis-4.0.9/redis/conf/6379.conf
4、設置開機啟動
chkconfig redisd on
此處直接配置開啟自啟動chkconfig redisd on
將報錯誤: service redisd does not support chkconfig
在啟動腳本redisd開頭添加如下兩行注釋以修改其運行級別:
#!/bin/sh # chkconfig: 2345 90 10 # description: Redis is a persistent key-value database #
chkconfig redisd on沒有權限,則應用sudo去執行,sudo chkconfig redisd on
開啟redisd服務,sudo service redisd start
關閉redisd服務,sudo service redisd stop
注意:開啟關閉redisd服務應該用sudo,否則設置的redis_6397.id無法創建,導致能成功開啟redisd服務,卻不能通過service redisd stop關閉,只能通過kill關閉,如圖:
正常的應為:
3. Redis集群部署
3.1 環境准備
准備三台虛擬機,如圖:
局域網IP分別為192.168.187.201、192.168.187.202和192.168.187.203
3.2 安裝Redis
詳情參考第2節點redis的安裝部署步驟,這里我們先在192.168.187.201上安裝redis並配置好,然后其余兩個節點以scp形式拷貝過去。
安裝redis完畢,如圖所示:
3.3 修改集群配置文件,創建節點
首先我們在192.168.187.201虛擬機里創建主從兩個節點,端口分別是7001,7002
我們在/opt/app/redis-4.0.9目錄下新建一個redis-cluster目錄,如圖:
然后在redis-cluster目錄下創建conf、nodes與scripts目錄,conf用於存放集群節點配置文件,scripts用於存放redis的shell腳本文件,如圖:
進入conf目錄,拷貝/opt/app/redis-4.0.9/source/redis.conf到redis-cluster/conf目錄
分別復制redis.conf為7001.conf和7002.conf,端口7001對應7001.conf配置文件,端口7002對應7002.conf配置文件,如圖:
分別修改7001.conf和7002.conf相應的端口、ip等配置信息,修改配置信息如下:
port 7001 #六個節點配置文件分別是7001-7006 bind 192.168.187.201 #默認ip為127.0.0.1,需要改為其他節點機器可訪問ip,否則創建集群時無法訪,和單機集群有區別 daemonize yes #redis后台運行 pidfile /var/run/redis_7001.pid #pidfile文件對7001-7006 cluster-enabled yes #開啟集群 cluster-config-file nodes_7001.conf #保存節點配置,自動創建,自動更新對應7001-7006 cluster-node-timeout 5000 #集群超時時間,節點超過這個時間沒反應就斷定是宕機 appendonly yes #存儲方式,aof,將寫操作記錄保存到日志中
3.4 scp復制redis-4.0.9整個文件夾到其他兩台機器上
復制到node2、node3,node2即192.168.187.202,node3即192.168.187.203上
我們在192.168.187.202虛擬機里創建主從兩個節點,端口分別是7003,7004,7003端口對應redis-cluster/conf/7003.conf配置文件,7004端口對應redis-cluster/conf/7004.conf配置文件
我們在192.168.187.203虛擬機里創建主從兩個節點,端口分別是7005,7006,7005端口對應redis-cluster/conf/7005.conf配置文件,7006端口對應redis-cluster/conf/7006.conf配置文件
在192.168.187.202上查看redis-4.0.9是否拷貝過來
修改用戶名和用戶組為hadoop,如果是普通用戶hadoop的話需要修改,如果是root用戶登錄的則不用。這里我使用hadoop用戶登錄,hadoop用戶執行不了root的文件,故需要修改用戶名和用戶組為hadoop。
分別把7001.conf和7002.conf文件重命名為7003.conf和7004.conf
分別修改7003.conf和7004.conf文件里面的配置信息,按照3.3節點里面最后提供的配置信息,修改對應的端口、ip、pidfile和cluster-config-file
192.168.187.203上redis的修改如同192.168.187.202的一致
3.5 啟動三台機器的六個節點
192.168.187.201機器 7001和7002節點
192.168.187.202機器 7003和7004節點
192.168.187.203機器 7005和7006節點
3.6 關閉防火牆
直接把三台機器的防火牆關閉
systemctl stop firewalld.service
3.7 創建集群
這里我們以192.168.187.201作為集群控制端,redis官方提供了在源碼文件夾中redis-trib.rb工具,把/opt/app/redis-4.0.9/source/src/redis-trib.rb文件拷貝到/opt/app/redis-4.0.9/redis/bin目錄下
在使用redis-trib.rb之前,需要安裝ruby,以及redis和ruby連接
yum -y install ruby ruby-devel rubygems rpm-build gem install redis
上述命令在機器是外網情況,可以順利安裝成功。
但是在內網情況,需要通過在內網建立一個yum源安裝,內網yum源安裝可以參考https://www.cnblogs.com/swordfall/p/8655084.html 14.2 制作本地YUM源
在內網情況下還有一個問題,就是redis和ruby連接無法安裝成功,“gem install redis”該命令無法成功,這里只能采用離線安裝
在這里,我們可以在redisgems官網下載redis和ruby的連接插件https://rubygems.org/gems/redis/versions/,如圖,這里我們下載3.2.1版本,版本太高與ruby不兼容
下載完redis-3.2.1.gem后,通過Xftp5復制到192.168.187.201節點上,然后通過命令“gem install redis-3.2.1.gem”離線安裝,如圖:
通過redis-trib.rb命令啟動集群, replicas表示從服務器的個數,"--replicas 1"表示6個節點三主三從
./redis-trib.rb create --replicas 1 192.168.187.201:7001 192.168.187.201:7002 192.168.187.202:7003 192.168.187.202:7004 192.168.187.203:7005 192.168.187.203:7006
從運行結果看,主節點是7001 7003 7005,從節點分別是7002 7004 7006
7001分配到的哈希值是0-5460
7003分配到的哈希值是5461-10922
7005分配到的哈希值是10923-16383
最后問我們是否接受上面的設置,輸入yes就表示接受,我們輸入yes
然后顯示:
顯示配置哈希槽,以及集群創建成功,可以用了。
3.8 集群數據測試
我們先連接任意一個節點,然后添加一個key:
redis-cli是redis默認的客戶端工具,啟動時加上`-c `參數,`-p `指定端口,就可以連接到集群,這里還得加-h指定機器IP
連接7001節點端口:
我們從其他集群節點,都可以獲取到數據,如:
4. Redis客戶端使用
4.1 啟動Redis服務並使用客戶端訪問Redis服務
啟動Redis服務
使用上述第五節點任意一種啟動方式啟動redis服務,在這里,我采用第三種方式啟動redis服務
sudo service redisd start
進入redis安裝目錄log目錄,查看redis.log日志,出現下圖則redis正常啟動
cd redis-4.0.9/redis/logs/
cat redis.log
redis-cli客戶端訪問Redis服務
redis-cli
查看Redis是否存在
ps aux | grep redis 或 ps -ef | grep redis
netstat -tunlp 6379 或 netstat -nltp 6379
5. Redis持久化
Redis有兩種持久化方案:RDB和AOF
1) RDB方式按照一定的時間間隔對數據集創建基於時間點的快照;
2)AOF方式記錄Server收到的寫操作到日志文件,在Server重啟時通過回收這些寫操作來重建數據集。該方式類似於MySQL中基於語句格式的binlog。當日志變大時Redis可在后台重寫日志。
5.1 RDB持久化配置
默認情況下,Redis保存數據集快照到磁盤,名為dump.rdb的二進制文件。可以設置讓Redis在N秒內至少有M次數據集改動時保存數據集,或者你也可以手動調用SAVE或者BGSAVE命令。例如,這個配置會讓Redis在每個60秒內至少有1000次鍵改動時自動轉儲數據集到磁盤。
save 60 1000
5.2 AOF 持久化配置
1)修改redis.config配置文件,找到appendonly。默認是appendonly no。改成appendonly yes;
2)再找到appendfsync。默認是appendfsync everysec
appendfsync always
# 每次收到寫命令就立即強制寫入磁盤,最慢的,但是保證完全的持久化,不推薦使用
appendfsync everysec
#每秒鍾強制寫入磁盤一次,在性能和持久化方面做了很好的折中,推薦
appendfsync no
#完全依賴os,性能最好,持久化沒保證
6. Redis數據結構與常用命令
6.1 Redis數據結構
Redis數據結構有5種,分別是String、Map、List、Set、SortSet這5種。
6.2 Redis-cli中常用命令
命令 | 說明 |
info Keyspace | 查看存儲數據的相關信息 |
keys * | 查看所有的 key |
del key | 刪除單個 |
7. 可能遇到的問題
問題1:JedisConnectionException: java.net.ConnectException: Connection refused: connect
解決如下:Redis的配置文件redis.conf里bind 127.0.0.1 注釋掉。
bind localhost 只能本機訪問,局域網內計算機不能訪問
問題2:Jedis連接Linux上的redis出現 DENIED Redis is running in protected mode問題
解決如下:由於Linux上的redis處於安全保護模式,這就讓你無法從虛擬機外部去輕松建立連接,這里就有兩種解決方法,一種是在redis.conf中設置保護模式為no
另外一種方式是加上安全認證,即redis默認是沒有密碼的可以直接登錄,這里加上密碼“11111”
在外部用Jedis連接linux的redis,需要添加密碼,如:
參考資料:
https://blog.csdn.net/a532672728/article/details/78035559