Redis入門及環境搭建

一:Redis簡介

  Redis(Remote Dictionary Server 遠程字典服務)是一個開源的(BSD許可的)記憶體數據結構存儲,用作資料庫、高速快取和消息隊列代理。
  Redis提供五大基本類型和三大特殊類型數據如基本類型:字元串(String)、散列(hash)、列表(list)、集合(set)、有序集合(sorted);如特殊類型:點陣圖(bitmaps)、超長日誌(hyperloglog)、地理空間(geospatial)。Redis內置複製、Lua腳本、LRU收回、事務以及不同級別磁碟持久化功能,同時通過Redis Sentinel提供高可用,通過Redis Cluster提供自動分區。

1:為什麼在項目中使用Redis

  平常在項目中設計客戶端訪問資料庫數據時往往採用直連方式訪問資料庫,也有採用資料庫連接池技術來實現訪問,但是我們要清楚,當以萬次的訪問量同時湧入我們資料庫,或者頻繁的操作資料庫,將會對我們的資料庫造成很大的壓力;
  為了解決這一問題,早些年前Memcached(快取資料庫)脫穎而出,Memcached它是一個非關係型資料庫(NoSQL),這個資料庫在項目中可以起到快取作用,把一些經常使用的數據載入到快取資料庫中,防止了每次請求都往最終資料庫查詢數據;
  後來Memcached隨著時代的進步,Redis(NoSQL)資料庫慢慢取代了它,成為新時代的霸主,Redis不僅可以存儲簡單的key-value類型,還有各式各樣的方法類型,而且還可以持久化;所以它慢慢的以記憶體快取的形式應用到大型企業項目中;

註:C/S/D = controller/server/dao

①:單機資料庫問題:如果數據量太大導致一台伺服器放不下了那麼多數據的存儲;訪問量大幅增加導致資料庫無法支撐

  單機資料庫轉變為集群資料庫來解決問題

②:集群資料庫問題:網站一般都是以讀為目錄,雖是讀寫分離,大大提高性能,但是大量的讀操作(讀取相同數據)也會影響性能

  集群資料庫轉變為集群資料庫+快取資料庫

  一般如電商網站有10W+個用戶同時或者間接查看此熱門商品,沒有快取資料庫的支援的話,我這用戶全部去請求MySQL資料庫,這樣會造成極大壓力,但是我們有了高性能的記憶體快取伺服器,當第一個用戶去伺服器請求熱門商品時,就把此商品保存在快取伺服器上(也可提前保存),這樣每次請求直接走快取資料庫上即可,這就是我下面要介紹的快取資料庫(Redis)每秒可並發可達10W/s

2:Redis是什麼及特點

Redis作用:
    ①:Redis是一個以Key-Value形式存儲的資料庫,可用來搭建數據唯一存儲系統
    ②:Redis是一個把數據存儲在記憶體中做高速快取,用來在應用和資料庫之間做快取,替代Memcached
    ③:Redis對複雜類型結構有著高速操作的特點,提供某些特點業務場景下的計算和展現能力,比如排行榜
Redis特點:
    ①:Redis是一個完全開源免費的,遵守BSD協議,並且是一個高性能的key-value資料庫
    ②:Redis支援資料庫的持久化操作,可以將記憶體中的數據保存到磁碟中,重啟時可以再次載入到記憶體中使用
    ③:Redis有著豐富的數據類型,並且還有三種複雜的特殊類型
Redis優勢:
    ①:性能極高 – Redis能讀的速度是110000次/s,寫的速度是81000次/s 。這主要歸功於這些數據都存在於記憶體中,並且是單執行緒
    ②:豐富的數據類型 – Redis支援二進位案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets 數據類型操作。
    ③:原子性 – Redis的所有操作都是原子性的,同時Redis還支援對幾個操作全並後的原子性執行。
    ④:豐富的特性 – Redis還支援 publish/subscribe(發布/訂閱)、通知,、key 過期、Lua 腳本、事務、Pipeline(管道,即當指令
     到達一定數量後,客戶端才會執行)等等特性。 ⑤:兼容性強 – 支援多種程式語言。支援Java、PHP、Golang、Python、Ruby、Lua、Nodejs等。 ⑥:高可用和分散式 – Redis-Sentinel(v2.8)支援高可用,Redis-Cluster(v3.0)支援分散式

