1. 程式人生 > >Redis自學筆記:3.2入門-字串型別

Redis自學筆記:3.2入門-字串型別

3.2字串型別

  • 實際上redis不只是資料庫,更多的公司和團隊將redis用作快取和
    佇列系統

3.2.1介紹

字串型別是redis最基本的資料型別,它能儲存任何形式的字串,
包括二進位制資料.你可以用其儲存使用者的郵箱、JSON化的物件甚至
是一張圖片.

  • 一個字串型別鍵允許儲存的資料的最大容量是512M
  • 字串型別是其他4中資料型別基礎,其他資料型別和字串型別
    的差別是從某種角度來說只是組織字串的形式不同.例如,

    • 列表型別是以列表的形式組織字串
    • 集合型別是以集合的形式組織字串

3.2.2 命令

  1. 賦值與取值:set key value / get key

    127.0.0.1:6379> set bar '早上好'
    OK
    127.0.0.1:6379> get bar
    "\xe6\x97\xa9\xe4\xb8\x8a\xe5\xa5\xbd"
    127.0.0.1:6379> set foo 'hello'
    OK
    127.0.0.1:6379> get foo
    "hello" 
    • $redis-cli --raw啟動客戶端,顯示中文
  2. 遞增數字:incr key

    127.0.0.1:6379> incr num
    1
    127.0.0.1:6379> incr num
    2
    • 當操作的鍵不存在時會預設值為0,所以第一次遞增後的結果是1.
    127.0.0.1:6379> set foo lorem
    OK
    127.0.0.1:6379> incr foo
    ERR value is not an integer or out of range
    • 當鍵值不是整數時,redis會提示錯誤

3.2.3實踐

  1. 文章訪問量統計

    為每篇文章使用一個名為post: 文章ID: page.view的鍵來記錄文章
    的訪問量,每次訪問文章的時候incr命令使相應的鍵值增加

    • redis對鍵的命名沒有強制的要求,但比較好的實踐是用 "物件型別:物件ID:物件屬性" 來命名一個鍵.如"user: 1: friends"
  2. 生成自增ID

    關係型資料庫中設定欄位屬性為AUTO_INCREMNT.

    redis中實現的方法:

    對於每一類物件使用名為物件型別(複數形式):count的鍵來儲存當前型別物件的數量,每增加一個新的物件時都使用incr命令增加該鍵的值.

    由於incr命令建立的鍵初始值數1,所以很容易得知,incr命令返回值既是加入該物件後的當前型別物件的總數,又是該新增加物件的ID

  3. 儲存文章資料

    每個字串型別鍵只能儲存一個字串,而一篇部落格文章是由標題、正文、
    作者與釋出時間等多個元素構成。為了儲存這些元素,我們需要使用序列化
    函式將它們轉換成字串。除此之外因為字串型別鍵可以儲存二進位制資料,
    所以也可以使用messagePack進行序列化,速度更快,佔用空間也小。
    儲存文章虛擬碼:

    # 首先獲得新文章的id
    $postID = incr posts: count
    # 將部落格文章的諸多元素序列化成字串
    $serializedPost = serialize($title,$content,$author,$time)
    # 把序列化後的字串存入字串型別的鍵中
    set post:$postID: data,$serializedPost

    獲取文章虛擬碼(以訪問id為42的文章為例):

    # 從redis中讀取文章資料
    $serializedPost = get post: 42: data
    # 將文章資料反序列化成文章的各個元素
    $title,$content,$author,$time = unserialize($serializedPost)  
    # 獲取並遞增文章的訪問數量
    $count = incr post: 42: page.view

    還可以對每個元素使用一個字串型別鍵來儲存

3.2.4命令拾遺

  1. 增加指定的整數:incrby key int(可為負,即為減)

    127.0.0.1:6379> incrby bar 2
    2
    127.0.0.1:6379> incrby bar 3
    5
  2. 減少指定的整數:decrby key int(可為負,即為加)

    127.0.0.1:6379> decrby bar 1
    4
    127.0.0.1:6379> decrby bar 3
    1
  3. 增加指定浮點數:incrbyfloat key 數(可為負,即為減,亦可為整數)

    127.0.0.1:6379> incrbyfloat bar 0.5
    1.5
    127.0.0.1:6379> incrbyfloat bar -0.5
    1
    127.0.0.1:6379> incrbyfloat bar 5e+4
    50001
  4. 向尾部追加值:append key value

    127.0.0.1:6379> set bar hello
    OK
    127.0.0.1:6379> get bar
    hello
    127.0.0.1:6379> append bar world!
    11
    127.0.0.1:6379> get bar
    helloworld!
    127.0.0.1:6379> append bar ' good'
    16
    127.0.0.1:6379> get bar
    helloworld! good
    • 該方法可以建立鍵
    127.0.0.1:6379> keys *
    bar
    127.0.0.1:6379> append foo book
    4
    127.0.0.1:6379> keys *
    bar
    foo
  5. 獲取字串長度:strlen key

    127.0.0.1:6379> strlen bar
    16
    127.0.0.1:6379> set bar 你好
    OK
    127.0.0.1:6379> strlen bar
    6
  6. 同時獲得/設定多個鍵值:meset k1 v1 k2 v2... / get k1 k2...

    127.0.0.1:6379> keys *
    
    127.0.0.1:6379> mset a 1 b 2 c 3
    OK
    127.0.0.1:6379> keys *
    b
    c
    a
    127.0.0.1:6379> mget c b a
    3
    2
    1
  7. 位操作:

getbit key offset

獲得一個字串型別鍵指定位置的二進位制位的值(0或1),索引從0開始

  • 如果超出了索引,預設值為0

setbit key offset value

設定字串指定位置的二進位制的值,返回值是該位置的舊值

bitcount key [start][end]

獲得字串型別鍵中值是1的二進位制位個數

[start][end]限制統計的位元組範圍

bitop operation destkey [key...]

對多個字串型別鍵進行位運算,並將結果儲存在deskey引數指定的鍵中

bitop支援的運算操作符:and or xor not

bitpos key value [start][end]

獲得指定鍵第一個值是value(0或者1)的位置

  • 如果不設定結束位元組且鍵值所有的二進位制位都是1,則查詢0的偏移量會是鍵值長度的下一個字位的偏移量
    127.0.0.1:6379> set foo bar
    OK
    127.0.0.1:6379> getbit foo 0
    0
    127.0.0.1:6379> getbit foo 1
    1
    127.0.0.1:6379> getbit foo 2
    1
    127.0.0.1:6379> getbit foo 3
    0
    127.0.0.1:6379> getbit foo 6
    1
  • bar三個字母對應的ascll碼為98\97\114,所以foo鍵中二進位制位結構是
    01100010 01100001 01110010
    127.0.0.1:6379> setbit foo 6 0
    1
    127.0.0.1:6379> setbit foo 7 1
    0
    127.0.0.1:6379> get foo
    aar
    127.0.0.1:6379> bitcount foo
    10
    127.0.0.1:6379> bitcount foo 0 1
    6
    127.0.0.1:6379> keys *
    foo2
    foo1
    foo
    127.0.0.1:6379> bitop or res foo1 foo2
    3
    127.0.0.1:6379> keys *
    foo2
    foo1
    res
    foo
    127.0.0.1:6379> get res
    car
    127.0.0.1:6379> bitop and res foo1 foo2
    3
    127.0.0.1:6379> get res
    `ar
    127.0.0.1:6379> bitpos foo 0
    0
    127.0.0.1:6379> bitpos foo 1
    1
    127.0.0.1:6379> bitpos foo 1 1 2
    9