Redis自學筆記

来源:https://www.cnblogs.com/xbbcm/archive/2018/03/02/8493038.html
-Advertisement-
Play Games

Redis簡介Redis 是完全開源免費的,遵守BSD協議,是一個高性能的key-value資料庫。Redis 與其他 key - value 緩存產品有以下三個特點:Redis支持數據的持久化,可以將記憶體中的數據保存在磁碟中,重啟的時候可以再次載入進行使用。Redis不僅僅支持簡單的key-val ...


Redis簡介
Redis 是完全開源免費的,遵守BSD協議,是一個高性能的key-value資料庫。
Redis 與其他 key - value 緩存產品有以下三個特點:
Redis支持數據的持久化,可以將記憶體中的數據保存在磁碟中,重啟的時候可以再次載入進行使用。
Redis不僅僅支持簡單的key-value類型的數據,同時還提供list,set,zset,hash等數據結構的存儲。
Redis支持數據的備份,即master-slave模式的數據備份。

性能極高 – Redis能讀的速度是110000次/s,寫的速度是81000次/s 。
原子 – Redis的所有操作都是原子性的,意思就是要麼成功執行要麼失敗完全不執行。單個操作是原子性的。多個操作也支持事務,即原子性,通過MULTI和EXEC指令包起來。

Window 下安裝
下載地址:https://github.com/MSOpenTech/redis/releases。Redis 支持 32 位和 64 位。
1、打開一個 cmd 視窗 使用cd命令切換目錄到 C:\redis 運行 redis-server.exe redis.windows.conf 2、這時候另啟一個cmd視窗,原來的不要關閉,不然就無法訪問服務端了。切換到redis目錄下運行 redis-cli.exe -h 127.0.0.1 -p 6379 。
3、設置鍵值對 set myKey abc
4、取出鍵值對 get myKey

Linux 下安裝
下載地址:http://redis.io/download
$ 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-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。
查看配置項CONFIG
Redis CONFIG 命令格式如下:
redis 127.0.0.1:6379> CONFIG GET CONFIG_SETTING_NAME
使用 * 號獲取所有配置項:
redis 127.0.0.1:6379> CONFIG GET *
編輯配置CONFIG SET
CONFIG SET 命令基本語法:
redis 127.0.0.1:6379> CONFIG SET CONFIG_SETTING_NAME NEW_CONFIG_VALUE

參數說明
redis.conf 配置項說明如下:
1. Redis預設不是以守護進程的方式運行,可以通過該配置項修改,使用yes啟用守護進程
daemonize no
2. 當Redis以守護進程方式運行時,Redis預設會把pid寫入/var/run/redis.pid文件,可以通過pidfile指定
pidfile /var/run/redis.pid
3. 指定Redis監聽埠,預設埠為6379,作者在自己的一篇博文中解釋了為什麼選用6379作為預設埠,因為6379在手機按鍵上MERZ對應的號碼,而MERZ取自義大利歌女Alessia Merz的名字
port 6379
4. 綁定的主機地址
bind 127.0.0.1
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

Redis 數據類型
Redis支持五種數據類型:
string(字元串)可以包含任何數據。比如jpg圖片或者序列化的對象 。一個鍵最大能存儲512MB。SET/ GET
hash(哈希)是一個鍵值(key=>value)對集合,是一個string類型的field和value的映射表,hash特別適合用於存儲對象。每個 hash 可以存儲 232 -1 鍵值對(40多億)。HMSET/ HGET
list(列表)是順序string,列表最多可存儲 232 - 1 元素 (4294967295, 每個列表可存儲40多億)。 lpush/ rpush/ lrange
set(集合)是string的無序集合。集合是通過哈希表實現的,所以添加,刪除,查找的複雜度都是O(1)。集合內元素的唯一性,第二次插入的元素將被忽略。集合中最大的成員數為 232 - 1(每個集合可存儲40多億個成員)。sadd/ smemberes
zset(sorted set:有序集合) 和 set 一樣也是string類型元素的集合,且不允許重覆的成員。
不同的是每個元素都會關聯一個double類型的分數。redis正是通過分數來為集合中的成員進行從小到大的排序。zset的成員是唯一的,但分數(score)卻可以重覆。

Redis keys 命令
序號 命令及描述
0 SET key value 設置key對應的值
1 DEL key 該命令用於在 key 存在時刪除 key。
2 DUMP key 序列化給定 key ,並返回被序列化的值。
3 EXISTS key 檢查給定 key 是否存在。
4 EXPIRE key seconds 為給定 key 設置過期時間。
5 EXPIREAT key timestamp EXPIREAT 的作用和 EXPIRE 類似,都用於為 key 設置過期時間。 不同在於 EXPIREAT 命令接受的時間參數是 UNIX 時間戳(unix timestamp)。
6 PEXPIRE key milliseconds 設置 key 的過期時間以毫秒計。
7 PEXPIREAT key milliseconds-timestamp 設置 key 過期時間的時間戳(unix timestamp) 以毫秒計
8 KEYS pattern 查找所有符合給定模式( pattern)的 key 。
9 MOVE key db 將當前資料庫的 key 移動到給定的資料庫 db 當中。
10 PERSIST key 移除 key 的過期時間,key 將持久保持。
11 PTTL key 以毫秒為單位返回 key 的剩餘的過期時間。
12 TTL key 以秒為單位,返回給定 key 的剩餘生存時間(TTL, time to live)。
13 RANDOMKEY 從當前資料庫中隨機返回一個 key 。
14 RENAME key newkey 修改 key 的名稱
15 RENAMENX key newkey 僅當 newkey 不存在時,將 key 改名為 newkey 。
16 TYPE key 返回 key 所儲存的值的類型。

Redis 字元串命令
序號 命令及描述
1 SET key value 設置指定 key 的值
2 GET key 獲取指定 key 的值。
3 GETRANGE key start end 返回 key 中字元串值的子字元
4 GETSET key value 將給定 key 的值設為 value ,並返回 key 的舊值(old value)。
5 GETBIT key offset 對 key 所儲存的字元串值,獲取指定偏移量上的位(bit)。
6 MGET key1 [key2..] 獲取所有(一個或多個)給定 key 的值。
7 SETBIT key offset value 對 key 所儲存的字元串值,設置或清除指定偏移量上的位(bit)。
8 SETEX key seconds value 將值 value 關聯到 key ,並將 key 的過期時間設為 seconds (以秒為單位)。
9 SETNX key value 只有在 key 不存在時設置 key 的值。
10 SETRANGE key offset value 用 value 參數覆寫給定 key 所儲存的字元串值,從偏移量 offset 開始。
11 STRLEN key 返回 key 所儲存的字元串值的長度。
12 MSET key value [key value ...] 同時設置一個或多個 key-value 對。
13 MSETNX key value [key value ...] 同時設置一個或多個 key-value 對,當且僅當所有給定 key 都不存在。
14 PSETEX key milliseconds value 這個命令和 SETEX 命令相似,但它以毫秒為單位設置 key 的生存時間,而不是像 SETEX 命令那樣,以秒為單位。
15 INCR key 將 key 中儲存的數字值增一。
16 INCRBY key increment 將 key 所儲存的值加上給定的增量值(increment) 。
17 INCRBYFLOAT key increment 將 key 所儲存的值加上給定的浮點增量值(increment) 。
18 DECR key 將 key 中儲存的數字值減一。
19 DECRBY key decrement key 所儲存的值減去給定的減量值(decrement) 。
20 APPEND key value 如果 key 已經存在並且是一個字元串, APPEND 命令將 指定value 追加到改 key 原來的值(value)的末尾。

Redis hash 命令
序號 命令及描述
1 HDEL key field1 [field2] 刪除一個或多個哈希表欄位
2 HEXISTS key field 查看哈希表 key 中,指定的欄位是否存在。
3 HGET key field 獲取存儲在哈希表中指定欄位的值。
4 HGETALL key 獲取在哈希表中指定 key 的所有欄位和值
5 HINCRBY key field increment 為哈希表 key 中的指定欄位的整數值加上增量 increment 。
6 HINCRBYFLOAT key field increment 為哈希表 key 中的指定欄位的浮點數值加上增量 increment 。
7 HKEYS key 獲取所有哈希表中的欄位
8 HLEN key 獲取哈希表中欄位的數量
9 HMGET key field1 [field2] 獲取所有給定欄位的值
10 HMSET key field1 value1 [field2 value2 ] 同時將多個 field-value (域-值)對設置到哈希表 key 中。
11 HSET key field value 將哈希表 key 中的欄位 field 的值設為 value 。
12 HSETNX key field value 只有在欄位 field 不存在時,設置哈希表欄位的值。
13 HVALS key 獲取哈希表中所有值
14 HSCAN key cursor [MATCH pattern] [COUNT count] 迭代哈希表中的鍵值對。

Redis 列表命令
序號 命令及描述
1 BLPOP key1 [key2 ] timeout 移出並獲取列表的第一個元素, 如果列表沒有元素會阻塞列表直到等待超時或發現可彈出元素為止。
2 BRPOP key1 [key2 ] timeout 移出並獲取列表的最後一個元素, 如果列表沒有元素會阻塞列表直到等待超時或發現可彈出元素為止。
3 BRPOPLPUSH source destination timeout 從列表中彈出一個值,將彈出的元素插入到另外一個列表中並返回它; 如果列表沒有元素會阻塞列表直到等待超時或發現可彈出元素為止。
4 LINDEX key index 通過索引獲取列表中的元素
5 LINSERT key BEFORE|AFTER pivot value 在列表的元素前或者後插入元素
6 LLEN key 獲取列表長度
7 LPOP key 移出並獲取列表的第一個元素
8 LPUSH key value1 [value2] 將一個或多個值插入到列表頭部
9 LPUSHX key value 將一個值插入到已存在的列表頭部
10 LRANGE key start stop 獲取列表指定範圍內的元素
11 LREM key count value 移除列表元素
12 LSET key index value 通過索引設置列表元素的值
13 LTRIM key start stop 對一個列表進行修剪(trim),就是說,讓列表只保留指定區間內的元素,不在指定區間之內的元素都將被刪除。
14 RPOP key 移除並獲取列表最後一個元素
15 RPOPLPUSH source destination 移除列表的最後一個元素,並將該元素添加到另一個列表並返回
16 RPUSH key value1 [value2] 在列表中添加一個或多個值
17 RPUSHX key value 為已存在的列表添加值

Redis 集合命令
序號 命令及描述
1 SADD key member1 [member2] 向集合添加一個或多個成員
2 SCARD key 獲取集合的成員數
3 SDIFF key1 [key2] 返回給定所有集合的差集
4 SDIFFSTORE destination key1 [key2] 返回給定所有集合的差集並存儲在 destination 中
5 SINTER key1 [key2] 返回給定所有集合的交集
6 SINTERSTORE destination key1 [key2] 返回給定所有集合的交集並存儲在 destination 中
7 SISMEMBER key member 判斷 member 元素是否是集合 key 的成員
8 SMEMBERS key 返回集合中的所有成員
9 SMOVE source destination member 將 member 元素從 source 集合移動到 destination 集合
10 SPOP key 移除並返回集合中的一個隨機元素
11 SRANDMEMBER key [count] 返回集合中一個或多個隨機數
12 SREM key member1 [member2] 移除集合中一個或多個成員
13 SUNION key1 [key2] 返回所有給定集合的並集
14 SUNIONSTORE destination key1 [key2] 所有給定集合的並集存儲在 destination 集合中
15 SSCAN key cursor [MATCH pattern] [COUNT count] 迭代集合中的元素

Redis 有序集合命令
序號 命令及描述
1 ZADD key score1 member1 [score2 member2] 向有序集合添加一個或多個成員,或者更新已存在成員的分數
2 ZCARD key 獲取有序集合的成員數
3 ZCOUNT key min max 計算在有序集合中指定區間分數的成員數
4 ZINCRBY key increment member 有序集合中對指定成員的分數加上增量 increment
5 ZINTERSTORE destination numkeys key [key ...] 計算給定的一個或多個有序集的交集並將結果集存儲在新的有序集合 key 中
6 ZLEXCOUNT key min max 在有序集合中計算指定字典區間內成員數量
7 ZRANGE key start stop [WITHSCORES] 通過索引區間返回有序集合成指定區間內的成員
8 ZRANGEBYLEX key min max [LIMIT offset count] 通過字典區間返回有序集合的成員
9 ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT] 通過分數返回有序集合指定區間內的成員
10 ZRANK key member 返回有序集合中指定成員的索引
11 ZREM key member [member ...] 移除有序集合中的一個或多個成員
12 ZREMRANGEBYLEX key min max 移除有序集合中給定的字典區間的所有成員
13 ZREMRANGEBYRANK key start stop 移除有序集合中給定的排名區間的所有成員
14 ZREMRANGEBYSCORE key min max 移除有序集合中給定的分數區間的所有成員
15 ZREVRANGE key start stop [WITHSCORES] 返回有序集中指定區間內的成員,通過索引,分數從高到底
16 ZREVRANGEBYSCORE key max min [WITHSCORES] 返回有序集中指定分數區間內的成員,分數從高到低排序
17 ZREVRANK key member 返回有序集合中指定成員的排名,有序集成員按分數值遞減(從大到小)排序
18 ZSCORE key member 返回有序集中,成員的分數值
19 ZUNIONSTORE destination numkeys key [key ...] 計算給定的一個或多個有序集的並集,並存儲在新的 key 中
20 ZSCAN key cursor [MATCH pattern] [COUNT count] 迭代有序集合中的元素(包括元素成員和元素分值)

Redis HyperLogLog
Redis 在 2.8.9 版本添加了 HyperLogLog 結構。
Redis HyperLogLog 是用來做基數統計的演算法,HyperLogLog 的優點是,在輸入元素的數量或者體積非常非常大時,計算基數所需的空間總是固定的、並且很小的。
在 Redis 裡面,每個HyperLogLog 鍵只需要花費12 KB 記憶體,就可以計算接近264個不同元素的基 數。這和計算基數時,元素越多耗費記憶體就越多的集合形成鮮明對比。但是,因為 HyperLogLog 只會根據輸入元素來計算基數,而不會儲存輸入元素本身,所以 HyperLogLog 不能像集合那樣,返回輸入的各個元素。
什麼是基數?比如數據集 {1, 3, 5, 7, 5, 7, 8}, 那麼這個數據集的基數集為 {1, 3, 5 ,7, 8}, 基數(不重覆元素)為5。 基數估計就是在誤差可接受的範圍內,快速計算基數。
Redis HyperLogLog 命令
序號 命令及描述
1 PFADD key element [element ...] 添加指定元素到 HyperLogLog 中。
2 PFCOUNT key [key ...] 返回給定 HyperLogLog 的基數估算值。
3 PFMERGE destkey sourcekey [sourcekey ...] 將多個 HyperLogLog 合併為一個 HyperLogLog

Redis 發佈訂閱
序號 命令及描述
1 PSUBSCRIBE pattern [pattern ...] 訂閱一個或多個符合給定模式的頻道。
2 PUBSUB subcommand [argument [argument ...]] 查看訂閱與發佈系統狀態。
3 PUBLISH channel message 將信息發送到指定的頻道。
4 PUNSUBSCRIBE [pattern [pattern ...]] 退訂所有給定模式的頻道。
5 SUBSCRIBE channel [channel ...] 訂閱給定的一個或多個頻道的信息。
6 UNSUBSCRIBE [channel [channel ...]] 指退訂給定的頻道。

Redis 事務
Redis 事務可以一次執行多個命令, 並且帶有以下兩個重要的保證:
批量操作在發送 EXEC 命令前被放入隊列緩存。
收到 EXEC 命令後進入事務執行,事務中任意命令執行失敗,其餘的命令依然被執行。
在事務執行過程,其他客戶端提交的命令請求不會插入到事務執行命令序列中。
一個事務從開始到執行會經歷以下三個階段:開始事務-->命令入隊-->執行事務
以下是一個事務的例子, 它先以 MULTI 開始一個事務, 然後將多個命令入隊到事務中, 最後由 EXEC 命令觸發事務,執行顯示2個字元串, 一併執行事務中的所有命令:
redis 127.0.0.1:6379> MULTI
redis 127.0.0.1:6379> SET book-name "Mastering C++ in 21 days"
redis 127.0.0.1:6379> GET book-name
redis 127.0.0.1:6379> SADD tag "C++" "Programming" "Mastering Series"
redis 127.0.0.1:6379> SMEMBERS tag
redis 127.0.0.1:6379> EXEC
Redis 事務命令
序號 命令及描述
1 DISCARD 取消事務,放棄執行事務塊內的所有命令。
2 EXEC 執行所有事務塊內的命令。
3 MULTI 標記一個事務塊的開始。
4 UNWATCH 取消 WATCH 命令對所有 key 的監視。
5 WATCH key [key ...] 監視一個(或多個) key ,如果在事務執行之前這個(或這些) key 被其他命令所改動,那麼事務將被打斷。

