昨天在阿里雲免費領了一個月的雲服務器,就着最近學的SpringBoot,准備做一個SpringBoot與Redis的整合。
因為以前用的Redis都是安裝在本地的,使用過程中沒遇到什么大問題,可是一旦部署到真實的雲服務器上就出現了一大堆問題,且聽我慢慢道來。
在安裝Redis前,雲服務器實例是完全純凈的。首先執行下面的命令下載並安裝redis:
//下載
wget http://download.redis.io/releases/redis-4.0.9.tar.gz
//解壓
tar xzf redis-4.0.9.tar.gz
//進入解壓后的目錄
cd redis-4.0.9
//安裝到當前目錄
make
如果make失敗,一般是系統中還未安裝gcc造成的,因為Redis是用C語言寫成的,所以需要先通過yum install gcc安裝C語言環境。
安裝Redis后,先別慌着啟動,因為Redis對遠程連接要求比較苛刻,具體到以下幾點:
Redis服務默認只讓本機訪問,因為現在Redis是在人家阿里雲的服務器上,所以需要修改成讓外網也能訪問。主要是修改Redis的默認配置文件reidis.conf。
- 注釋掉bind 127.0.0.1這一行,這樣可以使所有的ip訪問redis
- 修改 protected-mode,值改為no,生產環境下要改為yes
- 為了Redis的安全,需要把#requirepass foobared去掉注釋,foobared改為自己的密碼,例如可以改為requirepass 123456
經過以上幾步后,理論上就可以通過外網訪問到雲服務器上的Redis了。如果現在去啟動Redis的服務端,會發現Redis只能是前台啟動,在這里可以通過修改redis.conf里的daemonize為yes讓redis開啟后台啟動。
因為redis采用的是單進程多線程的模式。當redis.conf中選項daemonize設置成yes時,代表開啟守護進程模式。在該模式下,redis會在后台運行,並將進程pid號寫入至redis.conf選項pidfile設置的文件中,此時redis將一直運行,除非手動kill該進程。
在修改完配置文件后,我們進入redis-4.0.9的scr目錄,執行以下命令啟動Redis的服務端:
./redis-server ../redis.conf
這樣Redis就在雲服務器上以后台的方式啟動了,接下來我在本地快速搭建了一個SpringBoot整合Redis的案例。在application.properties添加如下內容:
#設置redis主機ip
spring.redis.host= #你的雲服務器IP地址
#連接redis服務的密碼
spring.redis.password= #剛剛在redis.conf中設置的密碼
添加controller如下:
@RestController
public class TestRedis {
@Autowired
private StringRedisTemplate strTplRedis;
@GetMapping("/testredis")
public String testRedis(){
strTplRedis.opsForValue().set("testkey", "testvalue");
strTplRedis.opsForValue().get("testkey");
return "success";
}
}
此時我們啟動項目后,訪問localhost:8080/testredis,出現如下錯誤:

這里問題就來了,顯示無法連接到Redis,此時配置文件里面該改到的都已經改了,后來我又想到應該是防火牆的問題,因為redis的端口是6379,服務器默認是不開啟這個端口的,所以我執行下面命令關閉了防火牆:
sudo service iptables stop
重新訪問url,發現還是報同樣的錯……
於是去請教大神,經過大神的一頓排查,最后告訴我應該是我服務器的安全組規則的問題。
原來,新建的阿里雲服務器實例,是默認不讓外網訪問的,一個實例屬於一個安全組,這個安全組里一開始有阿里雲為我們定義的規則,默認是不開放任何tcp端口的,具體的可以查看官方的介紹:添加安全組規則。
在修改好安全組規則后,再訪問頁面url,頁面顯示success,這下總算是將數據存進去了,使用Redis的桌面客戶端也能遠程連接到Redis,顯示Redis里面的數據如下:

回頭看來,遠程連接Redis的坑基本上是被我踩完了……
