redis是用c語言開發的乙個基於記憶體的、高效能key-value鍵值對的、開源nosql資料庫。目前,redis的key是字串型別的,但value支援多種資料型別:字串(string)、雜湊(hash)、列表(list)、集合(set)、有序集合(sortedset),通過提供多種鍵值資料型別來適應不同場景下的儲存需求。
介紹幾種常見的應用:
構建佇列系統
可以用list可以構建佇列系統,使用sorted set甚至可以構建有優先順序的佇列系統
pub、sub發布訂閱構建實時訊息系統、訊息佇列
計數器應用
redis的命令如incr,decr都是原子性的,可以通過這些命令來構建計數器系統
分布式集群架構中session共享
基於記憶體儲存,資料訪問速度快,效能好
資料持久化機制
目前支援apf和rdb兩種持久化機制,下文會詳細闡述
支援集群模式,容量可以線性擴充套件
注意:redis3.x開始才支援集群模式
支援豐富的資料結構
這一點是相比其他快取工具如memcache比較鮮明的優勢
首先強調一點,redis的key是字串型別,但value支援多種資料型別。關於key的定義,有幾點建議:
1.key不要太長,太長不僅消耗記憶體還會降低查詢效率。建議不要超過1024個位元組
2.key不要太短,要具有可讀性
3.在實際專案中,key最好有乙個統一的命名規範
下面詳細介紹一下redis的value目前支援的資料型別:
string型別
字串是redis支援的最基礎的資料型別,它在redis中是二進位制安全的,應用最多。
操作redis的string型別資料常用命令:
set(設定)、get(獲取)、getset(獲取並設定)、del(刪除)
一次性插入或者獲取多條資料:
mget key1 key2
mset key1 value1 key2 value2 ……
在插入一條string型別資料的同時為它指定乙個存活期限:
setex username 10 張三
對string型別資料進行增減操作的幾個命令:
incr:將指定的key的value原子性的遞增1。如果該key不存在,其初始值為0,在incr之後其值為1
decr:將指定的key的value原子性的遞減1。如果該key不存在,其初始值為0,在decr之後其值為-1
incrby key increment:將指定的key的value原子性增加increment。如果該key不存在,其初始值為0,在incrby之後,該值為increment
decrby key decrement:將指定的key的value原子性減少decrement,如果該key不存在,其初始值為0,在decrby之後,該值為decrement。
注意:decr incr decrby incrby 都是原子性操作。進行增減前提是:key可以轉換為整型否則報錯。相信做過sparkstreaming流式計算統計pv、uv中,中間狀態儲存會熟悉該特性的應用。
list型別
筆者強調一點:redis中list底層是雙端鍊錶結構,這個在面試中經常會問。redis為什麼這麼快,其實不僅僅是因為基於記憶體儲存,底層還多了很多的優化,這只是其中之一,下圖是對雙端鍊錶的乙個圖形描述:
常用的操作命令:
lpush:從頭部(左邊)插入資料
rpush:從尾部(右邊)插入資料
lrange key start end:讀取list中指定範圍的values。start、end從0開始計數;也可為負數,若為-1則表示鍊錶尾部的元素,-2則表示倒數第二個,依次類推…
lpop:從頭部彈出乙個元素
rpop:從尾部彈出乙個元素
rpoplpush:從乙個list的尾部彈出乙個元素插入到另乙個list。原子性操作,沒有key2會建立key2,一旦key1的list元素被取完,key1會被清除
llen key:返回指定的key關聯的鍊錶中的元素的數量
list資料型別應用案例:訊息佇列
比如有這樣乙個需求:實現乙個任務排程系統==>生產者不斷產生任務,放入task-queue排隊,消費者不斷拿出任務來處理,同時放入乙個tmp-queue暫存,如果任務處理成功,則清除tmp-queue;否則,將任務彈回task-queue。
筆者這裡提供乙個實現思路,就不貼**了,其實就是上述api的簡單應用:
生產者將生產的任務lpush進task-queue中
消費者通過rpoplpush將taks-queue中取任務並暫存任務到tmp-queue中
如果任務處理成功,tmp-queue通過rpop清除相應任務;任務處理失敗,則rpoplpush將任務從tmp-queue中清除並存入task-queue中
為了避免消費者程式在處理任務失敗之後沒有及時將rpoplpush失敗的任務時就已經掛掉,可以加入乙個管理tmp-queque的角色,以便在這種情況時也能將處理失敗的任務lpush進task-queue中。
hash型別
redis中的hash型別可以看成具有map容器,適合儲存值物件的資訊。如username、password等。
常用命令:
hset key field value:為指定的key設定field/value對(鍵值對)
hmset key field value [field2 value2 …]:設定key中的多個filed/value
hincrby key field increment:設定key中filed的值增加increment
hexists key field:判斷指定的key中的filed是否存在
set型別
無序、無重複元素。和list型別相比,set型別在功能上還存在著乙個非常重要的特性,即在伺服器端完成多個set之間的聚合計算操作,如並集、交集、差集的計算。由於這些操作均在服務端完成,因此效率極高,而且也節省了大量的網路io開銷。
常用命令:
新增: sadd key values[value1、value2…] [多個value間空格分隔]
刪除:srem key members[member1、member2…] 刪除set中指定的成員(成員可以是多個)
查詢:smembers key 檢視指定key的set中的資料
判斷:sismember key value [判斷引數中指定的成員是否在該set中,1表示存在,0表示不存在或者該key本身就不存在。(無論集合中有多少元素都可以極速的返回結果)]
統計set元素個數:scard key [指定key對應的set的元素數]
srandmember key:隨機返回set中的乙個成員
sdiff、sunion、sinter:差集、並集、交集
sortedset型別
sortedset中的每乙個元素都會有乙個分數與之關聯,redis正是通過分數來為集合中的元素進行排序,預設正序。注意:sortedset中的資料不能重複,但分數卻可以重複。
常用命令:
zadd key score member score2 member2 … :將所有成員以及該成員的分數存放到sorted-set中。如果該元素已經存在則會用新的分數替換原有的分數。返回值是新加入到集合中的元素個數,不包含之前已經存在的元素。(score可以重複,member不可以重複)
zscore key member:返回指定成員的分數
zcard key:獲取集合中的成員數量
zrem key member[member…]:移除集合中指定的成員,可以指定多個成員
zrange key start end [withscores]:獲取集合中腳標為start-end的成員,[withscores]引數表明返回的成員包含其分數。(withscores可選引數)
zrevrange key start stop [withscores]:按照元素分數從大到小的順序返回索引從start到stop之間的所有元素(包含兩端的元素)
redis常見應用場景
redis應用場景總結redis平時我們用到的地方蠻多的,下面就了解的應用場景做個總結 1 熱點資料的快取由於redis訪問速度塊 支援的資料型別比較豐富,所以redis很適合用來儲存熱點資料,另外結合expire,我們可以設定過期時間然後再進行快取更新操作,這個功能最為常見,我們幾乎所有的專案都有...
Redis應用場景
redis開創了一種新的資料儲存思路,使用redis,我們不用在面對功能單調的資料庫時,把精力放在如何把大象放進冰箱這樣的問題上,而是利用redis靈活多變的資料結構和資料操作,為不同的大象構建不同的冰箱。redis常用資料型別 redis最為常用的資料型別主要有以下五種 在具體描述這幾種資料型別之...
Redis應用場景
redis開創了一種新的資料儲存思路,使用redis,我們不用在面對功能單調的資料庫時,把精力放在如何把大象放進冰箱這樣的問題上,而是利用redis靈活多變的資料結構和資料操作,為不同的大象構建不同的冰箱。redis常用資料型別 redis最為常用的資料型別主要有以下五種 在具體描述這幾種資料型別之...