Redis:三、Key和Value


1 Redis的值value(數據結構類型)

  Redis的數據結構類型,指的就是redis的值value的類型

  Redis常用的數據結構類型:string、list、set、sortedSet、hash

2 Redis的鍵key

2.1 key的類型

  redis的key 值是二進制安全的,這意味着可以用任何二進制序列作為key值,從形如”foo”的簡單字符串到一個JPEG文件的內容都可以。

  空字符串也是有效key值。

  redis建議使用字符串做為key的類型

2.2 key取值規范

  (1)鍵值不需要太長,消耗內存,在數據中查找這類鍵值的計算成本較高

  (2)鍵值不宜過短,可讀性較差,通常建議見名知意

2.2.1 取值舉例

  將如下數據庫表中的數據,轉換為redis的key-value存儲

id

username

password

email

1

lisi

111111

lisi@163.com

127.0.0.1:6379> set user:id:1:username lisi

OK

127.0.0.1:6379> set user:id:1:password 111111

OK

127.0.0.1:6379> set user:id:1:email lisi@163.com

OK

127.0.0.1:6379> keys user:id:1* #查找有幾個屬性

1) "user:id:1:password"

2) "user:id:1:username"

3) "user:id:1:email"

127.0.0.1:6379>

2.3 Key命令

exists key

    檢查給定key是否存在。注意事項,不支持通配符

del key

    刪除一個key

del key1 key2 key3  刪除多個key

keys pattern (模糊查找)

    查找所有符合給定模式 pattern 的 key 。

    keys * 匹配數據庫中所有 key 。

    keys n?me 匹配 name、neme、nfme 等。

    keys n* 匹配 name、neme、naaaaame等。

    keys n[ae]me 只能匹配 name、neme。

expire key seconds

    指定key的過期時間。

    新添加的key,如果沒有指定過期時間,則會一直保存。

    可以對一個已經帶有生存時間的key執行EXPIRE命令,新指定的生存時間會取代舊的生存時間。

ttl key   (time to live)

    查看某個key的剩余過期時間,返回值:

    -2 表示這個key已經過期,刪除掉

    -1 表示沒有設置過期時間

    其它 表示剩余的生存時間,單位為秒。

rename

    語法格式:rename key newkey

    將 key 改名為 newkey 。

    當 key 和 newkey 相同,或者 key 不存在時,返回一個錯誤。

    當 newkey 已經存在時, RENAME 命令將覆蓋舊值。

type key

  查看key對應的value的數據結構類型。

  其它key命令見redis幫助文檔   http://doc.redisfans.com/

get key

  查看某一個key的值

2.4 string類型

        string類型是redis最常用的數據結構類型,存儲的值為字符串。

2.4.1 String相關命令

set key value

    設置一個key,值為value,類型為String類型;如果這個key已經存在,則更新這個key的值。

    返回值

        1 表示成功

        0 表示失敗

setnx key value

    如果這個key不存在,則設置一個key,值為value;如果key存在,則不做更新。

    返回值

        1 表示成功

        0 表示失敗

get key

    獲取key對應的value值;如果key不存在,則返回nil

mget key1 key2 key3

    一次獲取多個key的值,如果對應key不存在,則對應返回nil。

incr key

    將 key 中儲存的數字值增一,然后返回。

    如果這個key不存在,那么key的值會先被初始化為0,然后再執行INCR操作。

    如果這個key對應的value值,不能表示數字,則會返回一個錯誤。

incrby key increment

    將key增加指定的步長值。

decr key

    將 key 中儲存的數字值減一,然后返回。

    如果這個key不存在,那么key的值會先被初始化為0,然后再執行INCR操作。

    如果這個key對應的value值,不能表示數字,則會返回一個錯誤。

    Redis的key是單線程模式,這就意味一瞬間只有一個線程能夠持有這個key,所以可以使用redis解決部分涉及線程安全的業務。

    (1)在實際的開發過程中,如果涉及到多線程安全問題。能不加鎖,盡量不加鎖。因為加鎖效率低(需要頻繁去判斷是否存在鎖;要不斷的等待|喚醒)

    (2)對於線程加鎖的問題,可以考慮使用redis來解決。原因:redis的key是單線程模式。