3:Redis使用場景

①:快取
    這是Redis使用最多的場景,Redis可以代替Memcached,讓我們的快取只能存儲數據變為能夠更新數據,我們不再需要每次都重新生成數據
②:計數器
    比如日常網站的統計點擊次數,轉發數,評論數等,由於是單執行緒,可以避免並發問題,保證不會錯;計算器使用INCRBY命令
③:消息隊列
    相當於消息系統,運行穩定並且快速,支援模式匹配,能夠實時訂閱與取消頻道,和ActiveMQ,RocketMQ等工具類似;如果對於數據一致性要
   求高的話還是用RocketMQ等專業系統。 由於redis把數據添加到隊列是返回添加元素在隊列的第幾位,所以可以做判斷用戶是第幾個訪問這種
   業務 隊列不僅可以把並發請求變成串列,並且還可以做隊列或者棧使用 ③:位處理(大數據處理) 用於數據量上億的場景下,例如幾億用戶系統的簽到,去重登錄次數統計,某用戶是否在線狀態等等。這裡我們會用到bitmaps數據類型;這些
   統計都是一些單一性的,比如簽到記錄,要麼簽到,要麼未簽到,我要統計一個人七天的簽到情況只需要一個位元組(八位)大小的空間即可記錄,
   從右往左,每位用0或1來記錄是否簽到(最後一位每用上,因為只有七天記錄),放眼看,大數據量下是很省空間的 ⑤:分散式鎖與單執行緒機制 驗證前端的重複請求,可以通過redis進行過濾:每次請求將request ip、參數、介面等hash作為key存儲redis(冪等性請求),設置多長
   時間有效期,然後下次請求過來的時候先在redis中檢索有沒有這個key,進而驗證是不是一定時間內過來的重複提交 秒殺系統,基於redis是
   單執行緒特徵,防止出現資料庫「爆破」 全局增量ID生成,類似「秒殺」 ⑥:獲取最新列表 例如新聞列表頁面最新的新聞列表,如果總數量很大的情況下,盡量不要使用select a from A limit 10,嘗試redis的 LPUSH命令構
   建List,一個個順序都塞進去就可以啦。不過萬一記憶體清掉了咋辦?也簡單,查詢不到存儲key的話,用mysql查詢並且初始化一個List到
   redis中就好了。 ⑦:排行榜 誰得分高誰排名往上。命令:ZADD(有續集,sorted set)

4:什麼是NoSQL

  NoSQL最常見的解釋是「non-relational」, 「Not Only SQL」也被很多人接受。NoSQL僅僅是一個概念,泛指非關係型的資料庫,區別於關係資料庫,它們不保證關係數據的ACID特性。NoSQL是一項全新的資料庫革命性運動,其擁護者們提倡運用非關係型的數據存儲,相對於鋪天蓋地的關係型資料庫運用,這一概念無疑是一種全新的思維的注入。

  NoSQL有如下優點:易擴展,NoSQL資料庫種類繁多,但是一個共同的特點都是去掉關係資料庫的關係型特性。數據之間無關係,這樣就非常容易擴展。無形之間也在架構的層面上帶來了可擴展的能力。大數據量,高性能,NoSQL資料庫都具有非常高的讀寫性能,尤其在大數據量下,同樣表現優秀。這得益於它的無關係性,資料庫的結構簡單 

二:Linux安裝Redis單機部署

