redis常用數據類型及API使用

0.通用命令

一些簡單通用命令

主要包括keys、dbsize、exists key、del key[key …] 、expire key seconds、type key

  • keys(redis數據庫中所有的鍵)
    遍歷出所有的key
    keys一般不建議在生產環境中使用,生產環境的key值比較多,一方面這麼多的key值找起來很麻煩,另一方面這個是一個o(n)的操作
    keys hel*可以顯示出來所有的hel相關的
  • dbsize(可以算出數據庫的大小)
    可以算出key的總數,redis內置的計數器,實時的更新redis中key的總數。時間複雜度是o(1)
  • exists key
    可以判斷一個key值是否存在,key可以是任意數據類型
    如 exist a來判斷a這個鍵是否存在
  • del key[key …]
    刪除指定的key,value,這個命令可以刪除多個的
    如刪除a:del a,成功刪除就是1,錯誤刪除就是0,刪除多個會返回刪除的數量
    在這裏插入圖片描述
  • expire key seconds(爲Key設置過期時間)
    key在seconds秒後過期如:
    在這裏插入圖片描述
    ttl key
    查看當前key剩餘的過期時間
    在這裏插入圖片描述
    persist key
    去掉key的過期時間
  • type key
    返回key的類型,主要類型有string、hash、list、set、zSet、none
    在這裏插入圖片描述

時間複雜度比較

命令 時間複雜度
keys o(n)
dbsize o(1)
del o(1)
exists o(1)
expire o(1)
type o(1)

數據結構和內部編碼

編碼方式(encoding): string、hash、list、set、sorted set
在這裏插入圖片描述

單線程架構

redis使用了單線程的架構,那爲什麼使用了單線程速度還是那麼快呢?主要原因有一下幾點:

  • 純內存(我們知道數據放入內存中是非常快的)
  • 非阻塞IO
  • 避免線程切換和競態消耗

主要還是第1條,第2、3條是起到輔助的作用
redis使用中需要注意的地方:
1.一次只運行一條命令
2.拒絕長(慢)命令
keys,flushall,flushdb,slow lua script,mutil/exec, operate big value(collection)
一般這些命令,比如你用了一個keys,而存在很多key,這樣後面的命令就會一直在等待。
3.其實redis也不是絕對的單線程,例如執行以下命令的時候,就會新開一個線程去執行
fysnc file descriptor
close file descriptor

1.字符串類型

基本結構和命令

對於redis,它的所有鍵都是字符串,它的值可以多種類型,值可以爲字符串、數字、bit形、JSON串等
字符串類型的value是不能大於512MB的,一般建議key、value在100M以內。

字符串類型的使用場景

  • 緩存
  • 計數器(如視頻網站的計數器,比如每次播放視頻)
  • 分佈式鎖等

命令

  • get(o(1))
    get key獲取key指定的value
  • set(o(1))
    設置key-value
  • del(o(1))
    del key,刪除指定的key
  • incr(o(1))
    incr key表示自增1,如果key不存在,自增後get(key)=1
  • decr(o(1))
    decr key 表示自減1,如果key不存在,自增後get(key)=-1
  • incrby(o(1))
    incrby key k 表示自增k,如果key不存在,自增後get(key)=k
  • decrby(o(1))
    decrby key k 表示自減k,如果key不存在,自增後get(key)=-k

實戰

  • 用redis寫個小程序來記錄網站每個用戶個人主頁的訪問量?
    incr userId: pageview(單線程:無競爭),每個userId頁面訪問量進行了區分,自增,redis是天然適合作爲計數器的,因爲它是單線程:無競爭
  • 緩存視頻的基本信息(數據源在MySQL中)
    先從緩存中根據Id取數據,如果沒有則從數據庫中取,並存入緩存中
  • 分佈式id生成器
    incr id(原子操作)
  • set key value(o(1))
    不管key是否存在, 都設置
  • setnx key vaue(o(1))
    key不存在,才設置
  • set key value xx(o(1))
    key存在才設置,相當於更新操作
  • mget (o(n))
    批量獲取key,是一個原子操作,如:mget key1 key2 key3…
    n次get=n次網絡時間+n次命令時間,像mget這種操作就可以省去大量的網絡時間,1次mget=1次網絡時間+n次命令時間。使用的時候也要節制去使用。
  • mset(o(n))
    批量設置key-value,mset key1 value1 key2 value2…