decrby key decrement

    將key減少對應的步長值。

append key value

    如果key已經存在,則將value追加到這個key原先的value值的末尾。

    如果這個key不存在,則執行set操作。

127.0.0.1:6379> help @string 查看string類型的幫助文檔

127.0.0.1:6379> help set   查看set命令的幫助文檔

2.4.2 String類型的應用場景

  (1)、做與統計有關的業務,如新浪微博(微信朋友圈)中的點贊功能

  (2)解決多線程的線程安全問題。

    Redis的key是單線程模式,這就意味一瞬間只有一個線程能夠持有這個key,所以可以使用redis解決部分涉及線程安全的業務,比如說搶購、秒殺。

2.5 List類型

2.5.1 特點

  (1)、基於Linked List實現

  (2)、元素是字符串類型

  (3)、列表頭尾增刪快,中間增刪慢,增刪元素是常態

  (4)、元素可以重復出現

  (5)、最多包含2^32-1元素

wps2

  列表的索引

    從左至右,從0開始

    從右至左,從-1開始

wps3

2.5.2 List類型相關命令

lpush key value [value ...]

  將一個或多個值value插入到列表key的表頭(即從左邊插入);

  如果有多個value值,那么各個value值按從左到右的順序依次插入到表頭:比如說,對空列表mylist執行命令LPUSH mylist a b c,列表的值將是 c b a 這等同於原子性地執行 LPUSH mylist a 、 LPUSH mylist b 和 LPUSH mylist c 三個命令;

  如果 key 不存在,一個空列表會被創建並執行 LPUSH 操作。

  當 key 存在但不是列表類型時,返回一個錯誤。

rpush key value [value ...]

  尾部添加(從右向左),操作同上。

llen key

  返回key對應list的長度,key不存在返回0,如果key對應類型不是list返回錯誤

lindex key index

  index元素在list列表中的下角標,從0開始;

  lindex  是從左到右取元素

lrange key start stop

  獲取指定區間的所有元素;

  下角標從0開始,0表示第一個元素,1表示第二個,依次類推;

  -1表示最后一個元素,-2表示倒數第二個元素,依次類推;

lpop key  

  移除並返回列表中的第一個元素

rpop key  

  移除並返回列表中的最后一個元素。

2.5.3 List類型應用場景

  (1)處理排名類業務。如新浪微博評論、論壇回帖樓層等。

  (2)聊天室

2.6 Hash類型(散列)

2.6.1 特點

wps4

  (1)由Field和與之關聯的value組成map鍵值對

  (2)field和value是字符串類型

  (3)一個hash中最多包含2^32-1鍵值對。

2.6.2 Hash相關命令

hset key field value

  設置hash field為指定值,如果key不存在,則先創建

  如果field已經存在,那么將更新這個field的值。

hget key field 

  獲取指定的hash field

hmget key filed1....fieldN

  獲取全部指定的hash filed

hmset key filed1 value1 ... filedN valueN

  同時設置hash的多個field

hexists key field

  測試指定field是否存在

hdel key field [field ...]

  刪除指定的hash field

hlen key

  返回指定hash的field數量

hkeys key

  返回hash的所有field

hvals key

  返回hash的所有value

hgetall key

  返回hash的所有filed和value

2.6.3 Hash的用途(能使用hash的時候盡量使用hash)

  節約內存空間

    redis每創建一個鍵,都會為這個鍵儲存一些附加的管理信息(比如這個鍵的類型,這個鍵最后一次被訪問的時間等等)

    redis的key相對於值來說,更珍貴!!!

    所以數據庫里面的鍵越多,redis數據庫服務器在儲存附加管理信息方面耗費的內存就越多,在獲取key對應的value值時cpu的開銷也會更多

    Hash結構可以將具有關聯關系的一組key-value,存儲到同一個hash結構中,從而減少key的數量。

