redis 安裝與安裝中遇到的錯誤
redis 安裝
wget http://download.redis.io/releases/redis-4.0.11.tar.gz tar xzf redis-4.0.11.tar.gz cd redis-4.0.11 make
啟動服務端
src/redis-server
客戶端連接與測試
src/redis-cli redis> set foo bar OK redis> get foo "bar"
redis常用命令
redis-cli
-h 指定遠程登陸ip -p 指定遠程redis訪問端口 -n 指定庫b編號 -a 指定密碼 示例 ./redis-cli -h 127.0.0.1 -p 6379 -n 3 -a djx
遠程執行命令
清空所有的數據
./redis-cli -h 127.0.0.1 -p 6379 -n 3 -a djx flushall
redis 常用配置
redis設置密碼
臨時生效
在命令行用 config set requirepass password 來進行設置。重啟redis后即失效。
[root@djx2 src]# ./redis-cli 127.0.0.1:6379> config set requirepass djx OK 127.0.0.1:6379> config get requirepass (error) NOAUTH Authentication required. 127.0.0.1:6379> auth djx OK 127.0.0.1:6379> config get requirepass 1) "requirepass" 2) "djx"
永久生效
通過在redis的配置文件redis.conf 進行配置,在配置文件中有個參數: requirepass 這個就是配置redis訪問密碼的參數;
requirepass password
然后我們啟動的時候需要指定我們的配置文件進行啟動。
redis-server /etc/redis.conf
redis 指定端口
默認是6379,我們可以更改成公司內部統一的端口。
port 6379
redis 指定監聽
redis 默認綁定的是 127.0.0.1 ,也就是只能本地訪問了,如果我們需要讓外網也可以進行訪問,那么我們需要更改默認的綁定。
bind 0.0.0.0
這樣我們就可以讓應用訪問了。
redis 指定日志文件存放位置
默認日志文件的存放位置是為空的,也就是直接在控制台輸出了。
我們可以在logfile中配置日志文件路徑。
logfile "/var/log/redis.log"
redis 指定數據存放位置(要指定)
在redis.conf 的
# The filename where to dump the DB
dbfilename dump.rdb #指定數據存放的文件名稱
# The working directory.
#
# The DB will be written inside this directory, with the filename specified
# above using the 'dbfilename' configuration directive. # # The Append Only File will also be created inside this directory. # # Note that you must specify a directory here, not a file name. dir ./ #指定數據存放的位置。
創建目錄
mkdir /opt/redis/data/ 在配置文件中指定目錄 dir /opt/redis/data/
redis 開啟rdbchecksum
該參數,在3.2版本和4.0版本是默認開啟的,但是在2.4版本中是沒有開啟的,該參數我們進行使用dump.rdb文件時是有作用的,因為在使用dump.rdb 的時候有該值是會效驗該文件的完整性。rdbchecksum設置為no的話就不會效驗該文件的完整性。
redis 后台運行
我們可以使用nohup和& 讓redis在后台正常運行,並寫入日志到/var/log/redis.log
nohup ./src/redis-server ./redis.conf >>/var/log/redis.log 2>&1 &
安全配置
- 如果只是內網使用的話,我們可以只監聽本地,也就是 bind 127.0.0.1.
- 設置訪問密碼,密碼設置復雜點,requirepass
- 使用專門的用戶來運行 Redis,不要使用 root。
useradd -M -s /sbin/nologin [username]
- 隱藏重要命令
Redis 無權限分離,其管理員賬號和普通賬號無明顯區分。攻擊者登錄后可執行任意操作,因此需要隱藏以下重要命令:FLUSHDB, FLUSHALL, KEYS,PEXPIRE, DEL, CONFIG, SHUTDOWN, BGREWRITEAOF, BGSAVE, SAVE, SPOP, SREM, RENAME,DEBUG, EVAL
。
我們可以隱藏,也可以將這些命令設置為復雜的字符。
隱藏命令和重命名命令需要在 配置文件中配置 redis.conf。
隱藏命令
rename-command CONFIG ""
rename-command FLUSHALL ""
rename-command FLUSHDB ""
rename-command SHUTDOWN ""
重命名命令
rename-command CONFIG FYConfigdjx rename-command FLUSHALL FYFlushalldjx rename-command FLSUHDB FYFlushdbdjx rename-command SHUTDOWN FYShutdowndjx
安裝中遇到的錯誤
錯誤1 gcc 編譯器沒有安裝
解決辦法 : 安裝gcc 編譯器
yum install gcc -y
錯誤2 jemalloc/jemalloc.h: No such file or directory。 (注意,這里需要特別注意)
針對這個錯誤,我們可以在README.md 文件中看到解釋。
--------- Selecting a non-default memory allocator when building Redis is done by setting the `MALLOC` environment variable. Redis is compiled and linked against libc malloc by default, with the exception of jemalloc being the default on Linux systems. This default was picked because jemalloc has proven to have fewer fragmentation problems than libc malloc. To force compiling against libc malloc, use: % make MALLOC=libc To compile against jemalloc on Mac OS X systems, use: % make MALLOC=jemalloc Verbose build -------------
網上大部分解決辦法都是錯誤的,如下文:
centos(錯誤解決辦法)
make MALLOC=libc
正確解決辦法(針對2.2以上的版本)
make distclean && make
導致出現這個錯誤的原因
錯誤的本質是我們在開始執行make 時遇到了錯誤(大部分是由於gcc未安裝),然后我們安裝好了gcc 后,我們再執行make ,這時就出現了jemalloc/jemalloc.h: No such file or directory。這是因為上次的
編譯失敗,有殘留的文件,我們需要清理下,然后重新編譯就可以了。
網上的解決辦法是有什么錯誤嗎?
網上的解決辦法雖然最后也是可以成功安裝好 redis ,但是是有一些隱患的,首先我們要知道redis 需要使用內存分配器的, make MALLOC=jemalloc 就是指定內存分配器為 jemalloc ,make MALLOC=libc 就是指定內存分配器為 libc ,這個是有安全隱患的,jemalloc 內存分配器在實踐中處理內存碎片是要比libc 好的,而且在README.md 文檔也說明到了,jemalloc內存分配器也是包含在源碼包里面的,可以在deps 目錄下看到 jemalloc 目錄。
以上就是我在安裝的時候遇到的問題,后續如果還有其他會繼續補充。