1:Redis官方下載

  其實redis主要使用在Linux系統中,我們在官網上下載一般都是Linux安裝包,我就以window(redis-x64-6.2.5.zip) (win多版本)和 Linux(redis-6.2.5.tar.gz)來使用

2:安裝Redis單機版

  下載redis-6.2.5.tar.gz壓縮包後上傳到Linux的/home目錄下,我們最終安裝到  /usr/local/redis/  目錄下

  Linux為Centos7系統安裝redis6.2.5版本

①:安裝最基本的環境

安裝Redis編譯的gcc-c++環境(全部我乾脆都下載更新),這裡我就直接以yum安裝
    yum -y install cpp binutils glibc glibc-kernheaders glibc-common glibc-devel gcc make gcc-c++ libstdc++-devel tcl
註:Centos6官方停止了對yum的維護,我們要麼使用rpm安裝yum後再操作,或者直接使用rpm安裝Redis、
註:6.0以上的redis需要安裝最新的gcc,4.8.3版本的gcc
查看gcc版本:gcc -v

②:解壓編譯及安裝

①:進入我們redis安裝包位置並解壓
cd /home
tar -zxvf redis-6.2.5.tar.gz
②:進入解壓好的redis文件里
cd redis-6.2.5/
③:使用gcc編譯redis,因為是C語言編寫的
make && make PREFIX=/usr/local/redis install
註:make編譯程式碼;make PREFIX=/usr/local/redis install安裝到指定的位置
④:創建配置文件的目錄
mkdir /usr/local/redis/conf
⑤:把配置文件拷貝到我們安裝的位置
cp /home/redis-6.2.5/redis.conf /usr/local/redis/conf/

⑥:跳轉到安裝目錄下創建sh腳本
cd /usr/local/redis
cat > startRedis.sh <<EOF
#!/bin/sh
/usr/local/redis/bin/redis-server /usr/local/redis/conf/redis.conf 2>&1 &
EOF
#腳本說明:
#  /usr/local/redis/redis-server 開啟服務執行文件位置
#  /usr/local/redis/conf/redis.conf 配置文件位置
#  2>&1 標準錯誤2重定向到標準錯誤1中,數據腳本裡面的語法
#  & 設置為守護進程,就是說後台運行 ⑦:設置許可權及運行 chmod 744 startRedis.sh
./startRedis.sh ⑧:查看Redis啟動狀態 ps -ef | grep redis ⑨:殺死運行的全部redis kill -9 `ps -ef | grep redis | grep -v grep | awk '{print $2}'`

③:本地客戶端連接redis

  在安裝完redis後我們就可以在本地連接我們的redis

  我們要去到安裝redis的目錄下 /usr/local/redis/bin/ 裡面啟動一個客戶端命令

[root@VM-8-15-centos bin]# ls
redis-benchmark  redis-check-aof  redis-check-rdb  redis-cli  redis-sentinel  redis-server
[root@VM-8-15-centos bin]# ./redis-cli  #客戶端連接命令
127.0.0.1:6379> PING   #測試連接
PONG
127.0.0.1:6379> SHUTDOWN #關閉服務端
not connected> 
[root@VM-8-15-centos bin]# 

3:Redis中bin目錄文件說明

  在安裝完redis後,會有一個目錄,裡面全部是一些可執行文件

[root@VM-8-15-centos bin]# ll
總用量 18880
-rwxr-xr-x 1 root root 4829552 9月  25 13:32 redis-benchmark
lrwxrwxrwx 1 root root      12 9月  25 13:32 redis-check-aof -> redis-server
lrwxrwxrwx 1 root root      12 9月  25 13:32 redis-check-rdb -> redis-server
-rwxr-xr-x 1 root root 5003168 9月  25 13:32 redis-cli
lrwxrwxrwx 1 root root      12 9月  25 13:32 redis-sentinel -> redis-server
-rwxr-xr-x 1 root root 9492640 9月  25 13:32 redis-server
[root@VM-8-15-centos bin]# 

