您好,登錄后才能下訂單哦!
這篇文章主要介紹“Redis安裝配置及整合SpringBoot的方法”,在日常操作中,相信很多人在Redis安裝配置及整合SpringBoot的方法問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”Redis安裝配置及整合SpringBoot的方法”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!
# 下載Redis wget https://download.redis.io/releases/redis-6.0.9.tar.gz # 解壓 redis tar -zxvf redis-6.0.9.tar.gz # 安裝 gcc 環(huán)境, 安裝過 忽略 yum -y install gcc-c++ cd redis-5.0.5 # 安裝 make && make install
# 拷貝 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 位置 拼接了默認端口參數(shù)。 PIDFILE=/var/run/redis_${REDISPORT}.pid # redis 默認配置的conf 配置文件 CONF="/usr/local/redis/conf/redis.conf" # $1 參數(shù) 為 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
# 在以下位置加上一段注釋 #!/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
# 設置后臺運行 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
引入依賴
<dependency> <goupId>org.springframework.boot</goupId> <artifactId>spring-boot-starter-data-redis</aartifactId> </dependency>
配置 redis
spring: redis: database: 0 # 數(shù)據(jù)庫 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 的序列化機制
每隔一段時間,把內(nèi)存中的數(shù)據(jù)寫入到磁盤的臨時文件,作為快照。恢復的時候把快照文件讀進內(nèi)存。如果 redis 宕機重啟,那么內(nèi)存中的數(shù)據(jù)肯定會沒有的。 重啟 redis 時。從 RDB 文件中讀取恢復數(shù)據(jù)
# 打開 redis.conf 文件 vim redis.conf # redis 工作空間 dir /usr/local/redis/working # rdb 持久化文件名 dbfilename dump.rdb # save 保存到硬盤。多少時間內(nèi)發(fā)生了多少次改變 save 900 1 save 300 10 save 60 10000 # stop-writes-on-bgsave-error 保存時,發(fā)生錯誤停止寫入操作 stop-writes-on-bgsave-error yes # rdbcompression 壓縮 rdb 文件 如果像節(jié)省cpu性能開銷。 就可以關閉 no rdbcompression yes # rdbchecksum 壓縮 rdb 文件以后。 是否要檢驗 rdb 文件。 會有百分之 10 的性能損耗 rdbchecksum yes
RDB 優(yōu)點
全量備份
可以遠程傳輸
子進程備份時,主進程不會有IO操作。
RDB 缺點
rdb 持久化會有一個觸發(fā)機制。如果最后的數(shù)據(jù)沒有還沒有觸發(fā)保存。那么就有可能會導致 redis 宕機重啟后,導致數(shù)據(jù)不一致
Redis 默認使用的是RDB模式作為持久化操作
關于 AOF 的配置名稱
# 選擇是否開啟 aof appendonly yes # appendfilename 配置 aof 持久化文件的名稱 appendfilename "appendonly.aof" # appendfsync aof 文件的同步策略。 always 針對每一次的寫操作。 資源占用比較大。, erverysec 每秒同步一次 no 永不同步 appendfsync everysec # no-appendfsync-on-rewrite 重寫的時候可以不做同步。 如果是yes 有可能會導致文件內(nèi)容的不一致性 bi-appendfsync-on-rewrite no # auto-aof-rewrite-percentage 100 aof 文件增長比例,指當前 aof 文件比上次重寫的增長比例大小。 aof 重寫即在 aof 文件在一定大小之后,重新將整個內(nèi)存寫道 aof 文件當中,以反應最新得狀態(tài) 這樣就避免了文件過大而實際內(nèi)存數(shù)據(jù)小的問題。 (頻繁修改問題) auto-aof-rewrite-percentage 100 # auto-aof-rewrite-min-size 64mb aof 文件重寫最小得文件大小。即最開始 aof 文件必須要達到這個文件時才觸發(fā),后面的每次重寫就不會根據(jù)這個變量了, 根據(jù)上一次重寫完成之后的大小。 此變量僅僅只有初始化啟動 redis 時有效,如果是 redis 恢復時, 則 lastSize 等于初始 aof 文件大小。 auto-aof-rewrite-min-size 64mb # aof-load-truncated 指redis在恢復時,會忽略最后一條可能存在問題的指令。默認值yes。即在aof寫入時,可能存在指令寫錯的問題(突然斷電,寫了一半),這種情況下,yes會log并繼續(xù),而no會直接恢復失敗. aof-load-truncated yes
不小心使用了 flushdb , flushall 。 我們可以停止 redis-server, 打開 aof 文件。 將 flushdb flushall 這種命令直接刪除。重啟 redis 服務
RDB 和 AOF 可以同時使用, 加載順序,先加載 AOF 再加載 RDB
原來的單個Redis作為一個主 (Master),多個從 (Slave) 。讀寫分離架構。 主作為寫庫, 從作為讀庫,也就是說寫操作操作 Mater, 大多數(shù)讀操作用 Slave 。Slave 會對 Mater 做一個全量復制的數(shù)據(jù)。
Master 先啟動,隨后啟動 Slave , 然后 Slave 會去 ping Master 節(jié)點,ping 通知后。 Master 會將數(shù)據(jù)提交給 Slave。Master 的數(shù)據(jù)復制是全量復制。
Master 會從內(nèi)存中拷貝所有的 數(shù)據(jù)生成RDB文件。然后通過網(wǎng)絡傳輸給我們的 Slave 節(jié)點。
Slave 拿到 RDB 文件后,會先下載到自己的硬盤中,然后再加載到 Slave 中。 這只是一個第一次啟動時的操作
后續(xù)操作 Master 會直接傳輸給 Slave 節(jié)點。 傳輸操作并不會阻塞寫操作
配置 一主二從機制,需要先準備三臺Redis 機器 一臺主,兩臺從
# 啟動 Redis-cli redis-cli # 查看 Redis 角色信息 info replication # Replication role:master # 當前 redis 角色 connected_slaves:0 # 當前 redis 連接數(shù)量 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 配置從主只能夠讀 不能寫數(shù)據(jù) 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 配置從主只能夠讀 不能寫數(shù)據(jù) 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 會創(chuàng)建一個進程。 會寫入一個文件到硬盤,然后將硬盤傳輸?shù)?Redis Slave 節(jié)點上。
Diskless: Redis 會創(chuàng)建一個進程,會將 RDB 文件寫入到 socket 連接中,不會接觸到磁盤。 可以通過 socket 傳輸. Redis 會在 Slave 都連接上的一段時間后, 然后將 socket 傳輸?shù)?多個 Slave 節(jié)點上。
全部啟動成功之后,通過 info replication
命令查看各個 Redis 的角色狀態(tài)。
無磁盤化復制
# 當磁盤很慢,但是網(wǎng)絡環(huán)境又很不錯。 那么就可以使用無磁盤化傳輸 repl-diskless-sync no # 配置 slave 連接上多久后,才開始通過 socket 傳輸。 repl-diskless-sync-delay 5
配置 從 Redis Slave 第二臺
配置 從 Redis , Slave 第一臺
主 Redis Master
主動定時刪除
# 每秒鐘檢查 10 次 hz 10
定時隨機的檢查過期的key,如果過期則清理刪除。(每秒檢查次數(shù)在redis.conf中的hz配置)
被動惰性刪除
當客戶端請求一個已經(jīng)過期的key的時候,那么redis會檢查這個key是否過期,如果過期了,則刪除,然后返回一個nil。這種策略 友好,不會有太多的損耗,但是內(nèi)存占用會比較高。
Redis 內(nèi)存滿了怎么辦
# maxmemory <byte> 配置redis 一共能占用多少內(nèi)存 單位 byte maxmemory 2048
如果一個數(shù)據(jù)在最近一段時間很少被訪問到,那么可以認為在將來它被訪問的可能性也很小。因此,當空間滿時,最小頻率訪問的數(shù)據(jù)最先被淘汰。
如果一個數(shù)據(jù)在最近一段時間沒有被訪問到,那么可以認為在將來它被訪問的可能性也很小。因此,當空間滿時,最久沒有訪問的數(shù)據(jù)最先被置換(淘汰)。
LRU(The Least Recently Used,最近最久未使用算法)是一種常見的緩存算法,在很多分布式緩存系統(tǒng)(如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 內(nèi)存達到多少的時候。表示內(nèi)存已經(jīng)滿了
原來一主二從里面, Master 節(jié)點一旦宕機。 我們就無法寫入數(shù)據(jù)了。因為主節(jié)點宕機。從節(jié)點無法寫入數(shù)據(jù)。只可以讀取數(shù)據(jù)。
配置 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> 配置監(jiān)聽的 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 節(jié)點的數(shù)據(jù)。 sentinel parallel-syncs xh-master 1 # sentinel failover-timeout <master-name> <milliseconds> master 名稱。 故障轉(zhuǎn)移超時時間。 sentinel failover-timeout xh-master 180000
下面可以直接將 sentinel 直接復制到其他兩臺 Redis 節(jié)點上
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 節(jié)點中。選舉出一個 master 節(jié)點。
當原來的master 節(jié)點重新啟動之后, master 并不是master 節(jié)點了。已經(jīng)轉(zhuǎn)變?yōu)?slave 節(jié)點了??梢酝ㄟ^ info replication
4-4 解決原Master恢復后不同步問題 在本節(jié)課中,相信細心的同學會發(fā)現(xiàn)原來的Master(191)恢復成Slave后,他的同步狀態(tài)不OK,狀態(tài)為 master_link_status:down ,這是為什么呢? 這是因為我們只設置了192和193的 masterauth ,這是用于同步master的數(shù)據(jù),但是191一開始是master是不受影響的,當master轉(zhuǎn)變?yōu)閟lave后,由于他沒有 auth ,所以他不能從新的master同步數(shù)據(jù),隨之導致 info replication 的時候,同步狀態(tài)為 down ,所以只需要修改 redis.conf 中的 masterauth 為 584521 一般master數(shù)據(jù)無法同步給slave的方案檢查為如下: 1. 網(wǎng)絡通信問題,要保證互相ping通,內(nèi)網(wǎng)互通。 2. 關閉防火墻,對應的端口開發(fā)(虛擬機中建議永久關閉防火墻,云服務器的話需要保證內(nèi)網(wǎng)互通)。 3. 統(tǒng)一所有的密碼,不要漏了某個節(jié)點沒有設置。 # 查看xh-master下的master節(jié)點信息 sentinel master xh-master # 查看xh-master下的slaves節(jié)點信息 sentinel slaves xh-master # 查看xh-master下的哨兵節(jié)點信息 sentinel sentinels xh-master
配置 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
是單個master容量有限,數(shù)據(jù)達到一定程度會有瓶頸,這個時候可以通過水平擴展為多master 集群。
redis-cluster:他可以支撐多個master-slave,支持海量數(shù)據(jù),實現(xiàn)高可用與高并發(fā)。 哨兵模式其實也是一種集群,他能夠提高讀請求的并發(fā),但是容錯方面可能會有一些問題,比如master同步數(shù)據(jù)給slave的時候,這其實是異步復制吧,這個時候 了,那么slave上的數(shù)據(jù)就沒有master新,數(shù)據(jù)同步需要時間的,1-2秒的數(shù)據(jù)會丟失。master恢復并轉(zhuǎn)換成slave后,新數(shù)據(jù)則丟失。
每個節(jié)點知道彼此之間的關系,也會知道自己的角色,當然他們也會知道自己存在與一個集群環(huán)境中,他們彼此之間可以交互和通信, ong。那么這些關系都會保存到某個配置文件中,每個節(jié)點都有,這個我們在搭建的時候會做配置的。
客戶端要和集群建立連接的話,只需要和其中一個建立關系就行。
某個節(jié)點掛了,也是通過超過半數(shù)的節(jié)點來進行的檢測,客觀下線后主從切換,和我們之前在哨兵模式中提到的是一個道理。
Redis中存在很多的插槽,又可以稱之為槽節(jié)點,用于存儲數(shù)據(jù),這個先不管,后面再說。
修改 201 節(jié)點下 Redis 配置文件
# 開啟 cluster 集群 yes 開啟, no 關閉 cluster-enabled yes # cluster-config-file nodes-6379.conf cluster-config-file cluster 節(jié)點配置文件 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 創(chuàng)建 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
以上就是 三主三從的關系了。 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
一共是有 16384 個槽節(jié)點分配
[OK] All 16384 slots covered
如何分配的槽節(jié)點呢
將 16384 平均分配給三個Master
槽 slot 如何存儲
redis 會對每個存儲的數(shù)據(jù)的 key 進行一個 hash 然后對 16384 取模 , 計算公式 hash(key) % 16384
進入到集群的控制臺
# 查看集群的信息 redis-cli-c -a 584521 -h 192.168.1.202 -p6379 # 查看節(jié)點的信息 cluster nodes
配置 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
緩存穿透是指緩存和數(shù)據(jù)庫中都沒有的數(shù)據(jù),而用戶不斷發(fā)起請求,比如說發(fā)起一個 id 為 ‘-1’ 的數(shù)據(jù), 或者 id 特別大 又不存在的數(shù)據(jù)。 這時因為緩存中沒有數(shù)據(jù),就會導致每一次的請求都會落在數(shù)據(jù)庫上。導致數(shù)據(jù)庫壓力過大。
接口層增加校驗,如用戶鑒權校驗,對請求參數(shù)做邏輯校驗
從緩存中取不到的數(shù)據(jù),在數(shù)據(jù)庫中也取不到的數(shù)據(jù)。 這個時候也可以寫入到緩存中。k - null 的方式。 緩存有效期設置短點。 如果設置的過長,就會導致正常情況無法使用。
緩存擊穿是指緩存中沒有,但是數(shù)據(jù)庫中有的數(shù)據(jù),一般是 緩存時間到期,這個時候由于并發(fā)用戶過多, 同時緩存沒有讀到數(shù)據(jù),導致請求全部落在數(shù)據(jù)庫中,造成數(shù)據(jù)庫壓力過大。
設置熱點數(shù)據(jù)永不過期
加鎖去讀。對 key 加鎖。 當緩存中拿不到數(shù)據(jù)的時候。放開一個線程去數(shù)據(jù)庫中去讀數(shù)據(jù)。
緩存雪崩是指緩存中數(shù)據(jù)大批量到過期時間,而查詢數(shù)據(jù)量巨大,引起數(shù)據(jù)庫壓力過大甚至down機。和緩存擊穿不同的是, 緩存擊穿指并發(fā)查同一條數(shù)據(jù),緩存雪崩是不同數(shù)據(jù)都過期了,很多數(shù)據(jù)都查不到從而查數(shù)據(jù)庫。
緩存數(shù)據(jù)的過期時間設置隨機,防止同一時間大量數(shù)據(jù)過期現(xiàn)象發(fā)生。
如果緩存數(shù)據(jù)庫是分布式部署,將熱點數(shù)據(jù)均勻分布在不同緩存數(shù)據(jù)庫中。
設置熱點數(shù)據(jù)永遠不過期。
到此,關于“Redis安裝配置及整合SpringBoot的方法”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續(xù)學習更多相關知識,請繼續(xù)關注億速云網(wǎng)站,小編會繼續(xù)努力為大家?guī)砀鄬嵱玫奈恼拢?/p>
免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內(nèi)容。