Redis本地/遠(yuǎn)程(外部)連接失敗問題及解決
問題現(xiàn)象
今天在 192.168.2.220(windows服務(wù)器)上安裝并啟動(dòng)了一個(gè) Redis服務(wù),如下:
點(diǎn)擊 redis-server.exe:

啟動(dòng)成功:

然后在192.168.2.101(本地) 連接 192.168.2.220 的 Redis服務(wù),出現(xiàn)報(bào)錯(cuò),如下:

隨后,啟動(dòng)本地的java項(xiàng)目,配置 Redis,如下:


然后訪問需要使用到 Redis服務(wù) 的接口,出現(xiàn)如下報(bào)錯(cuò):

問題分析
1.報(bào)錯(cuò)信息
根據(jù)報(bào)錯(cuò)信息可知,大概意思就是說:
該 Redis連接 是以 “protected” 模式(mode),該模式具有以下的特點(diǎn):沒有綁定可具體的ip地址,訪問cli工具不需要認(rèn)證密碼,該模式下只支持“loopback”(回環(huán))接口的調(diào)用。
//注:回環(huán)的意思大概就是說,只能在配置了redis的機(jī)器上訪問redis連接,而不允許外部ip連接。
如果你想要連接該redis服務(wù),你需要采用以下其中一種解決方法:
方案1.2.3:前三種的意思幾乎一致,都是說讓你去修改該 Redis的配置 ,讓Redis以“protected-mode no”的配置來啟動(dòng)。
方案4:修改該 Redis的配置,讓Redis綁定一個(gè)ip地址或一個(gè)認(rèn)證密碼。

2.知識(shí)點(diǎn)分析
2.1Redis 的配置文件的區(qū)別
可以看到有兩個(gè)配置文件:

那該使用哪個(gè)呢?那就來說說 redis.windows.conf 和 redis.windows-service.conf 的區(qū)別:
查閱網(wǎng)上資料發(fā)現(xiàn),網(wǎng)上流傳著這樣的說法:“當(dāng)redis安裝后,就會(huì)在系統(tǒng)服務(wù)中出現(xiàn)一個(gè)名為Redis的服務(wù),通過點(diǎn)擊啟動(dòng)來啟動(dòng)Redis”
通過 win+r 中,輸入 compmgmt.msc ,打開管理工具點(diǎn)擊服務(wù),可以找到redis服務(wù),然后看見類似下圖:

通過這個(gè)圖片可以看到,這個(gè)名為Redis的系統(tǒng)服務(wù),默認(rèn)是使用了 “redis.windows-service.conf ” 這個(gè)配置文件來啟動(dòng)的。
奇怪的是我看了一下卻沒有Redis這個(gè)系統(tǒng)服務(wù)。。。。。。好吧,有可能是Redis的版本的問題:

問題不大,因?yàn)槲覀兤鋵?shí)完全就沒必要把redis變成一個(gè)系統(tǒng)服務(wù),從而實(shí)現(xiàn)開機(jī)自啟動(dòng)(后臺(tái));我覺得想用的時(shí)候,直接點(diǎn)擊 redis-server.exe 啟動(dòng) 不香么???
現(xiàn)在要思考的問題其實(shí)是:當(dāng)我們點(diǎn)擊 redis-server.exe 啟動(dòng) Redis 時(shí),會(huì)不會(huì)也是使用了 “redis.windows-service.conf ” 這個(gè)配置文件來啟動(dòng)的呢?
我猜想:redis-server.exe 啟動(dòng) Redis 時(shí)是使用“redis.windows.conf ”這個(gè)配置文件來啟動(dòng)的,否則,這個(gè)文件就沒有存在的意義了。
搜了很久,沒有在網(wǎng)上找到對應(yīng)的資料,于是就自己來實(shí)驗(yàn)一下吧?。。。。?!
2.2Redis 的 bind 配置
首先我們打開 redis.windows-service.conf,可以看見默認(rèn)綁定了127.0.0.1(本地ip地址)


redis 中的 bind 配置作用就是:
- 配置該redis連接 的 固定ip,配置完之后,就只有它綁定的那這個(gè) ip 能訪問到該redis連接;其他ip就不能。
- 而由于 redis 默認(rèn)綁定了 127.0.0.1 ,也就是只有 127.0.0.1 所映射的(192.168.2.220)這個(gè)ip能訪問該 redis,其他ip就不能;
- 因此這個(gè)配置會(huì)阻礙外部(192.168.2.101)對該 redis的訪問。
2.3Redis 的 protected-mode 配置
在 “redis.windows-service.conf ” 文件中,可以找到如下配置:

通過查看注解,我們可以知道:
- 該配置是默認(rèn)啟動(dòng)(enabled)的;
- 如果你想讓其他主機(jī)(ip)連接該redis,則必須設(shè)置該配置為不可用的(disable),即使你不配置認(rèn)證密碼,也沒有 通過 bind 配置綁定外部ip地址
- 由此可知:該配置就是用于限制外部ip訪問的,且要和 bind 配置一起使用。
心得
從上面的知識(shí)點(diǎn)可知,要解決問題,就需要對 redis的配置文件中的 bind 和 protected-mode 配置進(jìn)行修改。
配置步驟
步驟1:打開 “redis.windows-service.conf ” 文件,為Redis綁定一個(gè)ip地址:
//注:我們一般都不需要在訪問redis時(shí)使用到認(rèn)證密碼,所以沒有要求的話,可以不配置
把該bing 配置(bind 127.0.0.1)注釋掉,這樣就能讓所有ip都能訪問到這個(gè)redis,修改如下:

