中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Redis安裝配置及整合SpringBoot的方法

發布時間:2022-03-29 13:58:12 來源:億速云 閱讀:206 作者:iii 欄目:大數據

這篇文章主要介紹“Redis安裝配置及整合SpringBoot的方法”,在日常操作中,相信很多人在Redis安裝配置及整合SpringBoot的方法問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”Redis安裝配置及整合SpringBoot的方法”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!

安裝 Redis

# 下載Redis
wget https://download.redis.io/releases/redis-6.0.9.tar.gz

# 解壓 redis
tar -zxvf redis-6.0.9.tar.gz

# 安裝 gcc 環境, 安裝過 忽略
yum -y install gcc-c++

cd redis-5.0.5 

# 安裝 
make && make install

Redis 配置啟動腳本

# 拷貝 utils 目錄下的 redis_init_script 到 /etc/init.d 目錄下  redis_init_script 是啟動腳本
cp utils/redis_init_script /etc/init.d

cd /etc/init.d

vim /etc/init.d/redis_init_script

# ----------------- redis_init_script start ---------------
#!/bin/sh
#
# Simple Redis init.d script conceived to work on Linux systems
# as it does use of the /proc filesystem.

### BEGIN INIT INFO
# Provides:     redis_6379
# Default-Start:        2 3 4 5
# Default-Stop:         0 1 6
# Short-Description:    Redis data structure server
# Description:          Redis data structure server. See https://redis.io
### END INIT INFO

# redis 默認端口
REDISPORT=6379
# redis 默認啟動 redis-server 位置
EXEC=/usr/local/bin/redis-server
# redis redis-cli 位置
CLIEXEC=/usr/local/bin/redis-cli

# redis pid 位置 拼接了默認端口參數。 
PIDFILE=/var/run/redis_${REDISPORT}.pid
# redis 默認配置的conf 配置文件
CONF="/usr/local/redis/conf/redis.conf"

# $1 參數 為 start 或者 stop 
case "$1" in
    start)
        if [ -f $PIDFILE ]
        then
                echo "$PIDFILE exists, process is already running or crashed"
        else
                echo "Starting Redis server..."
				$EXEC $CONF
        fi
        ;;
    stop)
        if [ ! -f $PIDFILE ]
        then
                echo "$PIDFILE does not exist, process is not running"
        else
                PID=$(cat $PIDFILE)
                echo "Stopping ..."
                $CLIEXEC -p $REDISPORT shutdown
                while [ -x /proc/${PID} ]
                do
                    echo "Waiting for Redis to shutdown ..."
                    sleep 1
                done
                echo "Redis stopped"
        fi
        ;;
    *)
        echo "Please use start or stop as first argument"
        ;;
esac

# ----------------- redis_init_script end ---------------

# 保存之后啟動redis 
./redis_init_script start 

# 停止 redis 
./redis_init_script stop

配置Redis 開啟自啟動

# 在以下位置加上一段注釋
#!/bin/sh
#
# Simple Redis init.d script conceived to work on Linux systems
# as it does use of the /proc filesystem.

### BEGIN INIT INFO
# Provides:     redis_6379
# Default-Start:        2 3 4 5
# Default-Stop:         0 1 6
# Short-Description:    Redis data structure server
# Description:          Redis data structure server. See https://redis.io
### END INIT INFO

#chkconfig: 22345 10 90
#desccription: Start and Stop redis

:wq! # 保存 

# 注冊redis 到開機自啟動
chkconfig redis_init_script on

Redis 配置文件解析

# 設置后臺運行  yes 后臺運行, no 前臺運行
daemonize yes 

# pidfile pid 目錄文件
pidfile /var/run/redis_6379.pid

# dir redis 的工作空間。必須寫一個目錄。不能寫一個文件名
dir /usr/local/redis/working

# bind 哪些ip地址可以訪問 redis-server 0.0.0.0 任何地址都可以訪問
bind 0.0.0.0

# requirepass 設置 redis 鏈接密碼
requirepass 584521

SpringBoot 整合 Redis

  • 引入依賴

<dependency>
	<goupId>org.springframework.boot</goupId>
    <artifactId>spring-boot-starter-data-redis</aartifactId>
</dependency>
  • 配置 redis

spring:
	redis:
		database: 0 				# 數據庫
		host: 127.0.0.1				# redis 地址
		port: 6379					# redis 端口
		password: 584521			# redis 密碼		
  • 接口測試

@ApiIgnore
@RestController
@RequestMapping("redis")
public class RedisController {
    
    @Autowired
    private RedisTemplate redisTemplate;
    
    @GetMapping("/set")
    public Object set(String key, String value) {
        redisTemplate.opsForValue().set(key, value);
        return "ok";
    }
    
    @GetMapping("get")
    public Object get(String key) {
		Object value = redisTemplate.opsForValue().get(key);
        return value;
    }
    
    @GetMapping("delete")
    public Object delete(String key) {
        redisTemplate.delete(key);
        return "ok";
    }
}
  • redis 默認使用的 JDK 的序列化機制

Redis 持久化機制

Redis RDB 機制 Redis DataBase

  • 每隔一段時間,把內存中的數據寫入到磁盤的臨時文件,作為快照。恢復的時候把快照文件讀進內存。如果 redis 宕機重啟,那么內存中的數據肯定會沒有的。 重啟 redis 時。從 RDB 文件中讀取恢復數據

# 打開 redis.conf 文件
vim redis.conf 

# redis 工作空間
dir /usr/local/redis/working 

# rdb 持久化文件名
dbfilename dump.rdb

# save 保存到硬盤。多少時間內發生了多少次改變
save 900 1
save 300 10 
save 60 10000

# stop-writes-on-bgsave-error 保存時,發生錯誤停止寫入操作
stop-writes-on-bgsave-error yes

# rdbcompression 壓縮 rdb 文件 如果像節省cpu性能開銷。 就可以關閉 no 
rdbcompression yes 

# rdbchecksum 壓縮 rdb 文件以后。 是否要檢驗 rdb 文件。 會有百分之 10 的性能損耗
rdbchecksum yes
  • RDB 優點

    • 全量備份

    • 可以遠程傳輸

    • 子進程備份時,主進程不會有IO操作。

  • RDB 缺點

    • rdb 持久化會有一個觸發機制。如果最后的數據沒有還沒有觸發保存。那么就有可能會導致 redis 宕機重啟后,導致數據不一致

Redis AOF 機制 Append Only File

  • Redis 默認使用的是RDB模式作為持久化操作

  • 關于 AOF 的配置名稱

    # 選擇是否開啟 aof
    
    appendonly yes
    
    # appendfilename 配置 aof 持久化文件的名稱
    
    appendfilename "appendonly.aof"
    
    # appendfsync aof 文件的同步策略。 always 針對每一次的寫操作。 資源占用比較大。, erverysec 每秒同步一次 no 永不同步
    
    appendfsync everysec
    
    # no-appendfsync-on-rewrite 重寫的時候可以不做同步。 如果是yes 有可能會導致文件內容的不一致性
    
    bi-appendfsync-on-rewrite no
    
    # auto-aof-rewrite-percentage 100 aof 文件增長比例,指當前 aof 文件比上次重寫的增長比例大小。 aof 重寫即在 aof 文件在一定大小之后,重新將整個內存寫道 aof 文件當中,以反應最新得狀態 這樣就避免了文件過大而實際內存數據小的問題。 (頻繁修改問題)
    
    auto-aof-rewrite-percentage 100
    
    # auto-aof-rewrite-min-size 64mb	aof 文件重寫最小得文件大小。即最開始 aof 文件必須要達到這個文件時才觸發,后面的每次重寫就不會根據這個變量了, 根據上一次重寫完成之后的大小。 此變量僅僅只有初始化啟動 redis 時有效,如果是 redis 恢復時, 則 lastSize 等于初始 aof 文件大小。
    
    auto-aof-rewrite-min-size 64mb
    
    # aof-load-truncated 指redis在恢復時,會忽略最后一條可能存在問題的指令。默認值yes。即在aof寫入時,可能存在指令寫錯的問題(突然斷電,寫了一半),這種情況下,yes會log并繼續,而no會直接恢復失敗.
    
    aof-load-truncated yes


  • 不小心使用了 flushdb , flushall 。 我們可以停止 redis-server, 打開 aof 文件。 將 flushdb flushall 這種命令直接刪除。重啟 redis 服務

  • RDB 和 AOF 可以同時使用, 加載順序,先加載 AOF 再加載 RDB