redis-server:Redis服務端的啟動程式
redis-cli:Redis命令行客戶端操作工具
redis-benchmark:性能測試工具(服務啟動起來後執行)
redis-check-aof:修復有問題的AOF文件
redis-check-rdb:修復有問題的dump.rdb文件
redis-sentinel:Redis集群使用,用來監控各個Redis服務

4:Redis配置文件的基本介紹

  上面我們學會了如何安裝Redis並簡單的用客戶端連接服務端,但是我們發現連接沒有密碼,也不知道如何在遠程連接;但實現這些我們就得修改Redis的配置文件,也就是我們之前從解壓目錄里拷貝的 redis.conf 配置文件到安裝目錄里的conf目錄下;我們要修改conf安裝目錄下的文件

  註:在啟動執行 redis-server 服務啟動命令時 最好後面攜帶配置文件目錄,否則默認官方配置!如:> redis-server ../redis.conf

bind:介面(IP地址)綁定
    默認配置文件設置的是127.0.0.1 -::1,也就是說只能本機訪問;那麼未指定bind配置則代表任何電腦都可以訪問連接
    註:localhost/127.0.0.1   IPv4格式:127.0.0.1    IPv6格式:0:0:0:0:0:0:0:1 簡寫 ::1   '::'代表前面都是0
    假設當前Redis伺服器地址是119.29.68.209;我又租了兩台伺服器分別為
    A伺服器地址:119.29.68.222    B伺服器地址:119.29.68.223
    設置A伺服器可以訪問Redis        bind 119.29.68.222
    設置A、B伺服器都可以訪問Redis    bind 119.29.68.222 -119.29.68.223     (多個IP之間可以用 '-' 分割)
    設置任何伺服器(IPv4、IPv6形式)都可以訪問Redis    bind * -::* 或注釋bind配置   老版本設置 bind * 或者 bind 0.0.0.0
port:埠設置指定Redis埠,默認6379
requirepass:設置連接Redis需要驗證的密碼,默認空

5:客戶端遠程連接Redis

  在設置好bind後我們就可以遠程Redis伺服器服務了(前提設置指定IP或者 * 任何都可連接)

  第三方Redis客戶端連接工具

①:使用自帶的redis-cli連接遠程Redis

具體的redis-cli使用操作可以執行 ./redis-cli --help
用法: redis-cli [OPTIONS] [cmd [arg [arg ...]]]
    -h  設置要連接的Redis服務IP
    -p  設置要連接的Redis服務埠
    -a  設置要連接的Redis認證密碼

連接時直接認證密碼:
[root@VM-8-15-centos bin]# ./redis-cli -h 119.29.68.209 -p 6379 -a 1234
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
# 警告:在命令行介面上使用帶有「-a」或「-u」選項的密碼可能不安全

連接後認證密碼:推薦√
[root@VM-8-15-centos bin]# ./redis-cli -h 119.29.68.209 -p 6379
119.29.68.209:6379> set name zhangsan
(error) NOAUTH Authentication required.     # (錯誤)需要 NOAUTH 身份驗證。
119.29.68.209:6379>AUTH 1234    # 設置密碼

②:使用第三方RedisGUI工具

三:windows下安裝Redis單機版部署

  話說在windows下安裝就可以理解為小白安裝,解壓就可以使用,最多運行是攜帶一個 redis.windows.conf 配置文件;這裡我就以現在最新版的redis6.2.5版本講解;安裝包在第二節已經給出,大家可以去下載並解壓,裡面的大部分不認識的文件後面會介紹,我們只要掌握其中的幾個文件即可

  養成一個好習慣,啟動redis是必須攜帶自己的配置文件!!

  解壓后里面的文件和在redis安裝時的差不多,redis里有的它都有,我們最終搞懂那幾個文件即可!

①:在windows下運行redis