步驟2:打開 “redis.windows-service.conf ” 文件,修改Redis的 protected-mode 配置:
下拉,找到 protected-mode 配置,修改為如下:

然后把原來的redis服務(wù)關(guān)閉,再點(diǎn)擊redis-server.exe 啟動(dòng)。
然后再在本地(192.168.2.101)連接 192.168.2.220 的 Redis服務(wù),出現(xiàn)如下報(bào)錯(cuò):

再調(diào)用接口試試,發(fā)現(xiàn)還是報(bào)錯(cuò):

好了,接下來就是驗(yàn)證實(shí)驗(yàn)的時(shí)刻了
1. 關(guān)閉redis窗口,將“redis.windows-service.conf ” 還原成初始狀態(tài);
2. 將以上步驟應(yīng)用到 “redis.windows.conf” 這個(gè)配置文件上;
3. 點(diǎn)擊 redis-server.exe 啟動(dòng);

發(fā)現(xiàn)還是會(huì)報(bào)同樣的錯(cuò)誤,那就不知道是為什么了。。。尷尬
于是,我又把“redis.windows.conf” 和 “redis.windows-service.conf ” 兩個(gè)配置文件都做了修改,然后再點(diǎn)擊 redis-server.exe 啟動(dòng),結(jié)果還是不行;
這樣就不好說問題出在哪里,但是能確定的是:這兩個(gè)配置文件的修改都沒有生效?。。。。。?/strong>
必殺技
自己寫個(gè)啟動(dòng)腳本(redis-start.bat),配置redis的啟動(dòng)命令并指定了配置文件,來啟動(dòng)redis,終于可以了:

雙擊 “redis-start.bat” 文件

啟動(dòng)成功:

接口調(diào)用成功:


注意:這里不要指定 “redis.windows-service.conf ” 配置文件,否則會(huì)出現(xiàn)以下情況:

雖然啟動(dòng)了,但是一片黑暗,啥信息都看不到,由此似乎可以證明了我的猜想:
redis-server.exe 啟動(dòng) Redis 時(shí)是使用“redis.windows.conf ”這個(gè)配置文件來啟動(dòng)的
因?yàn)椋?strong>redis-server.exe 啟動(dòng) Redis 時(shí),是有信息可以看見的,所以說 :
“redis.windows-service.conf ” 這個(gè)配置文件,應(yīng)該是用來將Redis配置成一個(gè)windows系統(tǒng)服務(wù)而存在的?。?!
總之,最靠譜的方法,還是用腳本啟動(dòng)?。?!
解決方法
1. 打開 “redis.windows???????” 文件,把該bing 配置(bind 127.0.0.1)注釋掉:


2. 修改Redis的 protected-mode 配置 為 protected-mode no ,如下:

3. 創(chuàng)建啟動(dòng)腳本文件(redis-start.bat),寫入啟動(dòng)命令并指定配置文件:

4. 雙擊 “redis-start.bat” 文件啟動(dòng):


5. 訪問接口成功:

總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Redis遍歷海量數(shù)據(jù)集的幾種實(shí)現(xiàn)方法
Redis作為一個(gè)高性能的鍵值存儲(chǔ)數(shù)據(jù)庫,廣泛應(yīng)用于各種場景,包括緩存、消息隊(duì)列、排行榜,本文主要介紹了Redis遍歷海量數(shù)據(jù)集的幾種實(shí)現(xiàn)方法,文中通過示例代碼介紹的非常詳細(xì),需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2024-02-02
Redis實(shí)現(xiàn)分布式事務(wù)的示例
Redis雖不支持傳統(tǒng)SQL數(shù)據(jù)庫ACID特性的事務(wù),但提供了事務(wù)特性,允許多命令捆綁執(zhí)行,通過命令MULTI、EXEC、DISCARD、WATCH實(shí)現(xiàn),感興趣的可以了解一下2024-10-10
在Redis數(shù)據(jù)庫中實(shí)現(xiàn)分布式速率限制的方法
這篇文章主要介紹了在Redis數(shù)據(jù)庫中實(shí)現(xiàn)分布式速率限制的方法,文中展示了一個(gè)用Python編寫的應(yīng)用示例,需要的朋友可以參考下2015-06-06
Redis+threading實(shí)現(xiàn)多線程消息隊(duì)列的使用示例
Redis多線程消息隊(duì)列是一種使用Redis作為存儲(chǔ)后端的消息隊(duì)列實(shí)現(xiàn),它利用Redis的線程并發(fā)處理能力來提高消息隊(duì)列的處理效率,本文主要介紹了Redis+threading實(shí)現(xiàn)多線程消息隊(duì)列的使用示例,感興趣的可以了解一下2023-12-12

