Redis特性 應用場景和常見的資料結構

2021-10-09 07:32:32 字數 4292 閱讀 4087

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最為常用的資料型別主要有以下五種 在具體描述這幾種資料型別之...