打開cmd進入redis解壓目錄
cd C:\Users\xiaof\Desktop\redis\installRedis\redis-x64-6.2.5
註:如果cd不是當前盤符可以執行完cd後 再切換盤符 執行 如  D:   回車
運行服務端
redis-server.exe redis.windows.conf
運行客戶端
redis-cli.exe -h 127.0.0.1 -p 6379

②:創建windows下運行redis的.bat腳本

①:創建一個Redis.bat文件,並把下面的腳本粘上去後修改路徑即可
    @echo off
    rem cmd窗口名稱
    title redis-server
    rem 路徑變數
    set ENV_HOME="C:\Users\xiaof\Desktop\redis\installRedis\redis-x64-6.2.5"
    color 03
    cd %ENV_HOME%
    redis-server redis.windows.conf
②:使用本地客戶端連接腳本,創建一個RedisClient.bat文件;如果沒密碼則需要把腳本的 -a xxxx 剔除
    @echo off
    rem 設置我們redis目錄位置   開啟客戶端
    set redis_home=C:\Users\xiaof\Desktop\redis\installRedis\redis-x64-6.2.5
    start cmd /k "cd /d  %redis_home%\ && redis-cli.exe -h 127.0.0.1 -p 6379 -a 1234"  
    exit

  此地說明一下,在接下來的章節和續章都是以本地windows下的redis來講解基本命名!!

四:Redis性能測試

  官方已經為我們準備好性能測試工具 redis-benchmark ,它可以測試我們redis各個類型及場景下的讀寫性能

1:基本屬性說明

Usage: redis-benchmark [-h <host>] [-p <port>] [-c <clients>] [-n <requests>] [-k <boolean>]

-h <hostname>      設置redis服務端 IP (default 127.0.0.1)   
-p <port>          設置redis服務端 埠 (default 6379)
-a <password>      設置redis服務端 密碼
-c <clients>       設置多少個redis客戶端並發連接redis服務端 (default 50)
-d <size>          設置每次SET/GET值的數據大小,默認3位元組 「VXK」 (default 3)
-n <requests>      設置請求總數,若默認50個客戶端,每個客戶端只需要請求2000次 (default 100000)
-q                 只顯示每種類型測試 讀/寫 的秒數(不會輸出大片測試過程)
-l                 閉環模式,測試完後,循環上一次測試,(就是命令永遠循環)
-r <keyspacelen>   設置指定數量的鍵;對SET/GET/INCR使用隨機鍵,對SADD使用隨機值,ZADD的隨機成員和分數。
                    註:-r會被應用到key和counter鍵,並且拼接12位後綴標識為多少個;如 "key:000000000008" 代表生成的第八個鍵
-P <numreq>        選項代表每個請求pipeline的數據量. Default 1 (no pipeline).
-t <tests>         設置選擇性的測試操作,它只會對我們指定的命令測試 如 -t SET,SPOP,LPUSH (低版本只能測試17個命令)
            註:看下面的性能測試方式,選擇其中指定方式測試 -I 空閑模式。只需打開N個空閑連接並等待 -s <socket> Server socket (覆蓋主機和埠) -k <boolean> 1=保持活動狀態 0=重新連接 (default 1) 註:默認測試是一旦第一次連接,後面就不會斷開,直到測試完成, 註:若是 1 則代表每次請求完成則斷開連接,下次請求再重新連接 --csv 以CSV格式輸出,方便我們統計Excel等處理 --user <username> 用於發送ACL樣式的「驗證用戶名密碼」。需要 -a。 --dbnum <db> 選擇指定的資料庫號進行測試,redis默認資料庫為(0~16) (default 0) --threads <num> 啟動多執行緒模式來測試 --cluster 啟用集群模式來測試 --enable-tracking 啟動測試之前發送客戶端跟蹤 --help 幫助文檔 --version 顯示版本號

2:性能測試默認方式

