初識Redis與桌面使用者端

2023-08-29 18:03:19

Redis介紹

什麼是Redis

  • Redis(Remote Dictionary Server) 是一個使用 C 語言編寫的,開源的(BSD許可)高效能非關係型(NoSQL)的鍵值對資料庫。

  • Redis 可以儲存鍵和五種不同型別的值之間的對映。鍵的型別只能為字串,值支援五種資料型別:字串、列表、集合、雜湊表、有序集合。

  • 與傳統資料庫不同的是 Redis 的資料是存在記憶體中的,所以讀寫速度非常快,因此 redis 被廣泛應用於快取方向,每秒可以處理超過 10萬次讀寫操作,是已知效能最快的Key-Value DB。另外,Redis 也經常用來做分散式鎖。除此之外,Redis 支援事務 、持久化、LUA指令碼、LRU驅動事件、多種叢集方案。


Redis是一種鍵值型的NoSql資料庫,這裡有兩個關鍵字:
  • 鍵值型

  • NoSql

其中鍵值型,是指Redis中儲存的資料都是以key、value對的形式儲存,而value的形式多種多樣,可以是字串、數值、甚至json:

而NoSql則是相對於傳統關係型資料庫而言,有很大差異的一種資料庫。

認識NoSQL

NoSql可以翻譯做Not Only Sql(不僅僅是SQL),或者是No Sql(非Sql的)資料庫。是相對於傳統關係型資料庫而言,有很大差異的一種特殊的資料庫,因此也稱之為非關係型資料庫

結構化與非結構化

傳統關係型資料庫是結構化資料,每一張表都有嚴格的約束資訊:欄位名、欄位資料型別、欄位約束等等資訊,插入的資料必須遵守這些約束:

而NoSql則對資料庫格式沒有嚴格約束,往往形式鬆散,自由。

可以是鍵值型:

也可以是檔案型:

甚至可以是圖格式:

關聯和非關聯

傳統資料庫的表與表之間往往存在關聯,例如外來鍵:

而非關係型資料庫不存在關聯關係,要維護關係要麼靠程式碼中的業務邏輯,要麼靠資料之間的耦合:

{
  id: 1,
  name: "張三",
  orders: [
    {
       id: 1,
       item: {
	 id: 10, title: "榮耀6", price: 4999
       }
    },
    {
       id: 2,
       item: {
	 id: 20, title: "小米11", price: 3999
       }
    }
  ]
}

此處要維護「張三」的訂單與商品「榮耀」和「小米11」的關係,不得不冗餘的將這兩個商品儲存在張三的訂單檔案中,不夠優雅。還是建議用業務來維護關聯關係。

查詢方式

傳統關係型資料庫會基於Sql語句做查詢,語法有統一標準;

而不同的非關聯式資料庫查詢語法差異極大,五花八門各種各樣。

事務

傳統關係型資料庫能滿足事務ACID的原則。

而非關係型資料庫往往不支援事務,或者不能嚴格保證ACID的特性,只能實現基本的一致性。

總結

除了上述四點以外,在儲存方式、擴充套件性、查詢效能上關係型與非關係型也都有著顯著差異,總結如下:

  • 儲存方式
    • 關係型資料庫基於磁碟進行儲存,會有大量的磁碟IO,對效能有一定影響
    • 非關係型資料庫,他們的操作更多的是依賴於記憶體來操作,記憶體的讀寫速度會非常快,效能自然會好一些
  • 擴充套件性
    • 關係型資料庫叢集模式一般是主從,主從資料一致,起到資料備份的作用,稱為垂直擴充套件。
    • 非關係型資料庫可以將資料拆分,儲存在不同機器上,可以儲存海量資料,解決記憶體大小有限的問題。稱為水平擴充套件。
    • 關係型資料庫因為表之間存在關聯關係,如果做水平擴充套件會給資料查詢帶來很多麻煩

認識Redis

Redis誕生於2009年全稱是Remote Dictionary Server 遠端詞典伺服器,是一個基於記憶體的鍵值型NoSQL資料庫。

特徵

  • 鍵值(key-value)型,value支援多種不同資料結構,功能豐富
  • 單執行緒,每個命令具備原子性
  • 低延遲,速度快(基於記憶體、IO多路複用、良好的編碼)。
  • 支援資料持久化
  • 支援主從叢集、分片叢集
  • 支援多語言使用者端

Redis優缺點

優點

  • 讀寫效能優異, Redis能讀的速度是110000次/s,寫的速度是81000次/s。
  • 支援資料持久化,支援AOF和RDB兩種持久化方式。
  • 支援事務,Redis的所有操作都是原子性的,同時Redis還支援對幾個操作合併後的原子性執行。
  • 資料結構豐富,除了支援string型別的value外還支援hash、set、zset、list等資料結構。
  • 支援主從複製,主機會自動將資料同步到從機,可以進行讀寫分離。

缺點

  • 資料庫容量受到實體記憶體的限制,不能用作海量資料的高效能讀寫,因此Redis適合的場景主要侷限在較小資料量的高效能操作和運算上。
  • Redis 不具備自動容錯和恢復功能,主機從機的宕機都會導致前端部分讀寫請求失敗,需要等待機器重啟或者手動切換前端的IP才能恢復。
  • 主機宕機,宕機前有部分資料未能及時同步到從機,切換IP後還會引入資料不一致的問題,降低了系統的可用性。
  • Redis 較難支援線上擴容,在叢集容量達到上限時線上擴容會變得很複雜。為避免這一問題,運維人員在系統上線時必須確保有足夠的空間,這對資源造成了很大的浪費。

Redis的官方網站地址:https://redis.io/

安裝Redis

大多數企業都是基於Linux伺服器來部署專案,而且Redis官方也沒有提供Windows版本的安裝包。因此會基於Linux系統來安裝Redis.

此處選擇的Linux版本為CentOS 7.

依賴庫

Redis是基於C語言編寫的,因此首先需要安裝Redis所需要的gcc依賴:

yum install -y gcc tcl

上傳安裝包並解壓

然後將課前資料提供的Redis安裝包上傳到虛擬機器器的任意目錄:

例如,我放到了/usr/local/src 目錄:

解壓縮:

tar -xzf redis-6.2.6.tar.gz

解壓後:

進入redis目錄:

cd redis-6.2.6

執行編譯命令:

make && make install

如果沒有出錯,應該就安裝成功了。

預設的安裝路徑是在 /usr/local/bin目錄下:

該目錄已經預設設定到環境變數,因此可以在任意目錄下執行這些命令。其中:

  • redis-cli:是redis提供的命令列使用者端
  • redis-server:是redis的伺服器端啟動指令碼
  • redis-sentinel:是redis的哨兵啟動指令碼

啟動

redis的啟動方式有很多種,例如:

  • 預設啟動
  • 指定設定啟動
  • 開機自啟

預設啟動

安裝完成後,在任意目錄輸入redis-server命令即可啟動Redis:

redis-server

如圖:

這種啟動屬於前臺啟動,會阻塞整個對談視窗,視窗關閉或者按下CTRL + C則Redis停止。不推薦使用。

指定設定啟動

如果要讓Redis以後臺方式啟動,則必須修改Redis組態檔,就在我們之前解壓的redis安裝包下(/usr/local/src/redis-6.2.6),名字叫redis.conf:

我們先將這個組態檔備份一份:

cp redis.conf redis.conf.bck

然後修改redis.conf檔案中的一些設定:

# 允許存取的地址,預設是127.0.0.1,會導致只能在本地存取。修改為0.0.0.0則可以在任意IP存取,生產環境不要設定為0.0.0.0
bind 0.0.0.0
# 守護行程,修改為yes後即可後臺執行
daemonize yes 
# 密碼,設定後存取Redis必須輸入密碼
requirepass 123321

Redis的其它常見設定:

# 監聽的埠
port 6379
# 工作目錄,預設是當前目錄,也就是執行redis-server時的命令,紀錄檔、持久化等檔案會儲存在這個目錄
dir .
# 資料庫數量,設定為1,代表只使用1個庫,預設有16個庫,編號0~15
databases 1
# 設定redis能夠使用的最大記憶體
maxmemory 512mb
# 紀錄檔檔案,預設為空,不記錄紀錄檔,可以指定紀錄檔檔名
logfile "redis.log"

啟動Redis:

# 進入redis安裝目錄 
cd /usr/local/src/redis-6.2.6
# 啟動
redis-server redis.conf

停止服務:

# 利用redis-cli來執行 shutdown 命令,即可停止 Redis 服務,
# 因為之前設定了密碼,因此需要通過 -u 來指定密碼
redis-cli -u 123321 shutdown

開機自啟

我們也可以通過設定來實現開機自啟。

首先,新建一個系統服務檔案:

vi /etc/systemd/system/redis.service

內容如下:

[Unit]
Description=redis-server
After=network.target

[Service]
Type=forking
ExecStart=/usr/local/bin/redis-server /usr/local/src/redis-6.2.6/redis.conf
PrivateTmp=true

[Install]
WantedBy=multi-user.target

然後過載系統服務:

systemctl daemon-reload

現在,我們可以用下面這組命令來操作redis了:

# 啟動
systemctl start redis
# 停止
systemctl stop redis
# 重啟
systemctl restart redis
# 檢視狀態
systemctl status redis

執行下面的命令,可以讓redis開機自啟:

systemctl enable redis

Redis桌面使用者端

安裝完成Redis,我們就可以操作Redis,實現資料的CRUD了。這需要用到Redis使用者端,包括:

  • 命令列使用者端
  • 圖形化桌面使用者端
  • 程式設計使用者端

Redis命令列使用者端

Redis安裝完成後就自帶了命令列使用者端:redis-cli,使用方式如下:

redis-cli [options] [commonds]

其中常見的options有:

  • -h 127.0.0.1:指定要連線的redis節點的IP地址,預設是127.0.0.1
  • -p 6379:指定要連線的redis節點的埠,預設是6379
  • -a 123321:指定redis的存取密碼

其中的commonds就是Redis的操作命令,例如:

  • ping:與redis伺服器端做心跳測試,伺服器端正常會返回pong

不指定commond時,會進入redis-cli的互動控制檯:

圖形化桌面使用者端

GitHub上的大神編寫了Redis的圖形化桌面使用者端,地址:https://github.com/uglide/RedisDesktopManager

不過該倉庫提供的是RedisDesktopManager的原始碼,並未提供windows安裝包。

在下面這個倉庫可以找到安裝包:https://github.com/lework/RedisDesktopManager-Windows/releases

安裝

在下載中可以找到Redis的圖形化桌面使用者端:

解壓縮後,執行安裝程式即可安裝:

安裝完成後,在安裝目錄下找到rdm.exe檔案:

雙擊即可執行:

建立連線

點選左上角的連線到Redis伺服器按鈕:

在彈出的視窗中填寫Redis服務資訊:

點選確定後,在左側選單會出現這個連結:

點選即可建立連線了。

Redis預設有16個倉庫,編號從0至15. 通過組態檔可以設定倉庫數量,但是不超過16,並且不能自定義倉庫名稱。

如果是基於redis-cli連線Redis服務,可以通過select命令來選擇資料庫:

# 選擇 0號庫
select 0