Redis: key-value存儲系統

Table of Contents

Redis 教程

誰適合閱讀本教程?

閱讀本教程前,您需要了解的知識?

相關資源

Redis 簡介

Redis 優勢

Redis與其他key-value存儲有什麼不同?

Redis 安裝

Window 下安裝

Linux 下安裝

Ubuntu 下安裝

啓動 Redis

查看 redis 是否啓動?

Redis 配置

語法

實例

實例

編輯配置

語法

實例

參數說明

Redis 數據類型

String(字符串)

實例

Hash(哈希)

實例

List(列表)

實例

Set(集合)

sadd 命令

實例

zset(sorted set:有序集合)

zadd 命令

實例


Redis 教程

REmote DIctionary Server(Redis) 是一個由Salvatore Sanfilippo寫的key-value存儲系統。

Redis是一個開源的使用ANSI C語言編寫、遵守BSD協議、支持網絡、可基於內存亦可持久化的日誌型、Key-Value數據庫,並提供多種語言的API。

它通常被稱爲數據結構服務器,因爲值(value)可以是 字符串(String), 哈希(Hash), 列表(list), 集合(sets) 和 有序集合(sorted sets)等類型。

誰適合閱讀本教程?

本教程是爲專業的程序開發人員,通過本教程你可以一步一步瞭解 Redis 的應用。


閱讀本教程前,您需要了解的知識?

閱讀本教程前,你需要了解基本的數據結構,例如以下幾種:

  • String: 字符串
  • Hash: 散列
  • List: 列表
  • Set: 集合
  • Sorted Set: 有序集合

在閱讀本教程前,你需要了解基本的數據結構。


相關資源

Redis 官網:https://redis.io/

Redis 在線測試:http://try.redis.io/

Redis 命令參考:http://doc.redisfans.com/


Redis 簡介

Redis 是完全開源免費的,遵守BSD協議,是一個高性能的key-value數據庫。

Redis 與其他 key - value 緩存產品有以下三個特點:

  • Redis支持數據的持久化,可以將內存中的數據保存在磁盤中,重啓的時候可以再次加載進行使用。
  • Redis不僅僅支持簡單的key-value類型的數據,同時還提供list,set,zset,hash等數據結構的存儲。
  • Redis支持數據的備份,即master-slave模式的數據備份。

Redis 優勢

  • 性能極高 – Redis能讀的速度是110000次/s,寫的速度是81000次/s 。
  • 豐富的數據類型 – Redis支持二進制案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets 數據類型操作。
  • 原子 – Redis的所有操作都是原子性的,意思就是要麼成功執行要麼失敗完全不執行。單個操作是原子性的。多個操作也支持事務,即原子性,通過MULTI和EXEC指令包起來。
  • 豐富的特性 – Redis還支持 publish/subscribe, 通知, key 過期等等特性。

Redis與其他key-value存儲有什麼不同?

  • Redis有着更爲複雜的數據結構並且提供對他們的原子性操作,這是一個不同於其他數據庫的進化路徑。Redis的數據類型都是基於基本數據結構的同時對程序員透明,無需進行額外的抽象。

  • Redis運行在內存中但是可以持久化到磁盤,所以在對不同數據集進行高速讀寫時需要權衡內存,因爲數據量不能大於硬件內存。在內存數據庫方面的另一個優點是,相比在磁盤上相同的複雜的數據結構,在內存中操作起來非常簡單,這樣Redis可以做很多內部複雜性很強的事情。同時,在磁盤格式方面他們是緊湊的以追加的方式產生的,因爲他們並不需要進行隨機訪問。


Redis 安裝

Window 下安裝

下載地址:https://github.com/MSOpenTech/redis/releases

。。。

Linux 下安裝

下載地址:http://redis.io/download,下載最新穩定版本。

本教程使用的最新文檔版本爲 2.8.17,下載並安裝:

$ wget http://download.redis.io/releases/redis-2.8.17.tar.gz
$ tar xzf redis-2.8.17.tar.gz
$ cd redis-2.8.17
$ make