查缺補漏

  • getset key newvalue o(1)
    set key newvalue並返回舊的value
  • append key value o(1)
    將value追加到舊的value
  • strlen key o(1)
    返回字符串的長度(注意中文)
  • incrbyfloat o(1)
    增加key對應的值3.5
  • getrange key start end o(1)
    獲取字符串指定下標所有的值
  • setrange key index value o(1)
    設置指定下標所有對應的值
    字符串命令總結:
命令 含義 複雜度
set key value 設置key-value o(1)
get key 獲取key-value o(1)
del key 刪除key-value o(1)
setnx setxx 根據key是否存在設置key-value o(1)
Incr desc 計數 o(1)
mget mset 批量操作key-value o(n)

2.哈希類型

重要API

所有Hash的命令都是以h開頭的,最簡單的三個命令hget、hset、hdel

  • hget key field (o(1))
    獲取hash key 對應的field的value
  • hset key field value(o(1))
    設置hash key 對應field的value
  • hdel key field(o(1))
    刪除hash key 對應field的value
  • hexists key field(o(1))
    判斷hash key是否有field
  • hlen key(o(1))
    獲取hash key field的數量
  • hmget key field1 field2 … fieldN(o(n))
    批量獲取hash key 的一批field對應的值
  • hmset key field1 value1 field2 value2…fieldN valueN(o(n))
    批量設置hash key的一批field value

hash實戰

  • 記錄網站每個用戶個人主頁的訪問量?
    使用的命令:hincrby user:1:info pageview count

hash vs string

string hash
get hget
set setnx hset hsetnx
incr incrby decr decrby hincrby
del hdel
mset hmset
mget hmget

查缺補漏

  • hgetall key(o(n))
    返回hash key對應所有的field和value

  • hvals key(o(n))
    返回hash key對應所有field的value

  • hkeys key(o(n))
    返回hash key對應所有field

  • hsetnx(o(1))
    hsetnx key field value:設置hash key對應field的value(如field已經存在,則失敗)

  • hincrby(o(1))
    hincrby key field intCounter: hash key對應的field的value自增intCounter

  • hincrbyfloat(o(1))
    hincrbyfloat key field floatCounter
    hincrby浮點數版本

在這裏插入圖片描述

hash總結

命令 複雜度
hget、hset、hdel o(1)
hexists o(1)
hincrby o(1)
hgetall、hvals、hkeys o(n)
hmget、hmset o(n)

3.列表類型

特點

有序、可以重複、左右兩邊插入彈出

重要API

  • rpush(o(1~n)根據實際插入的元素個數來計)
    rpush key value1 value2 …valueN
    從列表右端插入值(1-N個)

  • lpush(o(1~n)根據實際插入的元素個數來計)
    從列表左端插入值

  • linsert(o(n))
    linsert key before | after value newValue
    在list指定的值前|後插入newValue,它的時間複雜度是o(n)因爲它要遍歷這個列表
    用法,比如:a->b->c->d
    執行linsert listkey before b java之後
    a->java->b->c->d

  • lpop key(o(1))
    從列表左邊彈出一個item

  • rpop key(o(1))
    從列表右邊彈出一個item

  • lrem(o(n))
    在這裏插入圖片描述

  • ltrim key start end(o(n))
    按照索引範圍修剪列表

  • lrange(o(n))
    lrange key start end(包含end),獲取列表指定索引範圍所有item

  • lindex(o(n))
    lindex key index
    獲取列表指定索引的item

  • llen(o(1))
    llen key:算出列表的長度

  • lset(o(n))
    lset key index newValue:設置列表指定索引值爲newValue

