天天看點

緩存中間件Redis

緩存中間件Redis

1 Redis介紹

Redis是一個開源的基于記憶體的資料結構存儲器。通常可作為資料庫,緩存和消息中介。它支援的資料結構有:字元串、哈希表、清單、集合、支援範圍查詢的有序集合、位圖、hyperloglogs和帶查詢半徑的地理空間索引。

Redis有内置的複制、Lua腳本、LRU緩存、事務和不同層級的磁盤持久化功能,還通過Redis Sentinel提供了高可用性,通過Redis叢集實作了自動化分割。

你可以在這些類型上使用原子操作,比如在尾部追加字元串,增加哈希表中的值,在清單中添加一個元素,計算集合的交集、并集和內插補點,或者得到有序集合中最高排位的成員。

Redis的資料集合放置在記憶體中。根據你的使用場景,你可以通過時常複制資料到硬碟或者将操作指令寫到日志裡來達到持久化的目的。當然,如果你僅僅需要一個性能豐富支援網絡的記憶體緩存,你可以選擇禁止持久化功能。

Redis還支援主從異步複制,并且配置起來很簡單,首次同步就能無阻塞的達到很快的速度,在網絡斷開的時候還可以部分再同步的自動重連。

2 資料結構及常用指令

String類型

String是Redis最基本的類型,你可以了解成與Memcached一模一樣的類型,一個key對應一個value。

String類型是二進制安全的。意味着Redis的string可以包含任何資料。比如jpg圖檔或者序列化的對象 。

String類型是Redis最基本的資料類型,一個Redis中字元串value最多可以是512M

get 查詢對應鍵值

set 添加鍵值對

append 将給定的 追加到原值的末尾

strlen 獲得值的長度

setnx 隻有在 key 不存在時設定 key 的值

incr 将 key 中儲存的數字值增1,隻能對數字值操作,如果為空,新增值為1

decr 将 key 中儲存的數字值減1,隻能對數字值操作,如果為空,新增值為-1

incrby / decrby <步長> 将 key 中儲存的數字值增減。自定義步長。

mset …同時設定一個或多個 key-value對

mget …同時擷取一個或多個 value

msetnx …同時設定一個或多個 key-value 對,當且僅當所有給定 key 都不存在。

getrange <起始位置> <結束位置>獲得值的範圍,類似java中的substring

setrange <起始位置>用 覆寫 所儲存的字元串值, 從<起始位置>開始。

setex <過期時間>設定鍵值的同時,設定過期時間,機關秒。

getset 以新換舊,設定了新值同時獲得舊值。

Redis五大資料類型–list

List 單鍵多值

Redis 清單是簡單的字元串清單,按照插入順序排序。你可以添加一個元素導清單的頭部(左邊)或者尾部(右邊)。它的底層實際是個雙向連結清單,對兩端的操作性能很高,通過索引下标的操作中間的節點性能會較差。

lpush/rpush …從左邊/右邊插入一個或多個值。

lpop/rpop從左邊/右邊吐出一個值。值在鍵在,值光鍵亡。

rpoplpush從清單右邊吐出一個值,插到清單左邊。

lrange按照索引下标獲得元素(從左到右)

lindex按照索引下标獲得元素(從左到右)

llen 獲得清單長度

linsert before在的後面插入 插入值

lrem 從左邊删除n個value(從左到右)

set

Redis set對外提供的功能與list類似是一個清單的功能,特殊之處在于set是可以自動排重的,當你需要存儲一個清單資料,又不希望出現重複資料時,set是一個很好的選擇,并且set提供了判斷某個成員是否在一個set集合内的重要接口,這個也是list所不能提供的。

Redis的Set是string類型的無序集合。它底層其實是一個value為null的hash表,是以添加,删除,查找的複雜度都是O(1)。

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

smembers取出該集合的所有值。

sismember判斷集合是否為含有該值,有傳回1,沒有傳回0

scard傳回該集合的元素個數。

srem …删除集合中的某個元素。

spop随機從該集合中吐出一個值。

srandmember随機從該集合中取出n個值。

不會從集合中删除

sinter傳回兩個集合的交集元素。

sunion傳回兩個集合的并集元素。

sdiff 傳回兩個集合的差集元素。

hash

Redis hash 是一個鍵值對集合。

Redis hash是一個string類型的field和value的映射表,hash特别适合用于存儲對象。

類似Java裡面的Map

hset給集合中的 鍵指派

hget從集合 取出 value

hmset …批量設定hash的值

hexists key檢視哈希表 key 中,給定域 field 是否存在。

hkeys列出該hash集合的所有field

hvals列出該hash集合的所有value

hincrby為哈希表 key 中的域 field 的值加上增量 increment

hsetnx将哈希表 key 中的域 field 的值設定為 value ,當且僅當域 field 不存在 .

zset (sorted set)

Redis有序集合zset與普通集合set非常相似,是一個沒有重複元素的字元串集合。不同之處是有序集合的每個成員都關聯了一個評分(score) ,這個評分(score)被用來按照從最低分到最高分的方式排序集合中的成員。集合的成員是唯一的,但是評分可以是重複了 。

因為元素是有序的, 是以你也可以很快的根據評分(score)或者次序(position)來擷取一個範圍的元素。通路有序集合的中間元素也是非常快的,是以你能夠使用有序集合作為一個沒有重複成員的智能清單。

zadd …将一個或多個 member 元素及其 score 值加入到有序集 key 當中。

zrange [WITHSCORES]

傳回有序集 key 中,下标在 之間的元素,帶WITHSCORES,可以讓分數一起和值傳回到結果集。

zrangebyscore key min max [withscores] [limit offset count]

傳回有序集 key 中,所有 score 值介于 min 和 max 之間(包括等于 min 或 max )的成員。有序內建員按 score 值遞增(從小到大)次序排列。

zrevrangebyscore key max min [withscores] [limit offset count]同上,改為從大到小排列。

zincrby為元素的score加上增量

zrem删除該集合下,指定值的元素

zcount統計該集合,分數區間内的元素個數

zrank傳回該值在集合中的排名,從0開始。

繼續閱讀