Redis 主從架構

  • 原來的單個Redis作為一個主 (Master),多個從 (Slave) 。讀寫分離架構。 主作為寫庫, 從作為讀庫,也就是說寫操作操作 Mater, 大多數讀操作用 Slave 。Slave 會對 Mater 做一個全量復制的數據。

    • Master 先啟動,隨后啟動 Slave , 然后 Slave 會去 ping Master 節點,ping 通知后。 Master 會將數據提交給 Slave。Master 的數據復制是全量復制。

    • Master 會從內存中拷貝所有的 數據生成RDB文件。然后通過網絡傳輸給我們的 Slave 節點。

    • Slave 拿到 RDB 文件后,會先下載到自己的硬盤中,然后再加載到 Slave 中。 這只是一個第一次啟動時的操作

    • 后續操作 Master 會直接傳輸給 Slave 節點。 傳輸操作并不會阻塞寫操作

  • 配置 一主二從機制,需要先準備三臺Redis 機器 一臺主,兩臺從

    # 啟動 Redis-cli
    redis-cli
    # 查看 Redis 角色信息
    info replication
    
    # Replication
    role:master			# 當前 redis 角色
    connected_slaves:0	# 當前 redis 連接數量
    master_replid:9d6bd1e0965ba650aed518034318a11c243c2d8c
    master_replid2:0000000000000000000000000000000000000000
    master_repl_offset:0
    second_repl_offset:-1
    repl_backlog_active:0
    repl_backlog_size:1048576
    repl_backlog_first_byte_offset:0
    repl_backlog_histlen:0
    # replicaof <masterip> <masterport> 主庫 ip , 主庫 端口號
    replicaof 192.168.1.191 6379
    
    # masterauth <master-password> 主庫 redis 密碼
    masterauth 584521
    
    # replica-read-only yes  配置從主只能夠讀 不能寫數據
    replica-read-only yes
    
    # 停止 redis 服務
    ./redis_init_script stop 
    
    # 刪除 dump.rdb 和 aof 文件
    rm -rf dump.rdb *.aof
    
    # 啟動 redis 服務
    ./redis_init_script start
    # replicaof <masterip> <masterport> 主庫 ip , 主庫 端口號
    replicaof 192.168.1.191 6379
    
    # masterauth <master-password> 主庫 redis 密碼
    masterauth 584521
    
    # replica-read-only yes  配置從主只能夠讀 不能寫數據
    replica-read-only yes
    
    # 停止 redis 服務
    ./redis_init_script stop 
    
    # 刪除 dump.rdb 和 aof 文件
    rm -rf dump.rdb *.aof
    
    # 啟動 redis 服務
    ./redis_init_script start
    • Disk-backed : Redis 會創建一個進程。 會寫入一個文件到硬盤,然后將硬盤傳輸到 Redis Slave 節點上。

    • Diskless: Redis 會創建一個進程,會將 RDB 文件寫入到 socket 連接中,不會接觸到磁盤。 可以通過 socket 傳輸. Redis 會在 Slave 都連接上的一段時間后, 然后將 socket 傳輸到 多個 Slave 節點上。

    • 全部啟動成功之后,通過 info replication 命令查看各個 Redis 的角色狀態。

    • 無磁盤化復制

      # 當磁盤很慢,但是網絡環境又很不錯。 那么就可以使用無磁盤化傳輸 
      repl-diskless-sync no
      
      # 配置 slave 連接上多久后,才開始通過 socket 傳輸。
      repl-diskless-sync-delay 5


    • 配置 從 Redis Slave 第二臺

    • 配置 從 Redis , Slave 第一臺

    • 主 Redis Master

