redis提供了5種數據結構,理解每次數據結構的特色在開發和運維中是很重要的.使用redis版本:3.0.7redis
本章內容以下:shell
基本全局命令數據庫
redis
字符串.數據結構
redis
哈希結構.app
redis
有5種數據結構,它們是鍵值對中的值,對於鍵來講是一些通用命令.運維
keys pattern
例:分佈式
dbsize
dbsize
命令會返回當前數據庫中全部鍵的總數.
例:編碼
exists key
檢查key
是否存在,存在返回1
,不存在0
.spa
del key [...]
del
是通用命令,不管任何數據結構類型,del均可以將其刪除.
例:線程
返回結果爲刪除key的個數,若是刪除一個不存在的鍵,會返回0.
expire key seconds
redis
支持對鍵添加過時時間,當超過期間後鍵會被自動刪除.
ttl
命令會返回鍵剩餘的過時時間,它有三個返回值:
大於或等於0
的整數,鍵的剩餘時間.
-1
:鍵未設置過時時間.
-2
:鍵不存在.
type key
例如:key
的數據類型爲字符串類型,返回結果爲string
,鍵set爲集合類型返回結果爲set
.
type
命令時間返回的是當前鍵的數據結構類型,他們分別是string
(字符串),hash
(哈希),list
(列表),set
(集合),zset
(有序集合).
這些只是redis
對外的數據類型.
每種數據類型都有本身的內部編碼實現,並且是多種編碼,這樣redis
會在適合的場景選擇適合的內部編碼.
能夠經過object encoding
命令查詢內部編碼:
redis
的5種數據結構:
redis
數據結構與內部編碼:
字符串類型是redis
最基礎的數據類型,其餘幾種數據結構都是在字符串基礎上創建的.字符串的值能夠是字符串、數字、二進制,值最大不能夠超過512mb
.
(1) 設置值:
set
命令:爲鍵設置值.
set key value
setex
命令:爲鍵設置值,並設置秒級的過時時間.
setex key value seconds
setpx
命令:爲鍵設置值,並設置毫秒秒級的過時時間.
setpx key value millisecond
setnx
命令:向鍵設置值前判斷鍵是否存在,不存在則設置值存在則不設置.
setnx key value
setxx
命令:與setnx
相反,向鍵設置值前判斷鍵是否存在,存在則設置值存在則不設置.
setxx key value
setnx
和setxx
的使用場景:因爲redis
是單線程命令處理機制,若是多個客戶端同時向redis
服務使用setnx
命令也只會有一個客戶端執行成功.setnx
能夠用於分佈式鎖的一個解決方案.
(2) 計數:
incr
命令:用於對鍵的值進行自增操做,返回結果爲三種:
值不是整數,返回錯誤.
值是整數,返回自增後的結果.
值不存在,按照值爲0
自增,返回1
.
例:
exists key (integer) 0 incr key (integer) 1
incrby
命令:用於對鍵的值進行指定自增量的自增操做,返回結果與incr
相同.
例:
exists key (integer) 0 incrby key 10 (integer) 10
incrbyfloat
命令:用於對鍵的值進行指定浮點型自增量的自增操做.
decr
命令:用於對鍵的值進行自減操做.
decrby
命令:用於對鍵的值進行指定值進行減值操做.
append
命令:用於對鍵的值進行追加操做,返回追加後的值的得長度.
例:
set hello w OK append hello orld (integer) 5 get hello "world"
strlen
命令:用於查看鍵的值得長度.
例:
set hello world OK strlen hello (integer) 5
setrange
命令:用於鍵的值內指定索引字符的替換,若是參數是多個字符則從指定位置開始逐個替換,返回替換後值的長度.
例:
set hello world OK setrange hello 0 helloworld (integer) 10
getrange
命令:用於獲取鍵的值指定索引的內容.
getrange key start end
例:
set hello world OK getrange hello 0 2 "wor"
字符串類型的內部編碼有3種:
int
:8個字節長度的長整形.
embstr
:小於等於39個字節的字符串.
raw
:大於39個字節的字符串.
整數類型示例:
set key 6379 OK object encoding key "int"
短字符串示例:
set key hello,word OK object encoding key "embstr"
長字符串示例:
set key "one string greater than 39 char............." OK object encoding key "raw" strlen key (integer) 44
哈希類型是指鍵值自己又是一個鍵值對結構,例如:value={{field1,value1},....,{fieldN,valueN}}
.哈希類型中的映射關係叫作field-value
,這裏的value
是指field
對應的值,不是鍵對應的值.
(1) 設置值
hset
命令:
hset key field value
例:
hset user:1 name username (integer) 1 hset user:1 name codger (integer) 0
若是設置不存在的field
則相應1
,存在則相應0
.此外還提供了hsetnx
命令,它們的關係就像set
命令與setnx
命令同樣,只不過做用於轉移到field
.
(2) 獲取值
hget
命令:
hget key field
例:
hget user:2 name (nil) hget user:1 name "codger"
獲取user:1
的name
域(屬性)對應的值,不存在則返回nil
.
(3) 刪除field
hdel key field [field1...]
例:
hdel user:1 name (integer) 1
hdel
命令能夠刪除一個或多個field
,返回結果爲刪除成功的field
數量.
(4) 計算field
數量
hlen key
例:
hlen user:1 (integer) 1
hlen
命令,能夠獲取鍵對應的hash
結構值的field
數量.
(5) 批量設置或獲取field-value
hmget
命令:批量獲取鍵對應的hash
結構值的多個field
的值.
hmget key field [field...]
hmset
命令:批量設置鍵對應的hash
結構值的多個field
.
例:
(6) 判斷field
是否存在
hexists key field
例:
hexists user:1 gender (integer) 1
user:1
是否包含gender
域,包含則返回1
不包含則返回0
.
(7) 獲取全部field
hkeys key
hkeys
命令返回指定哈希鍵全部的field
.
(8) 獲取全部value
hvals key
hvals
命令返回指定哈希鍵全部的value
.
例:
(9) 獲取全部的field-value
hgetall key
例:
獲取user:1
,全部的field-value
.
(10) hincrby
和hincrbyfloat
:hincrby
與hincrbyfloat
,就像incrby
和incrbyfloat
命令用於,但它的做用域是field
.
(11) hstrlen
命令:獲取value
字符串的長度(須要redis3.2
以上)
內部編碼 | 編碼描述 |
---|---|
ziplist(壓縮列表) | 當哈希類型元素個數小於hash-max-ziplist-entries 配置(默認爲512個)、同時全部值都小於hash-max-ziplist-value 配置(默認爲64字節)時,redis 會使用ziplist 做爲哈希的內部實現,ziplist 使用更加緊湊的結構實現多個元素的連續存儲,因此在節省內存方面比hashtable 更優秀. |
hashtable(哈希表) | 當哈希類型沒法知足ziplist 的條件時,redis 會使用hashtable 做爲哈希的內部實現,由於此時ziplist 沒法保證讀寫效率. |