日日操夜夜添-日日操影院-日日草夜夜操-日日干干-精品一区二区三区波多野结衣-精品一区二区三区高清免费不卡

公告:魔扣目錄網為廣大站長提供免費收錄網站服務,提交前請做好本站友鏈:【 網站目錄:http://www.ylptlb.cn 】, 免友鏈快審服務(50元/站),

點擊這里在線咨詢客服
新站提交
  • 網站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會員:747

redis作為Nosql的代表,想必大家已經再熟悉不過了,除了作為緩存來使用,Redis還提供了其他很多有用的功能,例如可作為消息隊列、分布式鎖、不隆過濾器、限流等功能使用。今天先來說一說redis作為緩存使用,提供了5 種基礎數據結構,分別為:string (字符串)、list (列表)、set (集合)、hash (哈 希) 和 zset (有序集合)。

 

緩存神器Redis的五種數據類型及使用

 

一、string (字符串)

字符串 string 是 Redis 最簡單的數據結構。Redis 所有的數據結構都是以唯一的 key 字符串作為名稱,然后通過這個唯一key值來獲取相應的 value 數據。不同類型的數據結構的差異就在于value 的結構不一樣。字符串結構使用非常廣泛,一個常見的用途就是緩存用戶信息。我們將用戶信息結構體 使用 JSON 序列化成字符串,然后將序列化后的字符串塞進 Redis 來緩存。同樣,取用戶 信息會經過一次反序列化的過程。Redis 的字符串是動態字符串,是可以修改的字符串,內部結構實現上類似于 JAVA 的 ArrayList,采用預分配冗余空間的方式來減少內存的頻繁分配,字符串最大長度為 512M。使用命令如下:

設置鍵值對:set [key] [value]

獲取對應鍵的值:get [key]

批量操作鍵值對:mset [key] [value] [key] [value] [key] [value] ...

批量獲取對應鍵的值:mget [key] [key] [key]...

批量操作可以節省網絡耗時開銷。

緩存神器Redis的五種數據類型及使用

 

可以對 key 設置過期時間,到點自動刪除,這個功能常用來控制緩存的失效時間。在保證緩存是熱點數據或者保證緩存和數據庫一致性的解決方案時,設置失效時間是必不可少的。還有就是整數的自增或者自減功能,如果 value 值是一個整數,可以對它進行自增操作。自增是有范圍的,它的范圍是signed long 的最大最小值,超過了這個值,Redis 會報錯。

設置過期可以用set+expire的組合,但是保證不了原子性,如果想保證原子性,就用setex命令:

 

緩存神器Redis的五種數據類型及使用

 

關于自增和自減:

incr/decr:自增/自減 1

incrby/decrby [key] [num]:自增/自減 num

 

緩存神器Redis的五種數據類型及使用

 

二、list (列表)

Redis 的列表相當于 Java 語言里面的 LinkedList,注意它是鏈表而不是數組。鏈表由于有前后節點,特點是插入和刪除快,查詢慢;數組由于有索引,所以特點是查詢快,但是插入和刪除慢;這意味著 list 的插入和刪除操作非常快,時間復雜度為 O(1),但是索引定位很慢,時間復雜度為 O(n)。當列表彈出了最后一個元素之后,該數據結構自動被刪除,內存被回收。Redis 的列表結構常用來做異步隊列使用。將需要延后處理的任務結構體序列化成字符串塞進 Redis 的列表,另一個線程從這個列表中輪詢數據進行處理。

操作命令:

Lpush——先進后出,在列表頭部插入元素
Rpush——先進先出,在列表的尾部插入元素
Lrange——出棧,根據索引,獲取列表元素
Lpop——左邊出棧,獲取列表的第一個元素
Rpop——右邊出棧,獲取列表的最后一個元素
Lindex——根據索引,取出元素
Llen——鏈表長度,元素個數
Lrem——根據key,刪除n個value
Ltrim——根據索引,刪除指定元素
Lset——根據index,設置value
Linsert before——根據value,在之前插入值
Linsert after——根據value,在之后插入值
BLPOP/BRPOP key -- 移出并獲取列表的第一個元素, 如果列表沒有元素會阻塞列表直到等待超時或發現可彈出元素為止
BRPOPLPUSH source destination timeout -- 從列表中彈出一個值,將彈出的元素插入到另外一個列表中并返回它; 如果列表沒有元素會阻塞列表直到等待超時或發現可彈出元素為止。
LPUSHX -- 將一個值插入到已存在的列表頭部

 