Redis 緩存過期處理和內存淘汰機制

  • 主動定時刪除

    # 每秒鐘檢查 10 次
    hz 10


    • 定時隨機的檢查過期的key,如果過期則清理刪除。(每秒檢查次數在redis.conf中的hz配置)

  • 被動惰性刪除

    • 當客戶端請求一個已經過期的key的時候,那么redis會檢查這個key是否過期,如果過期了,則刪除,然后返回一個nil。這種策略 友好,不會有太多的損耗,但是內存占用會比較高。

  • Redis 內存滿了怎么辦

    # maxmemory <byte> 配置redis 一共能占用多少內存 單位 byte
    maxmemory 2048
    • 如果一個數據在最近一段時間很少被訪問到,那么可以認為在將來它被訪問的可能性也很小。因此,當空間滿時,最小頻率訪問的數據最先被淘汰

    • 如果一個數據在最近一段時間沒有被訪問到,那么可以認為在將來它被訪問的可能性也很小。因此,當空間滿時,最久沒有訪問的數據最先被置換(淘汰)

    • LRU(The Least Recently Used,最近最久未使用算法)是一種常見的緩存算法,在很多分布式緩存系統(如Redis, Memcached)中都有廣泛使用。

    • LFU(Least Frequently Used ,最近最少使用算法)也是一種常見的緩存算法。

    • Redis 提供了以下多種淘汰機制

      # volatile-lru -> Evict using approximated LRU among the keys with an expire set.
      # allkeys-lru -> Evict any key using approximated LRU.
      # volatile-lfu -> Evict using approximated LFU among the keys with an expire set.
      # allkeys-lfu -> Evict any key using approximated LFU.
      # volatile-random -> Remove a random key among the ones with an expire set.
      # allkeys-random -> Remove a random key, any key.
      # volatile-ttl -> Remove the key with the nearest expire time (minor TTL)
      # noeviction -> Don't evict anything, just return an error on write operations.


    • maxmemory 內存達到多少的時候。表示內存已經滿了

Redis 哨兵模式

原來一主二從里面, Master 節點一旦宕機。 我們就無法寫入數據了。因為主節點宕機。從節點無法寫入數據。只可以讀取數據。

  • 配置 Redis 壓縮包中的 sentinel.conf 文件

# 開啟保護模式后 綁定 ip 哪個 ip 才能夠連接
# bind 127.0.0.1
# yes 開啟綁定模式 ,。 no 不開啟
protected-mode no 
# 端口號
port 26379

# daemonize 是否開啟后臺
daemonize yes

# pid 文件位置。 和 redis 不是同一個進程 
pidfile /var/run/redis-sentinel.pid 

# 配置 sentinel 的日志文件
logfile /usr/local/redis/logs/sentinel/redis-sentinel.log

# dir sentinel 的工作空間
dir /usr/local/redis/sentinel

# sentinel monitor <master-group-name> <ip> <port> <quorum> 配置監聽的 master 名稱、 以及 ip 地址, 端口號。 
sentinel monitor xh-master 192.168.1.191 6379 2

# sentinel auth-pass mymaster MySUPER--secret-0123passw0rd
sentinel auth-pass xh-master 584521

# sentinel down-after-milliseconds <master-name> <milliseconds> master 名稱。 哨兵認為master 失敗的時間段
sentinel down-after-milliseconds xh-master 10000 

# sentinel parallel-syncs <master-name> <numslaves> master 名稱 以及同時需要同步幾個 slave 節點的數據。
sentinel parallel-syncs xh-master 1

# sentinel failover-timeout <master-name> <milliseconds> master 名稱。 故障轉移超時時間。 
sentinel failover-timeout xh-master 180000
  • 下面可以直接將 sentinel 直接復制到其他兩臺 Redis 節點上

scp ./sentinel.conf root@192.168.1.192:/usr/local/redis/

scp ./sentinel.conf root@192.168.1.193:/usr/local/redis/
  • 啟動 Redis-sentinel 哨兵