wps5

2.6.4 hash不適用的場景

  如果我們僅僅只對一個字段設置過期,就不建議使用hash。

  Redis的key的過期功能只能對鍵操作,而Hash結構不能單獨對某一個filed設置過期功能。

  說明:在實際開發中,能使用hash的時候,盡量使用hash!!

2.7 Set類型(集合)

2.7.1 特點

wps6

  (1)無序的、去重的;

  (2)元素是字符串類型;

  (3)最多包含2^32-1元素。

2.7.2 Set相關命令

sadd key member [member ...](無序不重復)

  將一個或多個 member 元素加入到集合 key 當中,已經存在於集合的 member 元素將被忽略。

  假如 key 不存在,則創建一個只包含 member 元素作成員的集合。

  當 key 不是集合類型時,返回一個錯誤。

smembers key

  返回集合 key 中的所有成員。

  不存在的 key 被視為空集合。

spop key

  移除並返回集合中的一個隨機元素。

  被移除的隨機元素。

  當key不存在或key是空集時,返回nil。

scard key

  返回集合key的基數(集合中元素的數量)。

  集合的基數。

  當key不存在時,返回0。

  交集、並集、差集sinter sunion sdiff

sinter key [key ...]

  返回一個集合的全部成員,該集合是所有給定集合的交集。

  不存在的 key 被視為空集。

sunion key [key ...]

  返回一個集合的全部成員,該集合是所有給定集合的並集。

  不存在的 key 被視為空集。

sdiff key [key ...]

  返回一個集合的全部成員,該集合是所有給定集合之間的差集。

  不存在的 key 被視為空集。

2.7.3 應用場景

  (1)微博共同關注

    需求:當用戶訪問另一個用戶的時候,會顯示出兩個用戶共同關注哪些相同的用戶

    設計:將每個用戶關注的用戶放在集合中,求交集即可

    實現如下:

      peter={'john','jack','may'}

      ben={'john','jack','tom'}

      那么peter和ben的共同關注為:

      SINTER peter ben 結果為{'john','jack'}

2.8 SortedSet類型

2.8.1 特點

wps8

  (1)類似Set集合;

  (2)有序的、去重的;

  (3)元素是字符串類型;

  (4)每一個元素都關聯着一個浮點數分值(Score),並按照分值從小到大的順序排列集合中的元素。分值可以相同

  (5)最多包含2^32-1元素

help @sorted_set 查看sortedset的幫助文檔

zadd key  [score member score member] :增加值

  如: zadd set1 1 zhangsan 2 lisi

zcount key start end 統計一個范圍內元素的個數

  如: zcount set1 0 10

zcard key  :統計元素的個數

  如 : zcard set1

zrank key member:返回成員的索引號

  如: zrank set1 zhangsan

zrem  key [member member] 刪除成員

  如: zrem set1 zhangsan

zincrby key increment member 以increment作為步長增加member的score

  如: zincrby set1 zhangsan

zrange key start stop [WITHSCORES]  查找下標以start開始,stop結束的member(如果加上參數WITHSCORES,則連score一起顯示)

wps9

zrevrange key start stop [WITHSCORES] 反轉zrange的數據

wps10

zscore key member 獲得指定member的score

wps11

2.8.2 適用場景

適用於需要有序且唯一的業務或操作:

  (1)音樂排行榜

    分析:

      每首歌的歌名作為元素(唯一、不重復)

      每首歌的播放次數作為分值

      ZREVRANGE來獲取播放次數最多的歌曲(就是最多播放榜了,雲音樂熱歌榜,沒有競價,沒有權重)


免責聲明!

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



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