最近與同學聊天過程時,兩人聊到了redis,很詫異於該同學對redis方面知識的匱乏,便對redis做乙個簡略的總結
資料庫我們都知道,也都非常熟悉mysql資料庫的使用,於是會想當然的認為資料庫都是同源的,在這種想法下,會對redis不以為然,這樣,在工作時,將會對其手足無措,由於在工作中的需要,我們需要對redis有一定的了解
既然已經有了形形色色的資料庫,那為什麼還要用到redis呢
redis主要有以下幾個脫穎的地方:
速度快資料直接儲存在記憶體中,讀寫都有著特別高的效能
原子性redis的所有操作都是原子性的,同時redis還支援對幾個操作全並後的原子性執行
豐富的資料型別
支援string,list,set,sorted set,hash
其他豐富的特性
可用於快取,訊息,按key設定過期時間,過期後將會自動刪除
redis有如此多的優點,我們能用其來做什麼呢
會話快取(session cache)
最常用的一種使用redis的情景是會話快取(session cache)。用redis快取會話比其他儲存的優勢在於:redis提供持久化。
全頁快取(fpc)
除基本的會話之外,redis還提供很簡便的fpc平台。回到一致性問題,即使重啟了redis例項,因為有磁碟的持久化,使用者也不會看到頁面載入速度的下降,這是乙個極大改進。
佇列reids在記憶體儲存引擎領域的一大優點是提供 list 和 set 操作,這使得redis能作為乙個很好的訊息佇列平台來使用。redis作為佇列使用的操作,就類似於本地程式語言對 list 的 push/pop 操作。
排行榜/計數器
redis在記憶體中對數字進行遞增或遞減的操作實現的非常好。集合(set)和有序集合(sorted set)也使得我們在執行這些操作的時候變的非常簡單,redis只是正好提供了這兩種資料結構。
發布/訂閱
最後是redis的發布/訂閱功能。發布/訂閱的使用場景確實非常多。我已看見人們在社交網路連線中使用,還可作為基於發布/訂閱的指令碼觸發器,甚至用redis的發布/訂閱功能來建立聊天系統!
當然,僅僅知道redis是什麼是遠遠不夠的,我們也必須知道redis怎麼使用
首先,redis有5種資料型別:
list:是乙個集合,可以在頭部或者尾部運算元據
hash(map):採用鍵值對儲存
set:無序不可重複的集合
sortedset:使用score來排序的集合
hyperloglog:redis2.8.9版本之後才有,用來做基數統計的演算法
string型別
最為基礎的資料儲存型別。在redis中字串型別的value最多可以容納的資料長度是512m。
struct sdshdr
;
c語言對字串的儲存是使用字元陣列,遇到』\0』字元則認為字串結束,
redis的字串可以儲存任何型別的資料,因為任何型別資料都可以表示成二進位制,sds結構中的char buf就是儲存了二進位制資料。
redis的字串是二進位制安全的,什麼是二進位制安全?簡單理解就是存入什麼資料取出的還是什麼資料。
redis中的sds不像c語言處理字串那樣遇到』\0』字元則認證字串結束,
它不會對儲存進去的二進位制資料進行處理,存入什麼資料取出還是什麼資料。
常用的命令命令
含義使用示例
set賦值語句
set k v
get獲取值
get k
追加字串
decr
自減值decr k
incr
自增值incr k
list型別
list型別是按照插入順序排序的字串鍊錶。可以在鍊錶的兩頭插入或刪除元素,list中可以包含的最大元素數量是4294967295。
列表型別(list)可以儲存乙個有序的字串列表,常用的操作是向列表兩端新增元素,或者獲得列表的某乙個片段。
列表型別內部是使用雙向鍊錶實現的,所以向列表兩端新增元素的時間複雜度為0(1),獲取越接近兩端的元素速度就越快。
這意味著即使是乙個有幾千萬個元素的列表,獲取頭部或尾部的10條記錄也是極快的。
常用的命令命令
含義使用示例
lpush
左側插入
lpush k v1 v2 v3……
rpush
右側插入
rpush k v1 v2 v3……
lpop
左側彈出
lpop k
rpop
右側彈出
rpop k
llen
鍊錶長度
llen k
hash型別
hash叫雜湊型別,它提供了字段和字段值的對映。
字段值只能是字串型別,不支援雜湊型別、集合型別等其它型別。如下:
hash型別可以看成具有stringkey和strin**alue的map容器。非常適合於儲存值物件的資訊。如username、password和age等。
常用的命令命令
含義使用示例
hset
給k中某欄位賦值
hset k f v
hget
獲取k中某字段的值
gset k f
set型別
集合型別的常用操作是向集合中加入或刪除元素、判斷某個元素是否存在等,
由於集合型別的redis內部是使用值為空的雜湊表實現,所有這些操作的時間複雜度都為0(1)
set型別看作為沒有排序的字元集合,set集合中不允許出現重複的元素
常用的命令命令
含義使用示例
sadd
增加元素
sadd k member1 member2……
srem
刪除元素
srem k member1 member2……
smembers
遍歷元素
smembers k
sortedset(zset)
在集合型別的基礎上有序集合型別為集合中的每個元素都關聯乙個分數,
這使得我們不僅可以完成插入、刪除和判斷元素是否存在在集合中,
還能夠獲得分數最高或最低的前n個元素、獲取指定分數範圍內的元素等與分數有關的操作。
在某些方面有序集合和列表型別有些相似。
1、二者都是有序的。
2、二者都可以獲得某一範圍的元素。
但是,二者有著很大區別:
1、列表型別是通過鍊錶實現的,獲取靠近兩端的資料速度極快,而當元素增多後,訪問中間資料的速度會變慢。
2、有序集合型別使用雜湊表實現,所有即使讀取位於中間部分的資料也很快。
3、列表中不能簡單的調整某個元素的位置,但是有序集合可以(通過更改分數實現)
4、有序集合要比列表型別更耗記憶體
常用命令命令
含義使用示例
zadd
增加元素(附帶分數)
zadd k s1 m1 s2 m2 ……
zcount
獲取值在分數段間的成員數
zcount k min max
zrange
獲取某分數段間的成員(公升序)
zrange k start stop [withscores]
zrem
刪除元素
zrem k m1 m2 ……
hyperloglog
hyperloglog是一種使用隨機演算法進行基數估計的結構
能高效率的計算基數的估計值(空間複雜度一定)
需要注意的是,hyperloglog並不會儲存元素,只是儲存元素的基數
常用命令命令
含義使用示例
pfadd
增加元素
pfadd k m1 m2 ……
pfcount
返回基數估算值k1 k2 k3……
資料庫的另一種設計方法
最近參與了乙個專案的開發,在開發的過程中發現資料庫的設計有點意思,順便拿來給大家分享一下。對於乙個專案來說,資料庫無疑是很重要,如果資料庫設計不好,專案就很難開發的優秀,所以乙個資料庫的設計就顯得尤其重要。在我這個專案中,有乙個訂單表 orderform 乙個商品資訊表 googsinfo 乙個系統...
另一種尊重
上中學的時候,有一節課印象非常深刻。老師問我們如果無意闖入乙個房間,發現房間裡有一位女士正在洗澡,這時應該怎麼辦?有同學回答就當什麼也沒看見,退出房間。還有同學回答 說聲對不起!女士。然後退出去。老師笑了笑說,還有更好的答案,那就是 對不起,先生!有一對結婚多年的夫妻,有一次出差在外的妻子有一件急事...
另一種勝利
另一種勝利 written by allen lee 剛才我的扣殺,出界了5.3厘公尺。雖然很可惜,但還是出界了,請確認下吧。幹 真是的,那些任性的傢伙!但是,到最後還只顧自己網球原則的正直笨蛋,和一定要用迴旋蛇標打中單人區的笨蛋,給我們看了場好比賽啊。龍崎 海棠和幹他們雖然輸了這場比賽,但他們堅持...