如果未指定 -t xxx,xxx,... 則從頭至尾20個性能測試方案依次進行
(1) PING_INLINE 
(2) PING_MBULK 
(3) SET:將字元串值value關聯到key; 
(4) GET:返回key所關聯的字元串值,如果key存儲的值不是字元串類型,返回一個錯誤; 
(5) INCR:將key中存儲的數字值增一。不能轉換為數字則報錯; 
(6) LPUSH:將一個或多個值value插入到列表key的表頭; 
(7) RPUSH:將一個或多個值value插入到列表key的表尾; 
(8) LPOP:移除並返回列表key的頭元素; 
(9) RPOP:移除並返回列表key的尾元素; 
(10) SADD:將一個或多個member元素加入到集合set當中,已經存在於集合的member元素將被忽略; 
(11) HSET:將字元串值value關聯到hash里的key中
(12) SPOP:移除並返回集合中的一個隨機元素; 
(13) ZADD:測試sortedSet有序集合的添加時間性能
(14) ZPOPMIN:測試sortedSet有序集合,刪除多個值並把刪除的值排序,從小到大
(15) LPUSH:將一個或多個value插入到列表key的表頭; 
(16) LRANGE_100:返回列表key中指定區間內的元素,前100條元素; 
(17) LRANGE_300:返回列表key中指定區間內的元素,前300條元素; 
(18) LRANGE_500:返回列表key中指定區間內的元素,前500條元素; 
(19) LRANGE_600:返回列表key中指定區間內的元素,前600條元素; 
(20) MSET:同時設置一個或多個key-value對,value為字元串。

如果未指定 -r 則以下面的四個鍵來測試
redis-benchmark性能測試默認情況下只會以如下類型key來測試(低版本應該是三個)
1) "myhash"
    此類型為「hash」,每次請求則會向「hash」key為 「element:__rand_int__」 添加「VXK」,後者覆蓋前者
2) "counter:__rand_int__"
    此類型為「string」,每次請求則會累加 1 ,後個請求會對前一個值+1操作
3) "key:__rand_int__"
    此類型為「string」,每次請求則會存放「VXK」,後個請求覆蓋上一個值
4) "mylist"
    此類型為「list」,往集合內部存儲「VXK」,每請求一次則插入一次

3:常用測試方案及說明

①:連接redis伺服器並測試以50個客戶端並發(平分每個客戶端2000次)訪問100000次
  ./redis-benchmark -h 127.0.0.1 -p 6379 -c 50 -n 100000 
②:不輸出測試過程,只顯示當前測試案例結束的時間
  ./redis-benchmark -h 127.0.0.1 -p 6379 -c 50 -n 100000 -q
④:總和上面,並設置每個請求的請求值的大小位元組
  ./redis-benchmark -h 127.0.0.1 -p 6379 -c 50 -n 100000 -q -d 5
④:綜合上面,並設置指定的測試案例
  ./redis-benchmark -h 127.0.0.1 -p 6379 -c 50 -n 100000 -q -d 5 -t SET,SADD,ZADD,GET

測試輸出的格式說明:(以 SET 測試案例說明)
./redis-benchmark -h 127.0.0.1 -p 6379 -c 1000 -n 1000000 -t SET 
====== SET ======                                                     
  1000000 requests completed in 18.75 seconds
    -- 1000000 請求用時 18.75 秒
  1000 parallel clients
    -- 每個客戶端請求次數1000
  3 bytes payload
    -- 每次測試請求位元組大小為 3byte
  keep alive: 1
    -- 保持活力模式 1 一直連接 (0則代表每次請求從新連接)
  host configuration "save": 3600 1 300 100 60 10000
  host configuration "appendonly": no
    -- 上面兩個主機配置 持久化方式關閉 
  multi-thread: no
    -- 不是多執行緒測試