應用

比如微博中,你關注的人更新的微博動態,lpush

查缺補漏

  • blpop(o(1))
    blpop key timeout
    lpop阻塞版本,timeout是阻塞超時時間,timeout=0爲永遠不阻塞
  • brpop (o(1))
    brpop key timeout
    rpop 阻塞版本,timeout是阻塞超時時間,timeout=0爲永遠不阻塞

Tips

  • LPUSH + LPOP = Stack
  • LPUSH + RPOP = Queue
  • LPUSH + LTRIM = Capped Collection
  • LPUSH + BRPOP = Message Queue

4.集合類型

特點

無序、無重複元素、集合間操作
所有的API都是以s開頭

集合內API和實戰

  • sadd(o(1))
    sadd key element
    向集合key添加element(如果element已經存在,添加失敗)

  • srem key element(o(1))
    將集合key中的element移除掉
    在這裏插入圖片描述

  • scard user:1:follow
    計算集合大小
    在這裏插入圖片描述

  • sismember user:1:follow it (存在)
    判斷it是否在集合中
    在這裏插入圖片描述

  • srandmember user:1:follow count
    從集合中隨機挑count個元素
    在這裏插入圖片描述

  • spop user:1:follow
    在這裏插入圖片描述
    從集合中隨機彈出一個元素

  • smembers user:1:follow
    在這裏插入圖片描述
    獲取集合所有元素,如果集合中有非常多的數據要注意,因爲redis是單線程的,這樣會阻塞。
    注意:
    spop從集合中彈出元素,srandmember不會破壞集合

應用

抽獎系統、like、贊、踩、標籤(tag)

集合間API和實戰

比如說微博中共同關注的好友呀,共同關注的興趣呀,就會用到set數據結構

  • sdiff:差集
  • sinter:交集
  • sunion:並集
    在這裏插入圖片描述

Tips

SADD = Tagging
SPOP/SRANDMEMBER = Random item
SADD + SINTER = Social Graph

5.有序集合類型

特點

按照scrore分值來組成有序的集合、有序集合都是以z開頭的命令

重要API

  • zadd(o(logN))
    zadd key core element(可以是多對),添加score和element

  • zrem(o(1))
    zrem key element(可以是多個)
    刪除元素

  • zscore(o(1))
    zscore key element
    返回元素的分數

  • zincrby(o(1))
    zincrby key increScore element
    增加或減少元素的分數

  • zcard(o(1))
    zcard key
    返回元素的總個數

  • zrank
    獲取某個元素的排名

  • zrange (o(log(n) + m))
    zrange key start end [WITHSCORES]
    返回指定索引範圍內的升序元素[分值]
    WITHSCORES:是否將元素的分值進行打印

  • zrangebyscore o(log(n) + m)
    zrangebyscore key minScore maxScore[WITHSCORES]
    返回指定分數範圍內的升序元素[分值]

  • zcount (o(log(n) + m))
    zcount key minScore maxScore
    返回有序集合內在在指定分數範圍內的個數

  • zremrangebyrank(o(log (n) + m))
    zremrangebyrank key start end
    刪除指定排名內的升序元素

  • zremrangebyscore(o(log(n) + m))
    zremrangebyscore key minScore maxScore

操作:
在這裏插入圖片描述

實戰

排行榜(銷售榜、音樂排行榜、圖書排行榜)

查缺補漏

  • zrevrank
  • zrevrange
  • zrevrangebyscore
  • zinterstore
  • zunionstore

有序集合總結

操作類型 命令
基本操作 zadd、zrem、zcard、zincrby、zscore
範圍操作 zrange、zrangebyscore、zcount、zremrangebyrank
集合操作 zunionstore、zinterstore
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章