Redis單例項安裝
Redis(Remote Dictionary Server)是一個開源的記憶體資料庫,遵守 BSD 協議,它提供了一個高效能的鍵值(key-value)儲存系統,常用於快取、訊息佇列、會話儲存等應用場景。
- 效能極高:Redis 以其極高的效能而著稱,能夠支援每秒數十萬次的讀寫操作24。這使得Redis成為處理高併發請求的理想選擇,尤其是在需要快速響應的場景中,如快取、會話管理、排行榜等。
- 豐富的資料型別:Redis 不僅支援基本的鍵值儲存,還提供了豐富的資料型別,包括字串、列表、集合、雜湊表、有序集合等。這些資料型別為開發者提供了靈活的資料操作能力,使得Redis可以適應各種不同的應用場景。
- 原子性操作:Redis 的所有操作都是原子性的,這意味著操作要麼完全執行,要麼完全不執行。這種特性對於確保資料的一致性和完整性至關重要,尤其是在高併發環境下處理事務時。
- 持久化:Redis 支援資料的持久化,可以將記憶體中的資料儲存到磁碟中,以便在系統重啟後恢復資料。這為 Redis 提供了資料安全性,確保資料不會因為系統故障而丟失。
- 支援釋出/訂閱模式:Redis 內建了釋出/訂閱模式(Pub/Sub),允許客戶端之間透過訊息傳遞進行通訊。這使得 Redis 可以作為訊息佇列和實時資料傳輸的平臺。
- 單執行緒模型:儘管 Redis 是單執行緒的,但它透過高效的事件驅動模型來處理併發請求,確保了高效能和低延遲。單執行緒模型也簡化了併發控制的複雜性。
- 主從複製:Redis 支援主從複製,可以透過從節點來備份資料或分擔讀請求,提高資料的可用性和系統的伸縮性。
- 應用場景廣泛:Redis 被廣泛應用於各種場景,包括但不限於快取系統、會話儲存、排行榜、實時分析、地理空間資料索引等。
- 社群支援:Redis 擁有一個活躍的開發者社群,提供了大量的文件、教程和第三方庫,這為開發者提供了強大的支援和豐富的資源。
- 跨平臺相容性:Redis 可以在多種作業系統上執行,包括 Linux、macOS 和 Windows,這使得它能夠在不同的技術棧中靈活部署。
安裝編譯環境
# ubuntu
apt install make gcc
# centos
yum install make gcc
安裝 Redis
# 檢視 Redis 版本
http://download.redis.io/releases/
# 下載 Redis
wget http://download.redis.io/releases/redis-7.2.5.tar.gz
# 解壓
tar xvf redis-7.2.5.tar.gz
cd redis-7.2.5/
# 進行編譯
make && make install
配置服務
cat << EOF > /usr/lib/systemd/system/redis.service [Unit] Description=Redis persistent key-value database After=network.target After=network-online.target Wants=network-online.target [Service] ExecStart=/usr/local/bin/redis-server /usr/local/redis/redis.conf --supervised systemd ExecStop=/usr/local/redis/redis-shutdown Type=forking User=redis Group=redis RuntimeDirectory=redis RuntimeDirectoryMode=0755 LimitNOFILE=65536 PrivateTmp=true [Install] WantedBy=multi-user.target EOF
配置停止指令碼
mkdir /usr/local/redis
vim /usr/local/redis/redis-shutdown
#!/bin/bash
#
# Wrapper to close properly redis and sentinel
test x"$REDIS_DEBUG" != x && set -x
REDIS_CLI=/usr/local/bin/redis-cli
# Retrieve service name
SERVICE_NAME="$1"
if [ -z "$SERVICE_NAME" ]; then
SERVICE_NAME=redis
fi
# Get the proper config file based on service name
CONFIG_FILE="/usr/local/redis/$SERVICE_NAME.conf"
# Use awk to retrieve host, port from config file
HOST=`awk '/^[[:blank:]]*bind/ { print $2 }' $CONFIG_FILE | tail -n1`
PORT=`awk '/^[[:blank:]]*port/ { print $2 }' $CONFIG_FILE | tail -n1`
PASS=`awk '/^[[:blank:]]*requirepass/ { print $2 }' $CONFIG_FILE | tail -n1`
SOCK=`awk '/^[[:blank:]]*unixsocket\s/ { print $2 }' $CONFIG_FILE | tail -n1`
# Just in case, use default host, port
HOST=${HOST:-127.0.0.1}
if [ "$SERVICE_NAME" = redis ]; then
PORT=${PORT:-6379}
else
PORT=${PORT:-26739}
fi
# Setup additional parameters
# e.g password-protected redis instances
[ -z "$PASS" ] || ADDITIONAL_PARAMS="-a $PASS"
# shutdown the service properly
if [ -e "$SOCK" ] ; then
$REDIS_CLI -s $SOCK $ADDITIONAL_PARAMS shutdown
else
$REDIS_CLI -h $HOST -p $PORT $ADDITIONAL_PARAMS shutdown
fi
授權啟動服務
chmod +x /usr/local/redis/redis-shutdown useradd -s /sbin/nologin redis cp /root/redis-7.2.5/redis.conf /usr/local/redis/ && chown -R redis:redis /usr/local/redis mkdir -p /usr/local/redis/data && chown -R redis:redis /usr/local/redis/data
修改配置
bind 0.0.0.0 -::1 # 監聽ip,多個ip用空格分隔 daemonize yes # 允許後臺啟動 logfile "/usr/local/redis/redis.log" # 日誌路徑 dir /usr/local/redis/data # 資料庫備份檔案存放目錄 requirepass 123123 # 設定連線密碼 appendonly yes # 在/usr/local/redis/data目錄生成appendonly.aof檔案,將每一次寫操作請求都追加到appendonly.aof 檔案中
修改linux核心引數
# 臨時生效
sysctl -w vm.overcommit_memory=1
# 永久生效
echo 'vm.overcommit_memory=1' >> /etc/sysctl.conf && sysctl -p
### 可選值:0,1,2。
# 0,:表示核心將檢查是否有足夠的可用記憶體供應用程序使用;如果有足夠的可用記憶體,記憶體申請允許;否則,記憶體申請失敗,並把錯誤返回給應用程序。
# 1:表示核心允許分配所有的實體記憶體,而不管當前的記憶體狀態如何。
# 2: 表示核心允許分配超過所有實體記憶體和交換空間總和的記憶體。
啟動 Redis
systemctl daemon-reload systemctl enable redis systemctl start redis systemctl status redis
檢視叢集
# 互動式
redis-cli -h 192.168.1.21 -a 123123
192.168.1.21:6379> info replication
role:master
connected_slaves:0
master_failover_state:no-failover
master_replid:9d6563f8b2cf7300bc82890838b877eceae2d8bf
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
192.168.1.21:6379>
# 互動式
redis-cli -h 192.168.1.21
192.168.1.21:6379>
192.168.1.21:6379> info replication
NOAUTH Authentication required.
192.168.1.21:6379>
192.168.1.21:6379>
192.168.1.21:6379> auth 123123
OK
192.168.1.21:6379>
192.168.1.21:6379> info replication
# Replication
role:master
connected_slaves:0
master_failover_state:no-failover
master_replid:9d6563f8b2cf7300bc82890838b877eceae2d8bf
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
192.168.1.21:6379>
192.168.1.21:6379>
# 非互動式
redis-cli -h 192.168.1.21 -a 123123 info replication
壓測
root@cby:~# redis-benchmark -t set,get -n 100000 -a 123123 -h 192.168.1.21 ====== SET ====== 100000 requests completed in 0.85 seconds 50 parallel clients 3 bytes payload keep alive: 1 host configuration "save": 3600 1 300 100 60 10000 host configuration "appendonly": yes multi-thread: no Latency by percentile distribution: 0.000% <= 0.095 milliseconds (cumulative count 13) 50.000% <= 0.287 milliseconds (cumulative count 52749) 75.000% <= 0.343 milliseconds (cumulative count 77482) 87.500% <= 0.367 milliseconds (cumulative count 88051) 93.750% <= 0.383 milliseconds (cumulative count 94598) 96.875% <= 0.399 milliseconds (cumulative count 97691) 98.438% <= 0.407 milliseconds (cumulative count 98450) 99.219% <= 0.423 milliseconds (cumulative count 99272) 99.609% <= 0.455 milliseconds (cumulative count 99612) 99.805% <= 0.599 milliseconds (cumulative count 99816) 99.902% <= 0.911 milliseconds (cumulative count 99903) 99.951% <= 1.039 milliseconds (cumulative count 99952) 99.976% <= 1.303 milliseconds (cumulative count 99977) 99.988% <= 1.343 milliseconds (cumulative count 99988) 99.994% <= 1.367 milliseconds (cumulative count 99995)