Redis 腳本
Redis 腳本使用 Lua 解釋器來執行腳本。 Reids 2.6 版本通過內嵌支持 Lua 環境。執行腳本的常用命令為 EVAL。
redis 127.0.0.1:6379> EVAL script numkeys key [key ...] arg [arg ...]
實例
redis 127.0.0.1:6379> EVAL "return {KEYS[1],KEYS[2],ARGV[1],ARGV[2]}" 2 key1 key2 first second
輸出
1) "key1"
2) "key2"
3) "first"
4) "second"
Redis 腳本命令
序號 命令及描述
1 EVAL script numkeys key [key ...] arg [arg ...] 執行 Lua 腳本。
2 EVALSHA sha1 numkeys key [key ...] arg [arg ...] 執行 Lua 腳本。
3 SCRIPT EXISTS script [script ...] 查看指定的腳本是否已經被保存在緩存當中。
4 SCRIPT FLUSH 從腳本緩存中移除所有腳本。
5 SCRIPT KILL 殺死當前正在運行的 Lua 腳本。
6 SCRIPT LOAD script 將腳本 script 添加到腳本緩存中,但並不立即執行這個腳本。

Redis 連接命令
序號 命令及描述
1 AUTH password 驗證密碼是否正確
2 ECHO message 列印字元串
3 PING 查看服務是否運行
4 QUIT 關閉當前連接
5 SELECT index 切換到指定的資料庫


Redis 伺服器命令
序號 命令及描述
1 BGREWRITEAOF 非同步執行一個 AOF(AppendOnly File) 文件重寫操作
2 BGSAVE 在後臺非同步保存當前資料庫的數據到磁碟
3 CLIENT KILL [ip:port] [ID client-id] 關閉客戶端連接
4 CLIENT LIST 獲取連接到伺服器的客戶端連接列表
5 CLIENT GETNAME 獲取連接的名稱
6 CLIENT PAUSE timeout 在指定時間內終止運行來自客戶端的命令
7 CLIENT SETNAME connection-name 設置當前連接的名稱
8 CLUSTER SLOTS 獲取集群節點的映射數組
9 COMMAND 獲取 Redis 命令詳情數組
10 COMMAND COUNT 獲取 Redis 命令總數
11 COMMAND GETKEYS 獲取給定命令的所有鍵
12 TIME 返回當前伺服器時間
13 COMMAND INFO command-name [command-name ...] 獲取指定 Redis 命令描述的數組
14 CONFIG GET parameter 獲取指定配置參數的值
15 CONFIG REWRITE 對啟動 Redis 伺服器時所指定的 redis.conf 配置文件進行改寫
16 CONFIG SET parameter value 修改 redis 配置參數,無需重啟
17 CONFIG RESETSTAT 重置 INFO 命令中的某些統計數據
18 DBSIZE 返回當前資料庫的 key 的數量
19 DEBUG OBJECT key 獲取 key 的調試信息
20 DEBUG SEGFAULT 讓 Redis 服務崩潰
21 FLUSHALL 刪除所有資料庫的所有key
22 FLUSHDB 刪除當前資料庫的所有key
23 INFO [section] 獲取 Redis 伺服器的各種信息和統計數值
24 LASTSAVE 返回最近一次 Redis 成功將數據保存到磁碟上的時間,以 UNIX 時間戳格式表示
25 MONITOR 實時列印出 Redis 伺服器接收到的命令,調試用
26 ROLE 返回主從實例所屬的角色
27 SAVE 同步保存數據到硬碟
28 SHUTDOWN [NOSAVE] [SAVE] 非同步保存數據到硬碟,並關閉伺服器
29 SLAVEOF host port 將當前伺服器轉變為指定伺服器的從屬伺服器(slave server)
30 SLOWLOG subcommand [argument] 管理 redis 的慢日誌
31 SYNC 用於複製功能(replication)的內部命令

Redis 數據備份與恢復
redis 127.0.0.1:6379> SAVE 該命令將在 redis 安裝目錄中創建dump.rdb文件。
redis 127.0.0.1:6379> CONFIG GET dir 如果需要恢複數據,只需將備份文件 (dump.rdb) 移動到 redis 安裝目錄並啟動服務即可。
redis 127.0.0.1:6379> BGSAVE 該命令在後臺執行創建 redis 備份文件。

Redis 安全
redis 127.0.0.1:6379> CONFIG set requirepass "runoob" 設置密碼驗證
redis 127.0.0.1:6379> CONFIG get requirepass 查看是否設置了密碼驗證
預設情況下 requirepass 參數是空的,這就意味著你無需通過密碼驗證就可以連接到 redis 服務。
設置密碼後,客戶端連接 redis 服務就需要密碼驗證,否則無法執行命令。
redis 127.0.0.1:6379> AUTH password 密碼驗證

Redis 性能測試
Redis 性能測試是通過同時執行多個命令實現的。
redis-benchmark [option] [option value]
redis 性能測試工具可選參數如下所示:
序號 選項 描述 預設值
1 -h 指定伺服器主機名 127.0.0.1
2 -p 指定伺服器埠 6379
3 -s 指定伺服器 socket
4 -c 指定併發連接數 50
5 -n 指定請求數 10000
6 -d 以位元組的形式指定 SET/GET 值的數據大小 2
7 -k 1=keep alive 0=reconnect 1
8 -r SET/GET/INCR 使用隨機 key, SADD 使用隨機值
9 -P 通過管道傳輸 <numreq> 請求 1
10 -q 強制退出 redis。僅顯示 query/sec 值
11 --csv 以 CSV 格式輸出
12 -l 生成迴圈,永久執行測試
13 -t 僅運行以逗號分隔的測試命令列表。
14 -I Idle 模式。僅打開 N 個 idle 連接並等待。
redis 127.0.0.1:6379> redis-benchmark -h 127.0.0.1 -p 6379 -t set,lpush -n 10000 -q 實例中主機為 127.0.0.1,埠號為 6379,執行的命令為 set,lpush,請求數為 10000,通過 -q 參數讓結果只顯示每秒執行的請求數。

Redis 客戶端連接
Redis 通過監聽一個 TCP 埠或者 Unix socket 的方式來接收來自客戶端的連接,當一個連接建立後,Redis 內部會進行以下一些操作:
首先,客戶端 socket 會被設置為非阻塞模式,因為 Redis 在網路事件處理上採用的是非阻塞多路復用模型;然後為這個 socket 設置 TCP_NODELAY 屬性,禁用 Nagle 演算法;然後創建一個可讀的文件事件用於監聽這個客戶端 socket 的數據發送。
最大連接數,在 Redis2.4 中,最大連接數是被直接硬編碼在代碼裡面的,而在2.6版本中這個值變成可配置的。maxclients 的預設值是 10000,你也可以在 redis.conf 中對這個值進行修改。
redis 127.0.0.1:6379> config get maxclients 查看最大連接數
redis 127.0.0.1:6379> redis-server --maxclients 100000 在服務啟動時設置最大連接數為 100000
客戶端命令
S.N. 命令 描述
1 CLIENT LIST 返回連接到 redis 服務的客戶端列表
2 CLIENT SETNAME 設置當前連接的名稱
3 CLIENT GETNAME 獲取通過 CLIENT SETNAME 命令設置的服務名稱
4 CLIENT PAUSE 掛起客戶端連接,指定掛起的時間以毫秒計
5 CLIENT KILL 關閉客戶端連接

Redis 管道技術
Redis是一種基於客戶端-服務端模型以及請求/響應協議的TCP服務。這意味著通常情況下一個請求會遵循以下步驟:
客戶端向服務端發送一個查詢請求,並監聽Socket返回,通常是以阻塞模式,等待服務端響應;
服務端處理命令,並將結果返回給客戶端。
Redis 管道技術可以在服務端未響應時,客戶端可以繼續向服務端發送請求,並最終一次性讀取所有服務端的響應。
查看 redis 管道,只需要啟動 redis 實例並輸入以下命令(實例中我們通過使用 PING 命令查看redis服務是否可用, 之後我們設置了 runoobkey 的值為 redis,然後我們獲取 runoobkey 的值並使得 visitor 自增 3 次。在返回的結果中我們可以看到這些命令一次性向 redis 服務提交,並最終一次性讀取所有服務端的響應):
$(echo -en "PING\r\n SET runoobkey redis\r\nGET runoobkey\r\nINCR visitor\r\nINCR visitor\r\nINCR visitor\r\n"; sleep 10) | nc localhost 6379
管道技術最顯著的優勢是提高了 redis 服務的性能。
測試數據
在下麵的測試中,我們將使用Redis的Ruby客戶端,支持管道技術特性,測試管道技術對速度的提升效果。

require 'rubygems' 
require 'redis'
def bench(descr) 
start = Time.now 
yield 
puts "#{descr} #{Time.now-start} seconds" 
end
def without_pipelining 
r = Redis.new 
10000.times { 
r.ping 
} 
end
def with_pipelining 
r = Redis.new 
r.pipelined { 
10000.times { 
r.ping 
} 
} 
end
bench("without pipelining") { 
without_pipelining 
} 
bench("with pipelining") { 
with_pipelining 
}
管道測試代碼

從處於區域網中的Mac OS X系統上執行上面這個簡單腳本的數據表明,開啟了管道操作後,往返時延已經被改善得相當低了。

without pipelining 1.185238 seconds 
with pipelining 0.250783 seconds

如你所見,開啟管道後,我們的速度效率提升了5倍。

Redis 分區
分區是分割數據到多個Redis實例的處理過程,因此每個實例只保存key的一個子集。
分區的優勢
通過利用多台電腦記憶體的和值,允許我們構造更大的資料庫。
通過多核和多台電腦,允許我們擴展計算能力;通過多台電腦和網路適配器,允許我們擴展網路帶寬。

分區的不足
redis的一些特性在分區方面表現的不是很好:
涉及多個key的操作通常是不被支持的。舉例來說,當兩個set映射到不同的redis實例上時,你就不能對這兩個set執行交集操作。
涉及多個key的redis事務不能使用。
當使用分區時,數據處理較為複雜,比如你需要處理多個rdb/aof文件,並且從多個實例和主機備份持久化文件。
增加或刪除容量也比較複雜。redis集群大多數支持在運行時增加、刪除節點的透明數據平衡的能力,但是類似於客戶端分區、代理等其他系統則不支持這項特性。然而,一種叫做presharding的技術對此是有幫助的。

分區類型
Redis 有兩種類型分區。 假設有4個Redis實例 R0,R1,R2,R3,和類似user:1,user:2這樣的表示用戶的多個key,對既定的key有多種不同方式來選擇這個key存放在哪個實例中。也就是說,有不同的系統來映射某個key到某個Redis服務。
範圍分區
最簡單的分區方式是按範圍分區,就是映射一定範圍的對象到特定的Redis實例。
比如,ID從0到10000的用戶會保存到實例R0,ID從10001到 20000的用戶會保存到R1,以此類推。
這種方式是可行的,並且在實際中使用,不足就是要有一個區間範圍到實例的映射表。這個表要被管理,同時還需要各 種對象的映射表,通常對Redis來說並非是好的方法。
哈希分區
另外一種分區方法是hash分區。這對任何key都適用,也無需是object_name:這種形式,像下麵描述的一樣簡單:
用一個hash函數將key轉換為一個數字,比如使用crc32 hash函數。對key foobar執行crc32(foobar)會輸出類似93024922的整數。
對這個整數取模,將其轉化為0-3之間的數字,就可以將這個整數映射到4個Redis實例中的一個了。93024922 % 4 = 2,就是說key foobar應該被存到R2實例中。

