Redis常見數據結構和使用場景

1、Redis 主要數據結構

1. String——字符串

String 數據結構是簡單的 key-value 類型,value 不只能夠是 String,也能夠是數字(當數字類型用 Long 能夠表示的時候encoding 就是整型,其餘都存儲在 sdshdr 當作字符串)。使用 Strings 類型,能夠徹底實現目前 Memcached 的功能,而且效率更高。還能夠享受 Redis 的定時持久化(能夠選擇 RDB 模式或者 AOF 模式),操做日誌及 Replication 等功能。除了提供與 Memcached 同樣的 get、set、incr、decr 等操做外,Redis 還提供了下面一些操做:html

1.LEN niushuai:O(1)獲取字符串長度
2.APPEND niushuai redis:往字符串 append 內容,並且採用智能分配內存(每次2倍)
3.設置和獲取字符串的某一段內容
4.設置及獲取字符串的某一位(bit)
5.批量設置一系列字符串的內容
6.原子計數器
7.GET SET 命令的妙用,請於清空舊值的同時設置一個新值,配合原子計數器使用
mysql

 

2. Hash——字典

在 Memcached 中,咱們常常將一些結構化的信息打包成 hashmap,在客戶端序列化後存儲爲一個字符串的值(通常是 JSON 格式),好比用戶的暱稱、年齡、性別、積分等。這時候在須要修改其中某一項時,一般須要將字符串(JSON)取出來,而後進行反序列化,修改某一項的值,再序列化成字符串(JSON)存儲回去。簡單修改一個屬性就幹這麼多事情,消耗一定是很大的,也不適用於一些可能併發操做的場合(好比兩個併發的操做都須要修改積分)。而 Redis 的 Hash 結構可使你像在數據庫中 Update 一個屬性同樣只修改某一項屬性值。
存儲、讀取、修改用戶屬性redis

hash操做指令算法

[sql

hset key field value 設置hash field爲指定值,若是key不存在,則先建立mongodb

hget key field 獲取指定的hash field數據庫

hmget key filed1....fieldN 獲取所有指定的hash filedbash

hmset key filed1 value1 ... filedN valueN 同時設置hash的多個field服務器

hincrby key field integer 將指定的hash filed 加上給定值數據結構

hexists key field 測試指定field是否存在

hdel key field 刪除指定的hash field

hlen key 返回指定hash的field數量

hkeys key 返回hash的全部field

hvals key 返回hash的全部value

hgetall key 返回hash的全部filed和value

]

3. List——列表

List 說白了就是鏈表(redis 使用雙端鏈表實現的 List),相信學過數據結構知識的人都應該能理解其結構。使用 List 結構,咱們能夠輕鬆地實現最新消息排行等功能(好比新浪微博的 TimeLine )。List 的另外一個應用就是消息隊列,能夠利用 List 的 *PUSH 操做,將任務存在 List 中,而後工做線程再用 POP 操做將任務取出進行執行。Redis 還提供了操做 List 中某一段元素的 API,你能夠直接查詢,刪除 List 中某一段的元素。
1.微博 TimeLine
2.消息隊列

 

4. Set——集合

Set 就是一個集合,集合的概念就是一堆不重複值的組合。利用 Redis 提供的 Set 數據結構,能夠存儲一些集合性的數據。好比在微博應用中,能夠將一個用戶全部的關注人存在一個集合中,將其全部粉絲存在一個集合。由於 Redis 很是人性化的爲集合提供了求交集並集差集等操做,那麼就能夠很是方便的實現如共同關注、共同喜愛、二度好友等功能,對上面的全部集合操做,你還可使用不一樣的命令選擇將結果返回給客戶端仍是存集到一個新的集合中。

求交集:sinter key  [key...]

求並集:sunion key [key...]

求差集:sdiff key [key ...] 得出key中其餘key不存在數據。

1.共同好友、二度好友(求交集)
2.利用惟一性,能夠統計訪問網站的全部獨立 IP(去重)
3.好友推薦的時候,根據 tag 求交集,大於某個 threshold 就能夠推薦(求交集)

 

5. Sorted Set——有序集合

