開發系統:Ubuntu 17.04
Redis驅動:StackExchange.Redis 1.2.3
Redis版本:3.2.1
開發平台:.NET Core
對於Redis的介紹這里只寫一句:Redis是一種基於內存的高性能非關系型數據庫,它以kye-value的形式來存儲數據。
核心對象
RedisObject,圖片來自:從搭建到應用,一文讀懂Redis
Redis五種數據結構對應的編碼方式,圖片來自:對象處理機制
編碼指的是五種數據類型在Redis內部的存儲方式,一種數據類型可對應多個編碼方式。
5種數據類型
Redis中包含5種數據類型:STRING、LIST、SET、HASH、ZSET。
Redis中的5中數據結構(截圖出自《Redis in Action》):
Redis以key-value形式存儲數據,其中key與value的關系可分為兩種:
- 1對1
在Redis的STRING數據結構中,一個key對應一個value。 - 1對*
Redis中的其余四種數據結構,一個key可以對應多個value。
為了更直觀的說明key和value間的關系,下面用幾張圖(截圖來自《Redis in Action》)來描述Redis中的五種數據結構:
STRING結構:
其中:
SET和ZSET中沒有重復元素;
相比SET,ZSET具有排序功能;
ZSET和HASH的value也是鍵值對形式:ZSET(score,member)、HASH(field,value);
STRING類型中不僅僅是存儲字符,也可以存儲數值(整數、浮點數);
5種數據結構最終存儲的數據類型實際只有兩種:字符和數值,Redis能夠區分存儲的值是字符還是數字;
Redis中常用命令
在redis-cli中對於輸入的命令會有智能提示
| 命令 | 作用 |
|---|---|
| HELP | 獲取命令的幫助信息,學會help命令很重要 |
| DEL | 刪除key及對應的值 |
| EXPIRE | 設置鍵的過期時間,過期的鍵連同與該鍵相關的數據都將被刪除 |
-
STRING
Redis對字符串提供了豐富的操作,在Redis中STRING結構用於存儲兩種類型的數據:- 數值(整數、浮點數)
- 字符串(byte string)
| 命令 | 作用 |
|---|---|
| SET | 向指定的key中寫入值 |
| GET | 從指定的key中獲取值 |
| INCR | 將指定key的值加1 |
| DECR | 將指定key的值減1 |
| INCRBY | 將指定key的值加上指定的數值 |
| DECRBY | 將指定key的值減去指定的數值 |
| APPEND | 向value中追加內容 |
| GETRANGE | GETRANGE key-name start end獲取指定索引范圍(字符串可看作是字符組成的數組)的字符,當start=0且end=-1時獲取整個字符串 |
| SETRANGE | `設置指定偏移量的字符的值 |
| GETBIT | GETBIT key-name offset 將字符串看做是二進制形式(bit string),並返回指定偏移量位置處的二進制位的值 |
| SETBIT | 設置指定偏移量位置處的二進制位的值 |
| BITCOUNT | 返回字符串中二進制位值為1的二進制位數 |
| BITOP | 對字符串執行位運算,並將計算結果存儲到指定的key中 |
對於BITCOUNT命令,專門寫了一段程序進行驗證,效果圖如下:
-
LIST
| 命令 | 作用 |
|---|---|
| LPUSH | 將一個或多個值推入列表左端 |
| RPUSH | 將一個或多個值推入列表右端 |
| LPOP | 移除並返回列表最左端的值 |
| RPOP | 移除並返回列表最右端的值 |
| LINDEX | 根據索引獲取LIST中的值 |
| LRANGE | 獲取LIST中索引在指定范圍內的值 |
| LTRIM | 從LIST中刪除索引不在指定范圍內的值,這里的索引范圍是閉區間 |
-
HASH
| 命令 | 作用 |
|---|---|
| HSET | 向HASH表中添加元素,由上圖可以看出HASH結構中存儲的值也是一個鍵值對(field value) |
| HMSET | 一次向HASH表中寫入多個鍵值對 |
| HGET | 獲取HASH中存儲的值 |
| HMGET | 一次從HASH中獲取多個值 |
| HLEN | 獲取HASH表中存儲的元素個數 |
| HDEL | 刪除HASH表中的鍵值對 |
| HEXISTS | 判斷HASH中是否包含指定field的鍵值對 |
| HKEYS | 獲取HASH中的所有鍵(field) |
| HVALS | 獲取HASH中的所有值 |
| HGETALL | 獲取HASH中的所有鍵值對 |
| HINCRBY | 將HASH中的指定value增加指定的數值 |
-
SET
SET中沒有重復元素,向SET中添加重復的數據只會存儲一份。
| 命令 | 作用 |
|---|---|
| SADD | 向SET中添加元素 |
| SREM | 移除SET中的元素 |
| SISMEMBER | 判斷某元素是否存在於SET中 |
| SCARD | 返回SET中的元素個數 |
| SMEMBERS | 返回SET中的所有元素 |
| SSCAN | 通過迭代的方式返回SET中的所有元素 |
| SMOVE | 將元素從某一集(如果該元素存在當前集合中)合移動到另一集合並返回當前元素 |
集合間運算
| 命令 | 作用 |
|---|---|
| SDIFF | 對SET集合進行補集運算(存在於第一個集合且不存在於第二個集合中的元素)並返回運算結果 |
| SDIFFSTORE | 對SET集合進行補集運算並將運算結果存儲到一個新的SET集合中 |
| SINTER | 對SET集合進行交集運算並返回運算結果 |
| SINTERSTORE | 對SET集合進行交集運算並將運算結果存儲到一個新的SET集合中 |
| SUNION | 對SET集合進行並集運算並返回運算結果 |
| SUNIONSTORE | 對SET集合進行並集運算並將運算結果存儲到一個新的SET集合中 |
-
ZSET
ZSET和SET一樣,沒有重復元素,但和SET相比它有排序功能。
| 命令 | 作用 |
|---|---|
| ZADD | 向ZSET中添加元素 |
| ZREM | 移除ZSET中的元素 |
| ZCARD | 獲取ZSET中元素的個數 |
| ZSCORE | 獲取ZSET中元素的score值 |
| ZRANK | 獲取ZSET中元素的索引 |
| ZREMRANGEBYRANK | 從ZSET中移除指定索引范圍內的元素 |
| ZREMRANGEBYSCORE | 從ZSET中移除指定score范圍內的元素 |
| ZCOUNT | 獲取ZSET中score值在指定范圍內元素的個數 |
| ZRANGE | 獲取ZSET中索引在指定范圍內的元素,ZRANGE key start stop,參數start=0且stop=-1時返回所有元素 |
集合間運算
| 命令 | 作用 |
|---|---|
| ZINTERSTORE | 對ZSET集合進行交集運算並將運算結果存儲到一個新的ZSET集合中 |
| ZUNIONSTORE | 對ZSET集合進行並集運算並將運算結果存儲到一個新的ZSET集合中 |
集合運算對於value值相同的集合元素score值的處理分為三種方式:
- 求和
- 取最大值
- 取最小值
執行ZINTERSTORE命令(ZUNIONSTORE與之類似):
- 參數destination表示用於存儲計算結果的集合的key
- 參數numkeys表示參與運算的集合數,必選
- AGGREGATE表示對score的操作方式,默認為SUM
-
參數WEIGHTS表示權重,該參數比較復雜:
-
參數WEIGHTS的個數和numkyes值相等
-
AGGREGATE值為SUM時,對於結果集中的某個value為a的元素B,參與運算的各個集合中value為a的元素的score值會分別和對應的WEIGHTS值相乘然后再將各自相乘結果相加作為結果集中元素B的score值
-
AGGREGATE值為MIN或MAX時,對於結果集中的某個value為a的元素B,參與運算的各個集合中value為a的元素中score值最小或最大的那個(若有多個,則按照命令行中指定集合的順序自左向右取第一個符合條件的集合中的元素)和對應的WEIGHTS值相乘得到的值作為結果集中元素B的score值
-
規則略復雜,自己動手寫幾遍就會明白了。ZINTERSTORE命令執行效果圖:
以下為進行集合運算的示意圖:
以對score求和的方式進行交集運算
以取score中最小值的方式進行並集運算
以對score求和的方式進行並集運算
Sort
對LIST、SET、ZSET三種數據結構中的值進行排序操作,默認是正序排列。
Publish & Subscribe
發布/訂閱模式
| 命令 | 作用 |
|---|---|
| PUBLISH | 向指定的頻道發送二進制字符串消息(binary string messages) |
| SUBSCRIBE | 訂閱指定的頻道已接受該頻道發送的消息 |
| UNSUBSCRIBE | 取消訂閱某頻道 |
下圖中展示的是使用redis-cli和stackexchange.redis進行的pub/sub測試效果:
Transcation
| 命令 | 作用 |
|---|---|
| MULTI | 表示事務的開始 |
| EXEC | 執行事務中包含的命令 |
Redis中事務(調用MULTI表示事務的開始)所包含的命令會被放到一個隊列中,當遇到EXEC命令后會不間斷的依次執行隊列中的命令。
Redis中的事務和數據庫中的事務不同,它沒有回滾操作。
Redis中的事務,若某行命令執行失敗不會影響其它命令的執行(下圖中第二行命令執行失敗,第一、三行成功執行):
StackExchange.Redis
StackExchange.Redis驅動是用C#語言寫的Redis驅動,它的API在語義上和Redis命令是類似的,在這里列舉下驅動中常用的幾個類:
-
ConnectionMultiplexer
表示一組相關的Redis服務器鏈接,StackExchage.Redis官方建議盡可能復用該對象。 -
IDatabase
該接口中定義了對5種數據結構進行操作的方法 -
RedisDatabase
IDatabase的實現類 -
RedisKey
存儲到Redis中的key -
RedisValue
存儲到Redis中的value,可用於表示STRING、LIST、SET結構中存儲的數據 -
HashEntry
表示一個HASH鍵值對 -
SortedSetEntry
表示一個ZSET元素 -
ISubscript
訂閱接口 -
RedisChannel
表示發布/訂閱中的頻道名 -
Subscription
ConnectionMultiplexer中的私有密封類,封裝和訂閱相關的信息
結語
Redis是一種NoSql數據庫,Redis服務器上默認有16個數據庫,Redis常被拿來和Memcache做比較,網上有很多這方面的文章,各位看官請自行搜索。本文着重介紹了Redis中的5中數據結構和一些常用的命令,對於第三方驅動則一筆帶過,因為在了解了Redis本身之后,可以很快的掌握第三方驅動的使用。
推薦工具
推薦圖書
- Redis in Action
參考文章
An introduction to Redis data types and abstractions
從搭建到應用,一文讀懂Redis
對象處理機制
深入剖析 redis 數據結構 redisObject