Latency by percentile distribution:
0.000% <= 6.159 milliseconds (cumulative count 1)
50.000% <= 13.191 milliseconds (cumulative count 500348)
75.000% <= 15.687 milliseconds (cumulative count 750168)
98.438% <= 26.799 milliseconds (cumulative count 984415)
100.000% <= 49.151 milliseconds (cumulative count 1000000)
100.000% <= 49.151 milliseconds (cumulative count 1000000)

Cumulative distribution of latencies:
0.000% <= 0.103 milliseconds (cumulative count 0)
1.234% <= 7.103 milliseconds (cumulative count 12338)
12.473% <= 9.103 milliseconds (cumulative count 124733)
49.156% <= 13.103 milliseconds (cumulative count 491559)
100.000% <= 48.127 milliseconds (cumulative count 999999)
100.000% <= 50.111 milliseconds (cumulative count 1000000)

Summary:
  throughput summary: 53339.02 requests per second
    -- 吞吐量摘要:每秒53339.02個請求
  latency summary (msec):
    --延遲摘要(毫秒)
          avg       min       p50       p95       p99       max
       13.639     6.152    13.191    21.663    28.351    49.151

4:其它參數介紹

①:-P <numreq> 
  在上面的性能測試中,每個客戶端都是在一個請求完成之後才發送下一個請求,如指定-c 50 -n 10000
則伺服器幾乎是按照順序依次讀取每個客戶端的請求
  Redis 支援 /topics/pipelining;就是說Redis可以一次性執行多條命令(把命令打包一次性發送伺服器)
所以Redis pipelining 可以提高伺服器的 TPS。
  總結:減少網路的請求,把請求匯總處理
./redis-benchmark -c 20 -n 1000000 -t set,get -P 16 -q 

五:Redis單執行緒為什麼這麼快

1.Redis基於記憶體,記憶體的讀寫速度非常快;
2.Redis是單執行緒的,為上下文切換執行緒節省了大量時間;
3.Redis使用多路復用技術來處理並發連接。非阻塞IO的內部實現使用epoll,以及由epoll +本身實現的簡單事件框架。
  epoll中的讀取,寫入,關閉和連接都被轉換為事件,然後使用epoll的多路復用功能從不浪費任何時間在io上。

  由於Redis是基於記憶體的操作,因此CPU並不是Redis的瓶頸。Redis的瓶頸很可能是機器記憶體或網路頻寬的大小。既然單執行緒易
  於實現並且CPU不會成為瓶頸,那採用單執行緒解決方案是合乎邏輯的了。
詳細原因:
    不需要各種鎖的性能消耗:
      Redis的數據結構並非全都是簡單的鍵值(Key-Value),而是有複雜的結構,如列表(list)和哈希(hash)。這些結構
      可以執行細粒度的操作,例如在長列表後面添加元素並將其添加到哈希(hash)或刪除對象。
      這些操作可能需要非常大量的鎖,從而導致同步開銷顯著增加。簡而言之,在單執行緒的情況下,不需要考慮各種鎖,沒有
      鎖釋放操作,也沒有由於可能的死鎖而導致的性能消耗。
    單執行緒多進程集群方案:
      單執行緒的功能實際上非常強大,每個內核的效率也很高。與單執行緒相比,多執行緒自然可以具有更高的性能限制。但是,
      在當今的計算環境中,甚至單機多執行緒限制通常也無法滿足。需要進一步探索的是多伺服器群集方案,並且這些方案中
      的多執行緒技術仍然是不可用的。
      所以單執行緒、多進程的集群不失為一個時髦的解決方案。
    CPU消耗:
      單執行緒用於避免不必要的上下文切換和競爭條件,並且不存在消耗CPU的多進程或多執行緒切換。但是,如果CPU成為Redis的
      瓶頸,或者不想讓伺服器的其他CPU內核閑置怎麼辦?您可以考慮幾個Redis進程。Redis是一個鍵值(key-value)資料庫,
      而不是關係資料庫,並且數據之間沒有約束。只要客戶端能夠區分哪個鍵位於哪個Redis進程上,就可以完成了。

.

Tags: