redis 詳解一看便知

1,什麼是redis?

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

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

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

2,Redis優勢

  1. 性能極高-Redis能讀的速度時110000次/s,寫的速度是81000次/s
  2. 豐富的數據類型-Redis支持二進制案例的String(字符串), Lists(列表), Hashes(散列), Sets(集合)及OrderedSets(有序集合)數據類型操作,
  3. 原子-Redis的所有操作都是原子性的,意思就是說要麼成功執行,要麼失敗完全不執行,單個操作是原子性的,多個操作也支持事物,即原子性,通過MULTI和EXEC指令包起來
  4. 豐富的特性--Redis還支持publish/subscribe,通知,key,過期等等特性

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

  1. Redis有着更復雜的數據結構並且提供對他們原子性操作,這是一個不同於其他數據庫的進化路徑,Redis的數據類型是基於數據結構的同時對程序員透明,無需進行額外的抽象
  2. Redis運行在內存中但是可以持久化到磁盤,所以對不同數據及進行高速讀寫時需要權衡內存,因爲數據量不能大於硬件內存,在內存數據庫方面的另一個優點是,相比在磁盤上相同的複雜的數據結構,在內存彙總操作起來非常簡單,這樣Redis可以做很多內部複雜性很強的事情.同時,在磁盤格式方面他們是緊湊的以追加的方式產生,因爲他們並不需要進行隨機訪問

4,安裝

Windows安裝地址:

  • https://github.com/MSOpenTech/redis/releases

redis支持32位和64位.這個需要根據系統平臺的實際情況選擇.

 

解壓完以後是這樣一個目錄,打開一個cmd窗口,使用cd命令切換到D:\Redis下運行:

redis-server.exe redis.windows.conf

開啓服務,在w10的系統中開啓服務,就會在進程中每當開機的時候,redis服務就會啓動,如果不是的話,每次就要開啓一下服務,

然後一下客戶端連接一下:

redis-cli.exe -h 127.0.0.1 -p 6379

這時指定那臺服務器上的redis服務,看是否ping的通

5,Redis的配置

Redis配置文件位於Redis目錄下,文件名爲redis.conf.

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

redis 127.0.0.1:6379> CONFIG GET CONFIG_SETTING_NAME

查詢所有參數配置

CONFIG GET *

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132

133

134

135

136

127.0.0.1:6379> CONFIG GET *

  1"dbfilename"

  2"dump.rdb"

  3"requirepass"

  4) ""

  5"masterauth"

  6) ""

  7"unixsocket"

  8) ""

  9"logfile"

 10"server_log.txt"

 11"pidfile"

 12) ""

 13"maxmemory"

 14"104857600"

 15"maxmemory-samples"

 16"5"

 17"timeout"

 18"0"

 19"auto-aof-rewrite-percentage"

 20"100"

 21"auto-aof-rewrite-min-size"

 22"67108864"

 23"hash-max-ziplist-entries"

 24"512"

 25"hash-max-ziplist-value"

 26"64"

 27"list-max-ziplist-size"

 28"-2"

 29"list-compress-depth"

 30"0"

 31"set-max-intset-entries"

 32"512"

 33"zset-max-ziplist-entries"

 34"128"

 35"zset-max-ziplist-value"

 36"64"

 37"hll-sparse-max-bytes"

 38"3000"

 39"lua-time-limit"

 40"5000"

 41"slowlog-log-slower-than"

 42"10000"

 43"latency-monitor-threshold"

 44"0"

 45"slowlog-max-len"

 46"128"

 47"port"

 48"6379"

 49"tcp-backlog"

 50"511"

 51"databases"

 52"16"

 53"repl-ping-slave-period"

 54"10"

 55"repl-timeout"

 56"60"

 57"repl-backlog-size"

 58"1048576"

 59"repl-backlog-ttl"

 60"3600"

 61"maxclients"

 62"10000"

 63"watchdog-period"

 64"0"

 65"slave-priority"

 66"100"

 67"min-slaves-to-write"

 68"0"

 69"min-slaves-max-lag"

 70"10"

 71"hz"

 72"10"

 73"cluster-node-timeout"

 74"15000"

 75"cluster-migration-barrier"

 76"1"

 77"cluster-slave-validity-factor"

 78"10"

 79"repl-diskless-sync-delay"

 80"5"

 81"tcp-keepalive"

 82"0"

 83"cluster-require-full-coverage"

 84"yes"

 85"no-appendfsync-on-rewrite"

 86"no"

 87"slave-serve-stale-data"

 88"yes"

 89"slave-read-only"

 90"yes"

 91"stop-writes-on-bgsave-error"

 92"yes"

 93"daemonize"

 94"no"

 95"rdbcompression"

 96"yes"

 97"rdbchecksum"

 98"yes"

 99"activerehashing"

100"yes"

101"protected-mode"

102"yes"

103"repl-disable-tcp-nodelay"

104"no"

105"repl-diskless-sync"

106"no"

107"aof-rewrite-incremental-fsync"

108"yes"

109"aof-load-truncated"

110"yes"

111"maxmemory-policy"

112"noeviction"

113"loglevel"

114"notice"

115"supervised"

116"no"

117"appendfsync"

118"everysec"

119"appendonly"

120"no"

121"dir"

122"D:\\Redis"

123"save"

124"jd 900 jd 300 jd 60"

125"client-output-buffer-limit"

126"normal 0 0 0 slave 268435456 67108864 60 pubsub 33554432 8388608 60"

127"unixsocketperm"

128"0"

129"slaveof"

130) ""

131"notify-keyspace-events"

132) ""

133"bind"

134"127.0.0.1"

127.0.0.1:6379>

設置命令:

redis 127.0.0.1:6379> CONFIG SET CONFIG_SETTING_NAME NEW_CONFIG_VALUE

1

2

3

4

5

6

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

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

         save 900 1

          save 300 10

          save 60 10000

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

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

      appendfsync everysec

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

          hash-max-zipmap-value 512

  29. 指定是否激活重置哈希,默認爲開啓(後面在介紹Redis的哈希算法時具體介紹)
    • activerehashing yes
  30. 指定包含其它的配置文件,可以在同一主機上多個Redis實例之間使用同一份配置文件,而同時各個實例又擁有自己的特定配置文件
    • include /path/to/local.conf

6,Redis 數據類型

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

  1. String(字符串)string是redis最基本類型,你可以理解成與Memcached一模一樣的類型,一個key對應一個value.string類型是二進制安全的,意思是redis的string可以包含任何數據,比如jpg圖片或者序列化的對象,string類型是Redis最基本的數據類型,string類型的最大能存儲512M
  2. Hash(哈希) Redis hash是一個鍵值(key=>value)對集合,Redis hash是一個string類型的field和value的映射表,hash特別適合用於存儲對象
  3. List(列表) Redis列表是簡單的字符串列表,按照插入排序,可以添加一個元素到列表的頭部(左邊)或者尾部(右邊)
  4. Set(集合) Redis的Set是string類型的無序集合,集合是通過哈希表實現的,所以添加,刪除,查找的複雜度都是O(1)
  5. Zset(soorted set: 有序集合) Redis zset一樣也是string類型元素的集合,且不允許重複的成員,不同的是每個元素都會關聯一個double類型的分數,redis正式是通過分數來爲集合中的成員進行從小到大的排序,zset的成員是唯一的,但分數(score)卻可以重複

7,Redis的命令

Redis命令用於在redis服務上執行操作,要在redis服務上執行命令需要一個redis客戶端.Redis客戶端在我們之前下載的redis的安裝包中

redis-cli

在遠程服務上執行命令(遠程連接)

redis-cli -h host -p port -a password

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