和Sets相比,Sorted Sets是將 Set 中的元素增長了一個權重參數 score,使得集合中的元素可以按 score 進行有序排列,好比一個存儲全班同窗成績的 Sorted Sets,其集合 value 能夠是同窗的學號,而 score 就能夠是其考試得分,這樣在數據插入集合的時候,就已經進行了自然的排序。另外還能夠用 Sorted Sets 來作帶權重的隊列,好比普通消息的 score 爲1,重要消息的 score 爲2,而後工做線程能夠選擇按 score 的倒序來獲取工做任務。讓重要的任務優先執行。

1.帶有權重的元素,好比一個遊戲的用戶得分排行榜
2.比較複雜的數據結構,通常用到的場景不算太多

    zscore key member     獲取member的分值

    zrank key  member 獲取member的排名

    zrange key start end    獲取score範圍在start到end之間的member 

 

6. HyperLogLog——作基數統計

Redis 在 2.8.9 版本添加了 HyperLogLog 結構。

     HyperLogLog這個數據結構用於基數統計。

     Redis HyperLogLog 是用來作基數統計的算法,HyperLogLog 的優勢是,在輸入元素的數量或者體積很是很是大時,計算基數所需的空間老是固定 的、而且是很小的

     在 Redis 裏面,每一個 HyperLogLog 鍵只須要花費 12 KB 內存,就能夠計算接近 2^64 個不一樣元素的基 數。這和計算基數時,元素越多耗費內存就越多的集合造成鮮明對比。

    可是,由於 HyperLogLog 只會根據輸入元素來計算基數,而不會儲存輸入元素自己,因此 HyperLogLog 不能像集合那樣,返回輸入的各個元素。

     主要功能:用於統計不一樣值元素的個數,好比統計一天中有多少個用戶(IP)訪問服務器,只須要統計有多少個不一樣的IP 的個數就能夠

 什麼是基數

   好比數據集 {1, 3, 5, 7, 5, 7, 8}, 那麼這個數據集的基數集爲 {1, 3, 5 ,7, 8}, 基數(不重複元素個數)爲5。 基數估計就是在偏差可接受的範圍內,快速計算基數。

   下表列出了 redis HyperLogLog 的基本命令:

序號 命令及描述
1 PFADD key element [element ...] 
添加指定元素到 HyperLogLog 中。
2 PFCOUNT key [key ...] 
返回給定 HyperLogLog 的基數估算值。
3 PFMERGE destkey sourcekey [sourcekey ...] 
將多個 HyperLogLog 合併爲一個 HyperLogLog
redis 127.0.0.1:6379> PFADD mykey "redis"  
1) (integer) 1  
redis 127.0.0.1:6379> PFADD mykey "mongodb"  
1) (integer) 1  
redis 127.0.0.1:6379> PFADD mykey "mysql"  
1) (integer) 1  
redis 127.0.0.1:6379> PFCOUNT mykey  
(integer) 3

 

7.其餘數據結構

    bitmaps  位圖

    地理空間(geospatial) 索引半徑查詢

    詳細文檔能夠查看http://www.redis.cn/

 

2、redis 其餘功能使用場景

1. 訂閱-發佈系統

Pub/Sub 從字面上理解就是發佈(Publish)與訂閱(Subscribe),在 Redis 中,你能夠設定對某一個 key 值進行消息發佈及消息訂閱,當一個 key 值上進行了消息發佈後,全部訂閱它的客戶端都會收到相應的消息。這一功能最明顯的用法就是用做實時消息系統,好比普通的即時聊天,羣聊等功能。

2. 事務——Transactions

誰說 NoSQL 都不支持事務,雖然 Redis 的 Transactions 提供的並非嚴格的 ACID 的事務(好比一串用 EXEC 提交執行的命令,在執行中服務器宕機,那麼會有一部分命令執行了,剩下的沒執行),可是這個 Transactions 仍是提供了基本的命令打包執行的功能(在服務器不出問題的狀況下,能夠保證一連串的命令是順序在一塊兒執行的,中間有會有其它客戶端命令插進來執行)。Redis 還提供了一個 Watch 功能,你能夠對一個 key 進行 Watch,而後再執行 Transactions,在這過程當中,若是這個 Watched 的值進行了修改,那麼這個 Transactions 會發現並拒絕執行。

相關文章
相關標籤/搜索