redis學習筆記(二):基本全局命令、字符串、哈希

使用理解基本API

redis提供了5種數據結構,理解每次數據結構的特色在開發和運維中是很重要的.使用redis版本:3.0.7redis

本章內容以下:shell

  1. 基本全局命令數據庫

  2. redis字符串.數據結構

  3. redis哈希結構.app

1.1 全局命令

redis有5種數據結構,它們是鍵值對中的值,對於鍵來講是一些通用命令.運維

1.1.1 查看全部鍵

keys pattern

例:分佈式

查詢全部鍵

1.1.2 鍵總數

dbsize

dbsize命令會返回當前數據庫中全部鍵的總數.
例:
鍵數量編碼

1.1.3 檢查鍵是否存在

exists key

檢查key是否存在,存在返回1,不存在0.spa

鍵是否存在

1.1.4 刪除鍵

del key [...]

del是通用命令,不管任何數據結構類型,del均可以將其刪除.
例:線程

刪除鍵

返回結果爲刪除key的個數,若是刪除一個不存在的鍵,會返回0.

1.1.5 鍵過時

expire key seconds

redis支持對鍵添加過時時間,當超過期間後鍵會被自動刪除.

鍵超時

ttl命令會返回鍵剩餘的過時時間,它有三個返回值:

  • 大於或等於0的整數,鍵的剩餘時間.

  • -1:鍵未設置過時時間.

  • -2:鍵不存在.

查看鍵剩餘時間

clipboard.png

1.1.6 鍵的數據類型

type key

例如:key的數據類型爲字符串類型,返回結果爲string,鍵set爲集合類型返回結果爲set.

鍵類型

1.2 數據結構和內部編碼

type命令時間返回的是當前鍵的數據結構類型,他們分別是string(字符串),hash(哈希),list(列表),set(集合),zset(有序集合).
這些只是redis對外的數據類型.
每種數據類型都有本身的內部編碼實現,並且是多種編碼,這樣redis會在適合的場景選擇適合的內部編碼.
能夠經過object encoding命令查詢內部編碼:
clipboard.png

redis的5種數據結構:
redis的5種數據結構

redis數據結構與內部編碼:
redis5種數據結構的內部編碼

1.3 字符串

字符串類型是redis最基礎的數據類型,其餘幾種數據結構都是在字符串基礎上創建的.字符串的值能夠是字符串、數字、二進制,值最大不能夠超過512mb.

1.3.1 命令

(1) 設置值:

  • set命令:爲鍵設置值.

set key value
  • setex命令:爲鍵設置值,並設置秒級的過時時間.

setex key value seconds
  • setpx命令:爲鍵設置值,並設置毫秒秒級的過時時間.

setpx key value millisecond
  • setnx命令:向鍵設置值前判斷鍵是否存在,不存在則設置值存在則不設置.

setnx key value
  • setxx命令:與setnx相反,向鍵設置值前判斷鍵是否存在,存在則設置值存在則不設置.

setxx key value

setnxsetxx的使用場景:因爲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"

1.3.2 內部編碼

字符串類型的內部編碼有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

1.4 哈希

哈希類型是指鍵值自己又是一個鍵值對結構,例如:value={{field1,value1},....,{fieldN,valueN}}.哈希類型中的映射關係叫作field-value,這裏的value是指field對應的值,不是鍵對應的值.

1.4.1 命令

(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:1name域(屬性)對應的值,不存在則返回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.
hkeys

(8) 獲取全部value

hvals key

hvals命令返回指定哈希鍵全部的value.
例:
hvals
(9) 獲取全部的field-value

hgetall key

例:
hgetall
獲取user:1,全部的field-value.

(10) hincrbyhincrbyfloat:hincrbyhincrbyfloat,就像incrbyincrbyfloat命令用於,但它的做用域是field.
(11) hstrlen命令:獲取value字符串的長度(須要redis3.2以上)

1.4.2 內部編碼

內部編碼 編碼描述
ziplist(壓縮列表) 當哈希類型元素個數小於hash-max-ziplist-entries配置(默認爲512個)、同時全部值都小於hash-max-ziplist-value配置(默認爲64字節)時,redis會使用ziplist做爲哈希的內部實現,ziplist使用更加緊湊的結構實現多個元素的連續存儲,因此在節省內存方面比hashtable更優秀.
hashtable(哈希表) 當哈希類型沒法知足ziplist的條件時,redis會使用hashtable做爲哈希的內部實現,由於此時ziplist沒法保證讀寫效率.
相關文章
相關標籤/搜索