make完後 redis-2.8.17目錄下會出現編譯後的redis服務程序redis-server,還有用於測試的客戶端程序redis-cli,兩個程序位於安裝目錄 src 目錄下:

下面啓動redis服務.

$ cd src
$ ./redis-server

注意這種方式啓動redis 使用的是默認配置。也可以通過啓動參數告訴redis使用指定配置文件使用下面命令啓動。

$ cd src
$ ./redis-server ../redis.conf

redis.conf 是一個默認的配置文件。我們可以根據需要使用自己的配置文件。

啓動redis服務進程後,就可以使用測試客戶端程序redis-cli和redis服務交互了。 比如:

$ cd src
$ ./redis-cli
redis> set foo bar
OK
redis> get foo
"bar"

Ubuntu 下安裝

在 Ubuntu 系統安裝 Redis 可以使用以下命令:

$sudo apt-get update
$sudo apt-get install redis-server

啓動 Redis

$ redis-server

查看 redis 是否啓動?

$ redis-cli

以上命令將打開以下終端:

redis 127.0.0.1:6379>

127.0.0.1 是本機 IP ,6379 是 redis 服務端口。現在我們輸入 PING 命令。

redis 127.0.0.1:6379> ping
PONG

以上說明我們已經成功安裝了redis。


Redis 配置

Redis 的配置文件位於 Redis 安裝目錄下,文件名爲 redis.conf(Windows 名爲 redis.windows.conf)。

你可以通過 CONFIG 命令查看或設置配置項。


語法

Redis CONFIG 命令格式如下:

redis 127.0.0.1:6379> CONFIG GET CONFIG_SETTING_NAME

實例

redis 127.0.0.1:6379> CONFIG GET loglevel

1) "loglevel"
2) "notice"

使用 * 號獲取所有配置項:

實例

redis 127.0.0.1:6379> CONFIG GET *

  1) "dbfilename"
  2) "dump.rdb"
  3) "requirepass"
  4) ""
  5) "masterauth"
  6) ""
  7) "unixsocket"
  8) ""
  9) "logfile"
 10) ""
 11) "pidfile"
 12) "/var/run/redis.pid"
 13) "maxmemory"
 14) "0"
 15) "maxmemory-samples"
 16) "3"
 17) "timeout"
 18) "0"
 19) "tcp-keepalive"
 20) "0"
 21) "auto-aof-rewrite-percentage"
 22) "100"
 23) "auto-aof-rewrite-min-size"
 24) "67108864"
 25) "hash-max-ziplist-entries"
 26) "512"
 27) "hash-max-ziplist-value"
 28) "64"
 29) "list-max-ziplist-entries"
 30) "512"
 31) "list-max-ziplist-value"
 32) "64"
 33) "set-max-intset-entries"
 34) "512"
 35) "zset-max-ziplist-entries"
 36) "128"
 37) "zset-max-ziplist-value"
 38) "64"
 39) "hll-sparse-max-bytes"
 40) "3000"
 41) "lua-time-limit"
 42) "5000"
 43) "slowlog-log-slower-than"
 44) "10000"
 45) "latency-monitor-threshold"
 46) "0"
 47) "slowlog-max-len"
 48) "128"
 49) "port"
 50) "6379"
 51) "tcp-backlog"
 52) "511"
 53) "databases"
 54) "16"
 55) "repl-ping-slave-period"
 56) "10"
 57) "repl-timeout"
 58) "60"
 59) "repl-backlog-size"
 60) "1048576"
 61) "repl-backlog-ttl"
 62) "3600"
 63) "maxclients"
 64) "4064"
 65) "watchdog-period"
 66) "0"
 67) "slave-priority"
 68) "100"
 69) "min-slaves-to-write"
 70) "0"
 71) "min-slaves-max-lag"
 72) "10"
 73) "hz"
 74) "10"
 75) "no-appendfsync-on-rewrite"
 76) "no"
 77) "slave-serve-stale-data"
 78) "yes"
 79) "slave-read-only"
 80) "yes"
 81) "stop-writes-on-bgsave-error"
 82) "yes"
 83) "daemonize"
 84) "no"
 85) "rdbcompression"
 86) "yes"
 87) "rdbchecksum"
 88) "yes"
 89) "activerehashing"
 90) "yes"
 91) "repl-disable-tcp-nodelay"
 92) "no"
 93) "aof-rewrite-incremental-fsync"
 94) "yes"
 95) "appendonly"
 96) "no"
 97) "dir"
 98) "/home/deepak/Downloads/redis-2.8.13/src"
 99) "maxmemory-policy"
100) "volatile-lru"
101) "appendfsync"
102) "everysec"
103) "save"
104) "3600 1 300 100 60 10000"
105) "loglevel"
106) "notice"
107) "client-output-buffer-limit"
108) "normal 0 0 0 slave 268435456 67108864 60 pubsub 33554432 8388608 60"
109) "unixsocketperm"
110) "0"
111) "slaveof"
112) ""
113) "notify-keyspace-events"
114) ""
115) "bind"
116) ""

編輯配置

你可以通過修改 redis.conf 文件或使用 CONFIG set 命令來修改配置。

語法

CONFIG SET 命令基本語法:

redis 127.0.0.1:6379> CONFIG SET CONFIG_SETTING_NAME NEW_CONFIG_VALUE

實例

redis 127.0.0.1:6379> CONFIG SET loglevel "notice"
OK
redis 127.0.0.1:6379> CONFIG GET loglevel

1) "loglevel"
2) "notice"

參數說明

redis.conf 配置項說明如下:

序號 配置項 說明
1
daemonize no
Redis 默認不是以守護進程的方式運行,可以通過該配置項修改,使用 yes 啓用守護進程(Windows 不支持守護線程的配置爲 no )
2
pidfile /var/run/redis.pid
當 Redis 以守護進程方式運行時,Redis 默認會把 pid 寫入 /var/run/redis.pid 文件,可以通過 pidfile 指定
3
port 6379
指定 Redis 監聽端口,默認端口爲 6379,作者在自己的一篇博文中解釋了爲什麼選用 6379 作爲默認端口,因爲 6379 在手機按鍵上 MERZ 對應的號碼,而 MERZ 取自意大利歌女 Alessia Merz 的名字
4
bind 127.0.0.1
綁定的主機地址
5
timeout 300
當客戶端閒置多長秒後關閉連接,如果指定爲 0 ,表示關閉該功能
6
loglevel notice
指定日誌記錄級別,Redis 總共支持四個級別:debug、verbose、notice、warning,默認爲 notice
7
logfile stdout
日誌記錄方式,默認爲標準輸出,如果配置 Redis 爲守護進程方式運行,而這裏又配置爲日誌記錄方式爲標準輸出,則日誌將會發送給 /dev/null
8
databases 16
設置數據庫的數量,默認數據庫爲0,可以使用SELECT 命令在連接上指定數據庫id
9
save <seconds> <changes>

Redis 默認配置文件中提供了三個條件:

save 900 1

save 300 10

save 60 10000

分別表示 900 秒(15 分鐘)內有 1 個更改,300 秒(5 分鐘)內有 10 個更改以及 60 秒內有 10000 個更改。

指定在多長時間內,有多少次更新操作,就將數據同步到數據文件,可以多個條件配合
10
rdbcompression yes
指定存儲至本地數據庫時是否壓縮數據,默認爲 yes,Redis 採用 LZF 壓縮,如果爲了節省 CPU 時間,可以關閉該選項,但會導致數據庫文件變的巨大
11
dbfilename dump.rdb
指定本地數據庫文件名,默認值爲 dump.rdb
12
dir ./
指定本地數據庫存放目錄
13
slaveof <masterip> <masterport>
設置當本機爲 slave 服務時,設置 master 服務的 IP 地址及端口,在 Redis 啓動時,它會自動從 master 進行數據同步
14
masterauth <master-password>
當 master 服務設置了密碼保護時,slav 服務連接 master 的密碼
15
requirepass foobared
設置 Redis 連接密碼,如果配置了連接密碼,客戶端在連接 Redis 時需要通過 AUTH <password> 命令提供密碼,默認關閉
16
 maxclients 128
設置同一時間最大客戶端連接數,默認無限制,Redis 可以同時打開的客戶端連接數爲 Redis 進程可以打開的最大文件描述符數,如果設置 maxclients 0,表示不作限制。當客戶端連接數到達限制時,Redis 會關閉新的連接並向客戶端返回 max number of clients reached 錯誤信息
17
maxmemory <bytes>
指定 Redis 最大內存限制,Redis 在啓動時會把數據加載到內存中,達到最大內存後,Redis 會先嚐試清除已到期或即將到期的 Key,當此方法處理 後,仍然到達最大內存設置,將無法再進行寫入操作,但仍然可以進行讀取操作。Redis 新的 vm 機制,會把 Key 存放內存,Value 會存放在 swap 區
18
appendonly no
指定是否在每次更新操作後進行日誌記錄,Redis 在默認情況下是異步的把數據寫入磁盤,如果不開啓,可能會在斷電時導致一段時間內的數據丟失。因爲 redis 本身同步數據文件是按上面 save 條件來同步的,所以有的數據會在一段時間內只存在於內存中。默認爲 no
19
appendfilename appendonly.aof
指定更新日誌文件名,默認爲 appendonly.aof
20
appendfsync everysec

指定更新日誌條件,共有 3 個可選值:

  • no:表示等操作系統進行數據緩存同步到磁盤(快)
  • always:表示每次更新操作後手動調用 fsync() 將數據寫到磁盤(慢,安全)
  • everysec:表示每秒同步一次(折中,默認值)
21
vm-enabled no
指定是否啓用虛擬內存機制,默認值爲 no,簡單的介紹一下,VM 機制將數據分頁存放,由 Redis 將訪問量較少的頁即冷數據 swap 到磁盤上,訪問多的頁面由磁盤自動換出到內存中(在後面的文章我會仔細分析 Redis 的 VM 機制)
22
vm-swap-file /tmp/redis.swap
虛擬內存文件路徑,默認值爲 /tmp/redis.swap,不可多個 Redis 實例共享
23
vm-max-memory 0
將所有大於 vm-max-memory 的數據存入虛擬內存,無論 vm-max-memory 設置多小,所有索引數據都是內存存儲的(Redis 的索引數據 就是 keys),也就是說,當 vm-max-memory 設置爲 0 的時候,其實是所有 value 都存在於磁盤。默認值爲 0
24
vm-page-size 32
Redis swap 文件分成了很多的 page,一個對象可以保存在多個 page 上面,但一個 page 上不能被多個對象共享,vm-page-size 是要根據存儲的 數據大小來設定的,作者建議如果存儲很多小對象,page 大小最好設置爲 32 或者 64bytes;如果存儲很大大對象,則可以使用更大的 page,如果不確定,就使用默認值
25
vm-pages 134217728
設置 swap 文件中的 page 數量,由於頁表(一種表示頁面空閒或使用的 bitmap)是在放在內存中的,,在磁盤上每 8 個 pages 將消耗 1byte 的內存。
26
vm-max-threads 4
設置訪問swap文件的線程數,最好不要超過機器的核數,如果設置爲0,那麼所有對swap文件的操作都是串行的,可能會造成比較長時間的延遲。默認值爲4
27
glueoutputbuf yes
設置在向客戶端應答時,是否把較小的包合併爲一個包發送,默認爲開啓
28
hash-max-zipmap-entries 64
hash-max-zipmap-value 512
指定在超過一定的數量或者最大的元素超過某一臨界值時,採用一種特殊的哈希算法
29
activerehashing yes
指定是否激活重置哈希,默認爲開啓(後面在介紹 Redis 的哈希算法時具體介紹)
30
include /path/to/local.conf
指定包含其它的配置文件,可以在同一主機上多個Redis實例之間使用同一份配置文件,而同時各個實例又擁有自己的特定配置文件

Redis 數據類型

Redis支持五種數據類型:string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合)。


String(字符串)

string 是 redis 最基本的類型,你可以理解成與 Memcached 一模一樣的類型,一個 key 對應一個 value。

string 類型是二進制安全的。意思是 redis 的 string 可以包含任何數據。比如jpg圖片或者序列化的對象。

string 類型是 Redis 最基本的數據類型,string 類型的值最大能存儲 512MB。

實例

redis 127.0.0.1:6379> SET runoob "菜鳥教程"
OK
redis 127.0.0.1:6379> GET runoob
"菜鳥教程"

在以上實例中我們使用了 Redis 的 SET 和 GET 命令。鍵爲 runoob,對應的值爲 菜鳥教程

注意:一個鍵最大能存儲 512MB。


Hash(哈希)

Redis hash 是一個鍵值(key=>value)對集合。

Redis hash 是一個 string 類型的 field 和 value 的映射表,hash 特別適合用於存儲對象。

實例

DEL runoob 用於刪除前面測試用過的 key,不然會報錯:(error) WRONGTYPE Operation against a key holding the wrong kind of value

實例中我們使用了 Redis HMSET, HGET 命令,HMSET 設置了兩個 field=>value 對, HGET 獲取對應 field 對應的 value

每個 hash 可以存儲 232 -1 鍵值對(40多億)。


List(列表)

Redis 列表是簡單的字符串列表,按照插入順序排序。你可以添加一個元素到列表的頭部(左邊)或者尾部(右邊)。

實例

redis 127.0.0.1:6379> DEL runoob
redis 127.0.0.1:6379> lpush runoob redis
(integer) 1
redis 127.0.0.1:6379> lpush runoob mongodb
(integer) 2
redis 127.0.0.1:6379> lpush runoob rabitmq
(integer) 3
redis 127.0.0.1:6379> lrange runoob 0 10
1) "rabitmq"
2) "mongodb"
3) "redis"
redis 127.0.0.1:6379>

列表最多可存儲 232 - 1 元素 (4294967295, 每個列表可存儲40多億)。


Set(集合)

Redis 的 Set 是 string 類型的無序集合。

集合是通過哈希表實現的,所以添加,刪除,查找的複雜度都是 O(1)。

sadd 命令

添加一個 string 元素到 key 對應的 set 集合中,成功返回 1,如果元素已經在集合中返回 0。

sadd key member

實例

redis 127.0.0.1:6379> DEL runoob
redis 127.0.0.1:6379> sadd runoob redis
(integer) 1
redis 127.0.0.1:6379> sadd runoob mongodb
(integer) 1
redis 127.0.0.1:6379> sadd runoob rabitmq
(integer) 1
redis 127.0.0.1:6379> sadd runoob rabitmq
(integer) 0
redis 127.0.0.1:6379> smembers runoob

1) "redis"
2) "rabitmq"
3) "mongodb"

注意:以上實例中 rabitmq 添加了兩次,但根據集合內元素的唯一性,第二次插入的元素將被忽略。

集合中最大的成員數爲 232 - 1(4294967295, 每個集合可存儲40多億個成員)。


zset(sorted set:有序集合)

Redis zset 和 set 一樣也是string類型元素的集合,且不允許重複的成員。

不同的是每個元素都會關聯一個double類型的分數。redis正是通過分數來爲集合中的成員進行從小到大的排序。

zset的成員是唯一的,但分數(score)卻可以重複。

zadd 命令

添加元素到集合,元素在集合中存在則更新對應score

zadd key score member 

實例

redis 127.0.0.1:6379> DEL runoob
redis 127.0.0.1:6379> zadd runoob 0 redis
(integer) 1
redis 127.0.0.1:6379> zadd runoob 0 mongodb
(integer) 1
redis 127.0.0.1:6379> zadd runoob 0 rabitmq
(integer) 1
redis 127.0.0.1:6379> zadd runoob 0 rabitmq
(integer) 0
redis 127.0.0.1:6379> > ZRANGEBYSCORE runoob 0 1000
1) "mongodb"
2) "rabitmq"
3) "redis"

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章