Redis中的數據結構與常用命令


 

開發系統: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結構


 
LIST結構

 
SET結構

HASH結構
 

 
ZSET結構

 

其中:
SET和ZSET中沒有重復元素;
相比SET,ZSET具有排序功能;
ZSET和HASH的value也是鍵值對形式:ZSET(score,member)、HASH(field,value);
STRING類型中不僅僅是存儲字符,也可以存儲數值(整數、浮點數);
5種數據結構最終存儲的數據類型實際只有兩種:字符和數值,Redis能夠區分存儲的值是字符還是數字;

Redis中常用命令

在redis-cli中對於輸入的命令會有智能提示


 
命令 作用
HELP 獲取命令的幫助信息,學會help命令很重要
DEL 刪除key及對應的值
EXPIRE 設置鍵的過期時間,過期的鍵連同與該鍵相關的數據都將被刪除
 
help命令:
 

 
  • 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命令,專門寫了一段程序進行驗證,效果圖如下:

c#代碼:
 
 
redis-cli中執行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值的處理分為三種方式:

  1. 求和
  2. 取最大值
  3. 取最小值

執行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

版權聲明

本文為作者原創,版權歸作者雪飛鴻所有。 轉載必須保留文章的完整性,且在頁面明顯位置處標明原文鏈接

如有問題, 請發送郵件和作者聯系。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM