Linux下的redis源碼安裝
redis介紹
Redis 是一個開源(BSD許可)的,內存中的數據結構存儲系統,它可以用作數據庫、緩存和消息中間件。它支持多種類型的數據結構,如 字符串(strings), 散列(hashes), 列表(lists), 集合(sets),帶有范圍查詢的 有序集合(sorted sets) , bitmaps, hyperloglogs 和 地理空間(geospatial) 索引。 Redis 內置了 復制(replication), LUA腳本(Lua scripting), LRU驅動事件(LRU eviction), 事務(transactions) 和不同級別的 磁盤持久化(persistence), 并通過 Redis哨兵(Sentinel) 和自動 分區(Cluster)提供高可用性(high availability)
摘自:https://redis.com.cn/
下載源碼
redis github: https://github.com/redis/redis
redis源碼包:http://download.redis.io/releases/
注1:推薦從
redis源碼包
下載,本篇以redis-7.2.4版本安裝為例
注2:為保護redis配置文件不能被用戶隨便修改,同時避免創建太多用戶,選中在root用戶下安裝
安裝說明
# 下載軟件包,解壓并移動目標位置
[root@Ali ~]# wget http://download.redis.io/releases/redis-7.2.4.tar.gz
[root@Ali ~]# mv redis-7.2.4 /usr/local/redis# 安裝依賴
[root@QingYun redis]# sudo yum install build-essential
[root@QingYun redis]# sudo yum install gcc-c++
[root@QingYun redis]# sudo yum install tcl# 編譯安裝redis
[root@Ali ~]# cd /usr/local/redis/
[root@Ali redis]# make
[root@Ali redis]# make install# 查看redis版本
[root@Ali redis]# redis-server --version
Redis server v=7.2.4 sha=00000000:0 malloc=jemalloc-5.3.0 bits=64 build=610222ebf82018c4# 檢查安裝正確性(注:可選操作,耗時比較久,生產環境下建議還是要執行的)
[root@Ali redis]# make test
注: 不建議使用‘
PREFIX
參數指定執行文件的安裝位置
原因:假設 使用PREFIX=/usr/local/redis
,則編譯生產的redis-server
、redis-client
等文件會生成到/usr/local/redis/bin/
目錄下。 但/usr/local/redis/bin/
并不在系統默認$PATH
環境變量中,這就導致無法執行運行redis的命令,還需要把該路徑加到環境變量,反而更麻煩并且也不簡潔。
入門介紹
目錄結構
/usr/local/redis/
目錄下的包含了redis的全部源碼,以下為目錄結構的簡單說明
目錄/文件 | 說明 |
---|---|
deps | Hiredis 模塊(輕量級訪問redis的客戶端),linenoise模塊(命令行編輯輔助,能實現自動補全) ,字典的定義實現,sds的定義實現,redis封裝的malloc,Lua等 |
src | 核心源碼,大多功能都在這塊實現,其中Redis自行實現了網絡框架在這個目錄中(ae_開頭的文件),Redis并未使用libevent作為網絡模塊 |
tests | 測試模塊,用來測試Redis的代碼,大多測試用例和腳本都在這里面 |
utils | Redis的工具實現 |
redis.conf | Redis官方源碼默認提供的配置文件 |
Makefile | Redis C語言編譯使用的Makefile,當然你也可以使用Cmake進行管理,當然Cmake支持的不是很好 |
配置文件
在目錄/usr/local/redis
下有一個redis.conf
的配置文件。這里列舉下比較重要的配置項
配置項名稱 | 配置項值范圍 | 說明 |
---|---|---|
daemonize | yes、no | yes表示啟用守護進程,默認是no即不以守護進程方式運行。其中Windows系統下不支持啟用守護進程方式運行 |
port | 指定 Redis 監聽端口,默認端口為 6379 | |
bind | 綁定的主機地址,如果需要設置遠程訪問則直接將這個屬性備注下或者改為bind * 即可,這個屬性和下面的protected-mode控制了是否可以遠程訪問 。 | |
protected-mode | yes 、no | 保護模式,該模式控制外部網是否可以連接redis服務,默認是yes,所以默認我們外網是無法訪問的,如需外網連接rendis服務則需要將此屬性改為no。 |
timeout | 300 | 當客戶端閑置多長時間后關閉連接,如果指定為 0,表示關閉該功能 |
loglevel | debug、verbose、notice、warning | 日志級別,默認為 notice |
databases | 16 | 設置數據庫的數量,默認的數據庫是0。整個通過客戶端工具可以看得到 |
rdbcompression | yes、no | 指定存儲至本地數據庫時是否壓縮數據,默認為 yes,Redis 采用 LZF 壓縮,如果為了節省 CPU 時間,可以關閉該選項,但會導致數據庫文件變的巨大。 |
dbfilename | dump.rdb | 指定本地數據庫文件名,默認值為 dump.rdb |
dir | 指定本地數據庫存放目錄 | |
requirepass | 設置 Redis 連接密碼,如果配置了連接密碼,客戶端在連接 Redis 時需要通過 AUTH 命令提供密碼,默認關閉 | |
maxclients | 0 | 設置同一時間最大客戶端連接數,默認無限制,Redis 可以同時打開的客戶端連接數為 Redis 進程可以打開的最大文件描述符數,如果設置 maxclients 0,表示不作限制。當客戶端連接數到達限制時,Redis 會關閉新的連接并向客戶端返回 max number of clients reached 錯誤信息。 |
maxmemory | XXX | 指定 Redis 最大內存限制,Redis 在啟動時會把數據加載到內存中,達到最大內存后,Redis 會先嘗試清除已到期或即將到期的 Key,當此方法處理 后,仍然到達最大內存設置,將無法再進行寫入操作,但仍然可以進行讀取操作。Redis 新的 vm 機制,會把 Key 存放內存,Value 會存放在 swap 區。配置項值范圍列里XXX為數值。 |
通常情況下我們都需要把redis
當成服務在后臺運行,因此這里通常需要改動幾個配置項:
daemonize
設置為yes
:redis
默認在控制臺上運行,一旦中斷redis-server
命令(Ctrl + C
)或者退出控制臺redis
服務會自動關閉。建議改成yes
啟用守護運行方式。protected-mode
設置為no
,同時也將bind注釋:關閉保護模式和允許所有客戶端鏈接,這樣redis才能對外提供服務。logfile
設置為log/redis_run.log
:使用守護方式運行后,redis默認不會記錄日志,建議配置開啟日志logfile
設置為log/redis_run.log
:使用守護方式運行后,redis默認不會記錄日志,建議配置開啟日志
啟動服務
# 查看redis使用說明
[root@Ali redis]# redis-server --help# 啟動redis服務(必須在root用戶下)
[root@Ali redis]# redis-server redis.conf
[root@Ali redis]# cat log/redis_run.log
25171:C 11 May 2024 00:12:02.692 # WARNING Memory overcommit must be enabled! Without it, a background save or replication may fail under low memory condition. Being disabled, it can also cause failures without low memory condition, see https://github.com/jemalloc/jemalloc/issues/1328. To fix this issue add 'vm.overcommit_memory = 1' to /etc/sysctl.conf and then reboot or run the command 'sysctl vm.overcommit_memory=1' for this to take effect.
25172:C 11 May 2024 00:12:02.693 * oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
25172:C 11 May 2024 00:12:02.693 * Redis version=7.2.4, bits=64, commit=00000000, modified=0, pid=25172, just started
25172:C 11 May 2024 00:12:02.693 * Configuration loaded
25172:M 11 May 2024 00:12:02.694 * monotonic clock: POSIX clock_gettime
25172:M 11 May 2024 00:12:02.694 * Running mode=standalone, port=6379.
25172:M 11 May 2024 00:12:02.694 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.
25172:M 11 May 2024 00:12:02.695 * Server initialized
25172:M 11 May 2024 00:12:02.695 * Loading RDB produced by version 7.2.4
25172:M 11 May 2024 00:12:02.695 * RDB age 17 seconds
25172:M 11 May 2024 00:12:02.695 * RDB memory usage when created 0.87 Mb
25172:M 11 May 2024 00:12:02.695 * Done loading RDB, keys loaded: 1, keys expired: 0.
25172:M 11 May 2024 00:12:02.695 * DB loaded from disk: 0.000 seconds
25172:M 11 May 2024 00:12:02.695 * Ready to accept connections tcp# 查看redis服務(方式1)
[root@Ali redis]# ps -aux | grep redis
root 25172 0.0 0.1 239328 3420 ? Ssl 00:12 0:00 redis-server 127.0.0.1:6379
root 25183 0.0 0.0 112816 984 pts/2 S+ 00:12 0:00 grep --color=auto redis
# 查看redis服務(方式2)
[root@Ali redis]# netstat -tunple | grep 6379
tcp 0 0 127.0.0.1:6379 0.0.0.0:* LISTEN 0 12747989 25172/redis-server
tcp6 0 0 ::1:6379 :::* LISTEN 0 12747990 25172/redis-server
[root@Ali redis]# # 使用redis服務(可以在非root用戶下使用)
[wengjh@Ali redis]$ redis-cli
127.0.0.1:6379> get hostname
(nil)
127.0.0.1:6379> set hostname "aliyun"
OK
127.0.0.1:6379> get hostname
"aliyun"# 插入redis 配置
[wengjianhong@Ali redis]$ redis-cli
127.0.0.1:6379> CONFIG GET daemonize
1) "daemonize"
2) "yes"
127.0.0.1:6379> CONFIG GET logfile
1) "logfile"
2) "log/redis_run.log"
127.0.0.1:6379> CONFIG GET *# 關閉redis服務
127.0.0.1:6379> SHUTDOWN
not connected>
其他命令
Redis的命令有很多,網上也有很多好的教程,這里沒有打算也沒有必要一一介紹。以下是幾個比較好用的網站
Redis教程:
- https://redis.io/docs/latest/
- https://redis.com.cn/tutorial.html
Redis命令參考:
- http://doc.redisfans.com/
- https://redis.io/docs/latest/commands/
- https://redis.com.cn/commands.html