Redis基本概念、基本使用與單機集群部署


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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM