文章目錄
1、redis介紹
一種使用內存存儲的非關係型數據庫
2、支持的數據結構類型
類型 | 簡介 | 結構存儲的值 | 結構的讀寫能力 |
---|---|---|---|
字符串(STRING) | 二進制安全 | 可以是字符串、整數、或浮點數(Memcached相同) | 對整個字符串或者字符串的其中一部分的其中一部分執行操作; 對整數和浮點數執行自增或自減操作; |
列表(LIST) | 鏈表(雙向鏈表) | 一個鏈表,鏈表上的每個節點都包含一個字符串 | 從鏈表的兩端推入或者彈出元素; 根據偏移量對鏈表進行修剪(trim); 讀取單個或多個元素; 根據值查找或者移除元素; |
集合(SET) | 哈希表實現,元素不重複 | 包含字符串的無序收集器(unordered collection),並且被包含的每個字符串都是獨一無二、各不相同的 | 添加、獲取、移除單個元素; 檢查一個元素是否存在於集合中; 計算交集、並集、差集; 從集合裏面隨機獲取元素; |
散列(HASH) | 鍵值對集合,即編程語言中的Map類型 | 包含鍵值對的無序散列表 | 添加、獲取、移除單個鍵值對; 獲取所有鍵值對; |
有序集合(ZSET) | 將set中的元素添加一個權重參數score,元素按score有序排列 | 字符串成員(member)與浮點數分值(sore)之間的有序映射,元素的排列順序有分值的大小決定 | 添加、獲取、移除單個元素; 根據分值範圍(range)或者成員來獲取元素 |
3、Redis安裝
-
Windows
- https://github.com/MSOpenTech/redis/releases
- 啓動服務端:redis-server.exe redis.windows.conf
- 啓動客戶端:redis-cli.exe -h 127.0.0.1 -p 6379
-
Linux
yum -y install gcc gcc-c++ libstdc++-devel make MALLOC=libc wget http://download.redis.io/releases/redis-5.0.5.tar.gz tar -zxvf redis-5.0.8.tar.gz cd redis-5.0.8 make && make install
4、redis-server啓動
cd src
- 默認啓動:
redis-server
- 指定配置文件:
redis-server ../redis.conf
- 指定參數啓動:redis-server …/redis.conf --daemonize yes --port 1122 --bind 0.0.0.0
啓動配置策略(修改redis-conf文件):
-
後臺啓動
daemonize no
修改成daemonize yes
開啓守護
-
支持所有ip訪問
bind 127.0.0.1 爲 bind 0.0.0.0
-
允許外網訪問
- protected-mode yes 修改爲
protected-mode no
(3.2後增加protected-mode保護模式)
- protected-mode yes 修改爲
-
設置密碼(遠端訪問必須設置密碼):
requirepass xxxx
改爲requirepass #密碼#
-
開啓防火牆(不然遠端不可訪問)
-
firewall-cmd --add-port=6379/tcp --permanent firewall-cmd --reload
-
-
設置客戶端最大連接數:
- –maxclients 10000 2.6開始有有的,之前是寫在代碼中
5、redis-cli啓動
用於和server進行交互
-
本機連接:
redis-cli
-
遠端連接:
redis-cli -h 127.0.0.1 -p 6379
-
遠端連接(密碼):
redis-cli -h 127.0.0.1 -p 6379 -a 123456
-
測試
set foo bar get foo 或 redis-cli set zoo bar redis-cli set zoo
-
注意:windows客戶端連接遠端redis不成功原因
-
不允許公網連接
-
防火牆禁止了redis端口
-
Redis.conf 下的bind 配置需要改成0.0.0.0
-
Redis.conf 下的requirepass foobared 配置密碼
-
6、停止/重啓
注意參數只能寫在shutdown之前
- 默認關閉的是6379:
redis-cli shutdown
- 關閉指定端口redis:
redis-cli -p 1123 shutdown
- 關閉指定端口redis(密碼):
redis-cli -p 1123 -a 123456 shutdown
7、Redis 原工具介紹
- redis-server redis服務器
redis-cli redis命令行客戶端
redis-benchmark redis性能測試工具
redis-check-aof aof文件修復工具
redis-check-dump rdb文件檢查
8、Redis可視化客戶端
- Redis Destop Manager
9、配置命令
config
- 查看所有配置:
config get *
- 查看單個配置:
config get requirepass
- 設置配置:
config set requirepass 123456
10、30個配置參數介紹
序號 | 配置項 | 說明 |
---|---|---|
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 ; Redis 默認配置文件中提供了三個條件: save 900 1 save 300 10 save 60 10000 分別表示 900 秒(15 分鐘)內有 1 個更改,300 秒(5 分鐘)內有 10 個更改以及 60 秒內有 10000 個更改 |
save條件:指定在多長時間內,有多少次更新操作,就將數據同步到數據文件,可以多個條件配合 |
10 | rdbcompression yes | 指定存儲至本地數據庫時是否壓縮數據,默認爲 yes,Redis 採用 LZF 壓縮,如果爲了節省 CPU 時間,可以關閉該選項,但會導致數據庫文件變的巨大 |
11 | dbfilename dump.rdb | 指定本地數據庫文件名,默認值爲 dump.rdb |
12 | dir ./ | 指定本地數據庫存放目錄 |
13 | slaveof | 設置當本機爲 slave 服務時,設置 master 服務的 IP 地址及端口,在 Redis 啓動時,它會自動從 master 進行數據同步 |
14 | masterauth | 當 master 服務設置了密碼保護時,slav 服務連接 master 的密碼 |
15 | requirepass #密碼# | 設置 Redis 連接密碼,如果配置了連接密碼,客戶端在連接 Redis 時需要通過 AUTH 命令提供密碼,默認關閉 |
16 | maxclients 128 | 設置同一時間最大客戶端連接數,默認無限制,Redis 可以同時打開的客戶端連接數爲 Redis 進程可以打開的最大文件描述符數,如果設置 maxclients 0,表示不作限制。當客戶端連接數到達限制時,Redis 會關閉新的連接並向客戶端返回 max number of clients reached 錯誤信息 |
17 | maxmemory | 指定 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實例之間使用同一份配置文件,而同時各個實例又擁有自己的特定配置文件 |
11、基本cli命令
記住redis裏面存儲的都是字符串,所以一些數據加不加引號都一樣,例如 12 存儲後就是“12”
原始編碼:int 整數並且小於 long 2^63-1
升級編碼1:embstr 超過44字節,被修改
升級編碼2:raw
-
// 設置字符串鍵值對 set hello word // 獲取指定鍵的值 get hello
-
還記得嗎?他用的雙向鏈表結構哦。
quicklist,用的雙向鏈表,可以也可以尾插入,頭取出,所以也
// 設置列表 lpush language java lpush language python lpush language c++ // 獲得指定索引返回的列表(記住插入的元素最新的爲0) lrange language 0 0 // 獲得列表歐中最近插入的一個元素 lrange language 2 8 // 獲得列表中最近索引2 到索引8的元素 lrange language 0 -1 // 獲取所有
-
原始編碼:intset 元素都是整數類型 且 元素個數小於512個
升級編碼:hashtable
// 添加set集合元素 sadd language java sadd language python sadd language python // 無效添加 sadd language c++ // 獲得集合元素列表 smembers language
-
ziplist
原始編碼:ziplist 鍵和值的長度小於64byte 且 鍵值對個數不超過512個
升級編碼:hashtable
底層實現存儲的是2個數組,爲什麼兩個? 其中一個存儲的是 數組+鏈表方式的結構
// 設置hash hmset user name "zhangsan" age 12 hset user name "zhangsan" age 12 //發現這樣也可以 // 獲得指定hash的鍵的值 hget user name
-
還記得嗎?字符串成員(member)與浮點數分值(sore)之間的有序映射,元素的排列順序有分值的大小決定
原始編碼:ziplist 元素數量不超過128個 且 任何一個member 的長度小於64字節
升級編碼:skiplist
// 添加zset zadd language 0 java zadd language 10 python zadd language 0 python // 無效添加 zadd language 2 c // 查看指定score範圍內集合(根據score升序排列) zrangebyscore language 0 10
-
通用操作
// 刪除鍵(適合任何類型) del foo // 數據庫切換,(默認使用0,最大15,共支持16個數據庫。數據是隔離的) // 數據庫概念只有單機纔有,集羣沒有數據庫的概念 select 1 // 查看服務器信息 info // 獲得dump.rdb文件 config get dir // 備份當前數據庫的數據 save // 客戶端連接列表 client list // 客戶端設置名稱 client setname lilei // 獲取客戶端名稱 client getname // 掛起 和殺死其他客戶端 client pause 100(毫秒) client kill #ip:port# // 查看服務是否運行 ping // 查看當前key的編碼(很有意思,可以去看看所有的存儲結構) object encoding #key#
12、其他結構
2.8.9版本添加了HyperLogLog結構
-
HyperLogLog結構
-
是用來做基數統計的算法,優點是,在輸入元素的數量或者體積非常非常大時,計算基數所需的空間總是固定的,並且是很小的,在redis裏面每個HyperLogLog鍵只需要花費12kb內存,就可以計算接近2^64個不同元素的基數。這和計算基數時,元素越多耗費內存就越多的集合形成鮮明對比
-
但是HyperLogLog只會根據輸入元素來計算基數,而不會存儲輸入元素本身,所以HyperLogLog不能像集合那樣,返回輸入的各個元素
-
什麼是基數?
- 比如數據集{1,3,5,7,5,7,8},那麼這個元素的基數集爲{1,3,5,7,8},基數(不重複元素)爲5個。基數估計就是在誤差可接受的範圍內,快速計算基數(不重複的元素)
-
命令介紹
// 添加指定元素到HyperLogLog中 pfadd language redis pfadd language mongdb pfadd language mysql // 返回給定HyperLogLog的給基數(不重複元素數量)估算值 pfcount language // 將多個HyperLogLog合併爲一個HyperLogLog pfcount language foor
-
-
位圖
bitmaps
-
地理位置信息
geospatial indexes with radius queries and streams