# 啟動時會報一個錯誤 
redis-sentinel  
# 說 Sentinel 沒有指定配置文件
6031:X 08 Nov 21:12:20.727 # Sentinel started without a config file. Exiting...

# 指定配置文件啟動
redis-sentinel /usr/local/redis/sentinel.conf 

安裝此方式啟動 slave 1  和  slave 2
  • 啟動完成后, 當我們手動停止掉 redis-server 服務后。redis 哨兵,會在剩余的兩個 slave 節點中。選舉出一個 master 節點。

  • 當原來的master 節點重新啟動之后, master 并不是master 節點了。已經轉變為 slave 節點了。可以通過 info replication

4-4 解決原Master恢復后不同步問題
在本節課中,相信細心的同學會發現原來的Master(191)恢復成Slave后,他的同步狀態不OK,狀態為 master_link_status:down ,這是為什么呢?
這是因為我們只設置了192和193的 masterauth ,這是用于同步master的數據,但是191一開始是master是不受影響的,當master轉變為slave后,由于他沒有
auth ,所以他不能從新的master同步數據,隨之導致 info replication 的時候,同步狀態為 down ,所以只需要修改 redis.conf 中的 masterauth 為 584521
一般master數據無法同步給slave的方案檢查為如下:
1. 網絡通信問題,要保證互相ping通,內網互通。
2. 關閉防火墻,對應的端口開發(虛擬機中建議永久關閉防火墻,云服務器的話需要保證內網互通)。
3. 統一所有的密碼,不要漏了某個節點沒有設置。

# 查看xh-master下的master節點信息
sentinel master xh-master
# 查看xh-master下的slaves節點信息
sentinel slaves xh-master
# 查看xh-master下的哨兵節點信息
sentinel sentinels xh-master

Redis 使用 哨兵模式整合 SpringBoot 中

  • 配置 ymal 文件

spring:
	redis:
		database: 1
		password: 584521
		sentinel: 
			master: xh-master  	# 配置 master 的名稱
			nodes: 192.168.1.191:26379,192.168.1.192:26379,192.168.1.193:26379	# 配置 redis 哨兵的 端口號以及 ip

Redis Cluster集群

  • 是單個master容量有限,數據達到一定程度會有瓶頸,這個時候可以通過水平擴展為多master 集群。

  • redis-cluster:他可以支撐多個master-slave,支持海量數據,實現高可用與高并發。 哨兵模式其實也是一種集群,他能夠提高讀請求的并發,但是容錯方面可能會有一些問題,比如master同步數據給slave的時候,這其實是異步復制吧,這個時候 了,那么slave上的數據就沒有master新,數據同步需要時間的,1-2秒的數據會丟失。master恢復并轉換成slave后,新數據則丟失。

    • 每個節點知道彼此之間的關系,也會知道自己的角色,當然他們也會知道自己存在與一個集群環境中,他們彼此之間可以交互和通信, ong。那么這些關系都會保存到某個配置文件中,每個節點都有,這個我們在搭建的時候會做配置的。

    • 客戶端要和集群建立連接的話,只需要和其中一個建立關系就行。

    • 某個節點掛了,也是通過超過半數的節點來進行的檢測,客觀下線后主從切換,和我們之前在哨兵模式中提到的是一個道理。

    • Redis中存在很多的插槽,又可以稱之為槽節點,用于存儲數據,這個先不管,后面再說。

搭建 Redis-cluster 集群

  • 修改 201 節點下 Redis 配置文件

# 開啟 cluster 集群  yes 開啟, no 關閉
cluster-enabled yes

# cluster-config-file nodes-6379.conf cluster-config-file cluster 節點配置文件
cluster-config-file nodes-6379.conf

# cluster-node-timeout 15000 配置 redis-cluster 超時時間
cluster-node-timeout 1500
# 開啟 aof 持久化
appendonly yes

# 修改萬配置文件后。刪除 aof 和 rbd 文件 如果不刪除可能就會報錯
rm -rf *.aof 
rm -rf *.rdb 

# 停止 redis 
/etc/init.d/redis_init_script stop 

# 啟動 redis
/etc/init.d/redis_init_script start
  • 重復操作 202, 203, 204, 205, 206

  • 通過 redis-cli 創建 cluster 集群

