您好,登錄后才能下訂單哦!
這篇文章主要介紹“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 環境, 安裝過 忽略 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 位置 拼接了默認端口參數。 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
# 在以下位置加上一段注釋 #!/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 # 數據庫 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.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 默認使用的是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作為一個主 (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
主動定時刪除
# 每秒鐘檢查 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 內存達到多少的時候。表示內存已經滿了
原來一主二從里面, 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
配置 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容量有限,數據達到一定程度會有瓶頸,這個時候可以通過水平擴展為多master 集群。
redis-cluster:他可以支撐多個master-slave,支持海量數據,實現高可用與高并發。 哨兵模式其實也是一種集群,他能夠提高讀請求的并發,但是容錯方面可能會有一些問題,比如master同步數據給slave的時候,這其實是異步復制吧,這個時候 了,那么slave上的數據就沒有master新,數據同步需要時間的,1-2秒的數據會丟失。master恢復并轉換成slave后,新數據則丟失。
每個節點知道彼此之間的關系,也會知道自己的角色,當然他們也會知道自己存在與一個集群環境中,他們彼此之間可以交互和通信, ong。那么這些關系都會保存到某個配置文件中,每個節點都有,這個我們在搭建的時候會做配置的。
客戶端要和集群建立連接的話,只需要和其中一個建立關系就行。
某個節點掛了,也是通過超過半數的節點來進行的檢測,客觀下線后主從切換,和我們之前在哨兵模式中提到的是一個道理。
Redis中存在很多的插槽,又可以稱之為槽節點,用于存儲數據,這個先不管,后面再說。
修改 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
以上就是 三主三從的關系了。 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 個槽節點分配
[OK] All 16384 slots covered
如何分配的槽節點呢
將 16384 平均分配給三個Master
槽 slot 如何存儲
redis 會對每個存儲的數據的 key 進行一個 hash 然后對 16384 取模 , 計算公式 hash(key) % 16384
進入到集群的控制臺
# 查看集群的信息 redis-cli-c -a 584521 -h 192.168.1.202 -p6379 # 查看節點的信息 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
緩存穿透是指緩存和數據庫中都沒有的數據,而用戶不斷發起請求,比如說發起一個 id 為 ‘-1’ 的數據, 或者 id 特別大 又不存在的數據。 這時因為緩存中沒有數據,就會導致每一次的請求都會落在數據庫上。導致數據庫壓力過大。
接口層增加校驗,如用戶鑒權校驗,對請求參數做邏輯校驗
從緩存中取不到的數據,在數據庫中也取不到的數據。 這個時候也可以寫入到緩存中。k - null 的方式。 緩存有效期設置短點。 如果設置的過長,就會導致正常情況無法使用。
緩存擊穿是指緩存中沒有,但是數據庫中有的數據,一般是 緩存時間到期,這個時候由于并發用戶過多, 同時緩存沒有讀到數據,導致請求全部落在數據庫中,造成數據庫壓力過大。
設置熱點數據永不過期
加鎖去讀。對 key 加鎖。 當緩存中拿不到數據的時候。放開一個線程去數據庫中去讀數據。
緩存雪崩是指緩存中數據大批量到過期時間,而查詢數據量巨大,引起數據庫壓力過大甚至down機。和緩存擊穿不同的是, 緩存擊穿指并發查同一條數據,緩存雪崩是不同數據都過期了,很多數據都查不到從而查數據庫。
緩存數據的過期時間設置隨機,防止同一時間大量數據過期現象發生。
如果緩存數據庫是分布式部署,將熱點數據均勻分布在不同緩存數據庫中。
設置熱點數據永遠不過期。
到此,關于“Redis安裝配置及整合SpringBoot的方法”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。