Java 使用 Redis
開始在 Java 中使用 Redis 前, 我們需要確保已經安裝了 redis 服務及 Java redis 驅動,且你的機器上能正常使用 Java。
首先你需要下載驅動包 下載 jedis.jar,確保下載最新驅動包。在你的 classpath 中包含該驅動包。
連接到 redis 服務

 1 import redis.clients.jedis.Jedis;
 2  
 3 public class RedisJava {
 4     public static void main(String[] args) {
 5         //連接本地的 Redis 服務
 6         Jedis jedis = new Jedis("localhost");
 7         System.out.println("連接成功");
 8         //查看服務是否運行
 9         System.out.println("服務正在運行: "+jedis.ping());
10     }
11 }
連接到 redis 服務

Redis Java String(字元串) 實例

import redis.clients.jedis.Jedis;

public class RedisStringJava {
public static void main(String[] args) {
//連接本地的 Redis 服務
Jedis jedis = new Jedis("localhost");
System.out.println("連接成功");
//設置 redis 字元串數據
jedis.set("runoobkey", "www.runoob.com");
// 獲取存儲的數據並輸出
System.out.println("redis 存儲的字元串為: "+ jedis.get("runoobkey"));
}
}
Redis Java String字元串實例

Redis Java List(列表) 實例

import java.util.List;
import redis.clients.jedis.Jedis;

public class RedisListJava {
public static void main(String[] args) {
//連接本地的 Redis 服務
Jedis jedis = new Jedis("localhost");
System.out.println("連接成功");
//存儲數據到列表中
jedis.lpush("site-list", "Runoob");
jedis.lpush("site-list", "Google");
jedis.lpush("site-list", "Taobao");
// 獲取存儲的數據並輸出
List<String> list = jedis.lrange("site-list", 0 ,2);
for(int i=0; i<list.size(); i++) {
System.out.println("列表項為: "+list.get(i));
}
}
}
Redis Java List列表實例

Redis Java Keys 實例

import java.util.Iterator;
import java.util.Set;
import redis.clients.jedis.Jedis;

public class RedisKeyJava {
public static void main(String[] args) {
//連接本地的 Redis 服務
Jedis jedis = new Jedis("localhost");
System.out.println("連接成功");

// 獲取數據並輸出
Set<String> keys = jedis.keys("*"); 
Iterator<String> it=keys.iterator() ; 
while(it.hasNext()){ 
String key = it.next(); 
System.out.println(key); 
}
}
}
Redis Java Keys實例

 

  


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • KeepAlived系列文章:http://www.cnblogs.com/f-ck-need-u/p/7576137.html 本文目錄:1. keepalived+lvs:健康狀況檢查示例2. keepalived+lvs:高可用+健康檢查示例3. keepalived+lvs:多實例+高可用( ...
  • Docker是什麼? Docker是一個虛擬環境容器,可以將你的環境、代碼、配置文件等一併打包到這個容器中,併發布和應用到任意平臺中。比如,你在本地部署了git,jenkins等,可以將其與插件一併打包到容器中,部署到任何你想部署的環境。簡單而迅速 Docker的三個概念 Ubuntu Docker ...
  • 今天啟動虛擬機,ssh服務起不來,提示如下: Starting sshd: /usr/sbin/sshd: error while loading shared libraries: libcrypto.so.10: cannot open shared object file: No such f ...
  • 請耐心閱讀,下麵有驚喜! 1.創建資料庫 2.創建各表(表結構;約束) 3.添加/插入 數據 4.查詢數據 5.修改數據 6.刪除數據 輔助blog MySQL 獲得當前日期時間 函數 獲得當前日期+時間(date + time)函數:now() mysql> select now(); + +| ...
  • The Employee table holds all employees including their managers. Every employee has an Id, and there is also a column for the manager Id. + + + + + | ...
  • problem: Write a SQL query to rank scores. If there is a tie between two scores, both should have the same ranking. Note that after a tie, the next ra ...
  • 1. 安裝 1.1. 下載spark安裝包 下載地址spark官網:http://spark.apache.org/downloads.html 這裡我們使用 spark-1.6.2-bin-hadoop2.6版本. 1.2. 規劃安裝目錄 /opt/bigdata 1.3. 解壓安裝包 tar - ...
  • 1. 配置系統環境 主機名,ssh互信,環境變數等 本文略去jdk安裝,請將datanode的jdk安裝路徑與/etc/hadoop/hadoop-evn.sh中的java_home保持一致,版本hadoop2.7.5 修改/etc/sysconfig/network 然後執行命令hostname ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...