緩存神器Redis的五種數據類型及使用

 

命令lindex 相當于 Java 鏈表的 get(int index)方法,它需要對鏈表進行遍歷,性能隨著參數 index 增大而變差。如果再深入一點,你會發現 Redis 底層存儲的還不是一個簡單的linkedlist, 而是稱之為快速鏈表 quicklist 的一個結構。首先在列表元素較少的情況下會使用一塊連續的內存存儲,這個結構是 ziplist,也即是壓縮列表。它將所有的元素緊挨著一起存儲,分配的是一塊連續的內存。當數據量比較多的時候才會改成 quicklist。因為普通的鏈表需要的附加指針空間太大,會比較浪費空間,而且會加重內存的碎片化。快速列表既滿足了快速的插入刪除性能,又不會出現太大的空間冗余。

三、hash (字典)

Redis 的字典相當于 Java 語言里面的 HashMap,它是無序字典。內部實現結構上同 Java 的 HashMap 也是一致的,同樣的數組 + 鏈表二維結構。第一維 hash 的數組位置碰撞時,就會將碰撞的元素使用鏈表串接起來。所以特點也是和Java中Map結構相似。不同的是,Redis 的字典的值只能是字符串,另外它們 rehash 的方式不一樣,因為 Java 的 HashMap 在字典很大時,rehash 是個耗時的操作,需要一次性全部 rehash。Redis 為了高性能,不能堵塞服務,所以采用了漸進式 rehash 策略。漸進式 rehash 會在 rehash 的同時,保留新舊兩個 hash 結構,查詢時會同時查詢兩個 hash 結構,然后在后續的定時任務中以及 hash 的子指令中,循序漸進地將舊 hash 的內容 一點點遷移到新的 hash 結構中。當 hash 移除了最后一個元素之后,該數據結構自動被刪除,內存被回收。

操作命令:

HSET key field value -- 將哈希表 key 中的字段 field 的值設為 value 
HSETNX key field value -- 只有在字段 field 不存在時,設置哈希表字段的值。
HVALS key -- 獲取哈希表中所有值
HSCAN key cursor [MATCH pattern] [COUNT count] -- 迭代哈希表中的鍵值對。
HMSET key field1 value1 [field2 value2 ] -- 同時將多個 field-value (域-值)對設置到哈希表 key 中。
HMGET key field1 [field2] -- 獲取所有給定字段的值
HLEN key -- 獲取哈希表中字段的數量
HKEYS key -- 獲取所有哈希表中的字段
HINCRBYFLOAT key field increment -- 為哈希表 key 中的指定字段的浮點數值加上增量 increment 
HINCRBY key field increment -- 為哈希表 key 中的指定字段的整數值加上增量 increment 
HGETALL key -- 獲取在哈希表中指定 key 的所有字段和值
HGET key field -- 獲取存儲在哈希表中指定字段的值
HEXISTS key field -- 查看哈希表 key 中,指定的字段是否存在
HDEL key field1 [field2] -- 刪除一個或多個哈希表字段

 

緩存神器Redis的五種數據類型及使用

 

四、set (集合)

Redis 的集合相當于 Java 語言里面的 HashSet,它內部的鍵值對是無序的唯一的。它的內部實現相當于一個特殊的字典,字典中所有的 value 都是一個值 NULL,Java中的HashSet也是基于一個value為null的HashMap。當集合中最后一個元素移除之后,數據結構自動刪除,內存被回收。 set 結構可以用來做有去重需求需要實現的功能,可以保證唯一性。

操作命令:

SADD key member1 [member2] -- 向集合添加一個或多個成員
SCARD key -- 獲取集合的成員數
SDIFF key1 [key2] -- 返回給定所有集合的差集
SDIFFSTORE destination key1 [key2] -- 返回給定所有集合的差集并存儲在 destination 中
SINTER key1 [key2] -- 返回給定所有集合的交集
SINTERSTORE destination key1 [key2] -- 返回給定所有集合的交集并存儲在 destination 中
SISMEMBER key member -- 判斷 member 元素是否是集合 key 的成員
SMEMBERS key -- 返回集合中的所有成員
SMOVE source destination member -- 將 member 元素從 source 集合移動到 destination 集合
SPOP key -- 移除并返回集合中的一個隨機元素
SRANDMEMBER key [count] -- 返回集合中一個或多個隨機數
SREM key member1 [member2] -- 移除集合中一個或多個成員
SUNION key1 [key2] -- 返回所有給定集合的并集
SUNIONSTORE destination key1 [key2] -- 所有給定集合的并集存儲在 destination 集合中
SSCAN key cursor [MATCH pattern] [COUNT count] -- 迭代集合中的元素

 

緩存神器Redis的五種數據類型及使用

 

spop命令是隨機移除一個value,這一操作,剛好是baidu從bat中給移除去了,冥冥之中自有天意呀!不過baidu的技術還是最牛逼的!

五、zset (有序列表)

zset 是 Redis 提供的最為特色的數據結構,它類似于 Java 的 SortedSet 和 HashMap 的結合體,一方面它是一個 set,保證了內部 value 的唯一性,另一方面它可以給每個 value 賦予一個 score,代表這個 value 的排序權重。它的內部實現用的是一種叫著“跳躍列表”的數據結構。當zset 中最后一個 value 被移除后,數據結構自動刪除,內存被回收。

操作命令:

ZADD key score1 member1 [score2 member2] -- 向有序集合添加一個或多個成員,或者更新已存在成員的分數
ZCARD key -- 獲取有序集合的成員數
ZCOUNT key min max -- 計算在有序集合中指定區間分數的成員數
ZINCRBY key increment member -- 有序集合中對指定成員的分數加上增量 increment
ZINTERSTORE destination numkeys key [key ...] -- 計算給定的一個或多個有序集的交集并將結果集存儲在新的有序集合 key 中
ZLEXCOUNT key min max -- 在有序集合中計算指定字典區間內成員數量
ZRANGE key start stop [WITHSCORES] -- 通過索引區間返回有序集合指定區間內的成員
ZRANGEBYLEX key min max [LIMIT offset count] -- 通過字典區間返回有序集合的成員
ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT] -- 通過分數返回有序集合指定區間內的成員
ZRANK key member -- 返回有序集合中指定成員的索引
ZREM key member [member ...] -- 移除有序集合中的一個或多個成員
ZREMRANGEBYLEX key min max -- 移除有序集合中給定的字典區間的所有成員
ZREMRANGEBYRANK key start stop -- 移除有序集合中給定的排名區間的所有成員
ZREMRANGEBYSCORE key min max -- 移除有序集合中給定的分數區間的所有成員
ZREVRANGE key start stop [WITHSCORES] -- 返回有序集中指定區間內的成員,通過索引,分數從高到低
ZREVRANGEBYSCORE key max min [WITHSCORES] -- 返回有序集中指定分數區間內的成員,分數從高到低排序
ZREVRANK key member -- 返回有序集合中指定成員的排名,有序集成員按分數值遞減(從大到小)排序
ZSCORE key member -- 返回有序集中,成員的分數值
ZUNIONSTORE destination numkeys key [key ...] -- 計算給定的一個或多個有序集的并集,并存儲在新的 key 中
ZSCAN key cursor [MATCH pattern] [COUNT count] -- 迭代有序集合中的元素(包括元素成員和元素分值)

 

緩存神器Redis的五種數據類型及使用

 

zset 內部的排序功能是通過"跳躍列表"數據結構來實現的,它的結構非常特殊,也比較復雜。因為 zset 要支持隨機的插入和刪除,所以它不好使用數組來實現。

分享到:
標簽:Redis
用戶無頭像

網友整理

注冊時間:

網站:5 個   小程序:0 個  文章:12 篇

  • 51998

    網站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會員

趕快注冊賬號,推廣您的網站吧!
最新入駐小程序

數獨大挑戰2018-06-03

數獨一種數學游戲,玩家需要根據9

答題星2018-06-03

您可以通過答題星輕松地創建試卷

全階人生考試2018-06-03

各種考試題,題庫,初中,高中,大學四六

運動步數有氧達人2018-06-03

記錄運動步數,積累氧氣值。還可偷

每日養生app2018-06-03

每日養生,天天健康

體育訓練成績評定2018-06-03

通用課目體育訓練成績評定