# 如果設置密碼了記得設置密碼
redis-cli -a 584521 --cluster create 192.168.1.201:6379 192.168.1.202:6379 192.168.1.203:6379 192.168.1.204:6379 192.168.1.205:6379 192.168.1.206:6379 --cluster-replicas 1

Redis安裝配置及整合SpringBoot的方法

  • 以上就是 三主三從的關系了。 M 為 master . S 為 Slave 。 205 分配到 201 , 206 分配到 202 。 204 分配到 203

# 上面最后會詢問你是否要配置該集群了 
Can I set the above configuration? (type 'yes' to accept) : yes
  • 檢查 cluster 集群信息

redis-cli -a 584521 --cluster check 192.168.1.201:6379

Redis Slots 概念

  • 一共是有 16384 個槽節點分配

[OK] All 16384 slots covered
  • 如何分配的槽節點呢

    • 將 16384 平均分配給三個Master

Redis安裝配置及整合SpringBoot的方法

  • 槽 slot 如何存儲

    • redis 會對每個存儲的數據的 key 進行一個 hash 然后對 16384 取模 , 計算公式 hash(key) % 16384

  • 進入到集群的控制臺

# 查看集群的信息
redis-cli-c -a 584521 -h 192.168.1.202 -p6379 
# 查看節點的信息
cluster nodes

Redis SpringBoot 中整合 Cluster 集群

  • 配置 yaml 文件

spring:
	redis:
		password: 584521
		cluster: 
			nodes: 192.168.1.201:6379 192.168.1.202:6379 192.168.1.203:6379 192.168.1.204:6379 192.168.1.205:6379 192.168.1.206:6379

緩存穿透

  • 緩存穿透是指緩存和數據庫中都沒有的數據,而用戶不斷發起請求,比如說發起一個 id 為 ‘-1’ 的數據, 或者 id 特別大 又不存在的數據。 這時因為緩存中沒有數據,就會導致每一次的請求都會落在數據庫上。導致數據庫壓力過大。

    • 接口層增加校驗,如用戶鑒權校驗,對請求參數做邏輯校驗

    • 從緩存中取不到的數據,在數據庫中也取不到的數據。 這個時候也可以寫入到緩存中。k - null 的方式。 緩存有效期設置短點。 如果設置的過長,就會導致正常情況無法使用。

緩存擊穿

  • 緩存擊穿是指緩存中沒有,但是數據庫中有的數據,一般是 緩存時間到期,這個時候由于并發用戶過多, 同時緩存沒有讀到數據,導致請求全部落在數據庫中,造成數據庫壓力過大。

    • 設置熱點數據永不過期

    • 加鎖去讀。對 key 加鎖。 當緩存中拿不到數據的時候。放開一個線程去數據庫中去讀數據。

緩存雪崩

  • 緩存雪崩是指緩存中數據大批量到過期時間,而查詢數據量巨大,引起數據庫壓力過大甚至down機。和緩存擊穿不同的是, 緩存擊穿指并發查同一條數據,緩存雪崩是不同數據都過期了,很多數據都查不到從而查數據庫。

    • 緩存數據的過期時間設置隨機,防止同一時間大量數據過期現象發生。

    • 如果緩存數據庫是分布式部署,將熱點數據均勻分布在不同緩存數據庫中。

    • 設置熱點數據永遠不過期。

到此,關于“Redis安裝配置及整合SpringBoot的方法”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

渭南市| 海安县| 丹棱县| SHOW| 绥芬河市| 卓资县| 革吉县| 瑞金市| 应城市| 科技| 肇庆市| 勃利县| 通江县| 阿城市| 古浪县| 修武县| 合阳县| 塘沽区| 九江县| 福安市| 郁南县| 贵德县| 通化县| 肇州县| 宁津县| 遂溪县| 安福县| 新干县| 奈曼旗| 阿拉善左旗| 铅山县| 包头市| 临城县| 雅江县| 颍上县| 彩票| 平南县| 信丰县| 武川县| 深圳市| 根河市|