天天看點

Redis支援的資料類型及其使用場景Redis 支援的資料類型使用場景

目錄

  • `Redis` 支援的資料類型
  • 使用場景
    • `String` 類型
    • `Hash` 類型
    • `List` 清單類型
    • `Set` 類型
    • `Zset` 類型

Redis

支援的資料類型

Redis

支援的五種資料類型

  • String

    :字元串類型
  • Hash

    :哈希,散清單類型
  • List

    :清單類型
  • Set

    :集合
  • Zset

    :有序集合

使用場景

String

類型

String

類型是

Redis

中最常見的資料類型,其使用場景如下

  • 緩存:簡單的

    key-value

    存儲,可以用于熱點資料的緩存、對象緩存、全頁緩存、可以提升熱點資料的通路資料
  • 位統計:線上使用者統計,文章通路量,記錄每個使用者的通路次數。方案:常用鍵名:

    pageview:userid

    ,如果一個使用者的

    id

    123

    ,那對應的

    Redis

    key

    就為

    pageview:123

    value

    就為使用者的通路次數,增加次數可以使用指令:

    incr

  • 計數器:文章的閱讀量、微網誌點贊數、允許一定的延遲,先寫入

    Redis

    再定時持久化同步到資料庫
set key 0
incr key 	// incr readcount::{文章id} 每閱讀一次
get key 	// get readcount::{文章id} 擷取閱讀量
           
  • 分布式全局唯一

    id

    :分布式全局唯一

    id

    的實作方式有很多,這裡隻介紹用

    redis

    實作
    Redis支援的資料類型及其使用場景Redis 支援的資料類型使用場景
    每次擷取

    userId

    的時候,對

    userId

    1

    再擷取,可以改進為如下形式
    Redis支援的資料類型及其使用場景Redis 支援的資料類型使用場景
    直接擷取一段

    userId

    的最大值,緩存到本地慢慢累加,快到了

    userId

    的最大值時,再去擷取一段,一個使用者服務當機了,也頂多一小段

    userId

    沒有用到
set userId 0
incr usrId // 傳回1
incrby userId 1000 // 傳回10001
           

Hash

類型

Redis

的散列可以讓使用者将多個鍵值對存儲到一個

Redis

的鍵裡面,散列非常适用于将一些相關的資料存儲在一起。類似

map

的一種結構,将結構化的資料,比如一個對象(前提是這個對象沒嵌套其他的對象)緩存到

redis

中,以後每次讀寫記憶體時,就可以操作

hash

裡的某個字段

  • 存儲使用者資訊、存儲對象
// 存儲使用者資訊,比如儲存name,age:
hset(user:1001,name,"zhangsan")
hset(user:1001,age,18)
hget(user:1001,name)  // 擷取
hset(user:1001,name,"張三")  // 修改
           
  • 存儲購物車相關資訊
key:使用者id
field:商品id
value:商品數量
           

List

清單類型

List

的應用場景非常多,也是

Redis

最重要的資料類型之一

  • 定時排行榜
  • 消息隊列
  • 排行榜、最新清單(評論清單、點贊清單)

示例,新浪

Twitter

使用者消息清單

// 假如使用者li關注了2個微網誌a和b

// a發了一條微網誌(編号為100)就執行如下指令:
lpush msg::li 100

// b發了一條微網誌(編号為200)就執行如下指令:
lpush msg::li 200

// 假如想拿最近的10條消息就可以執行如下指令(最新的消息一定在list的最左邊):
lrange msg::li 0 9 //下标從0開始,[start,stop]是閉區間,都包含
           

Set

類型

Redis

Set

String

類型的無序集合,和

List

不同的是,

Set

中不會出現重複的成員,集合最大的好處就是可以進行交集或差集的操作

  • 将每個人的好友存在

    Set

    中,可避免重複
  • 好友、關注、粉絲、感興趣的人等的集合
sismember key member //判斷 member 元素是否是集合 key 的成員 
smove source destination member //将 member 元素從 source 集合移動到 destination 集合
scard key  //擷取集合的成員數
           
  • 尋找兩個人的共同好友,使用

    sinter

    求交集

示例,實作點贊、簽到、打卡。假如微網誌

ID

t1001

,使用者

ID

u3001

。用

like:t1001

來維護

t1001

這條微網誌的所有點贊使用者

sadd like:t1001 u3001	// 點贊了這條微網誌
srem like:t1001 u3001	//取消點贊
sismember like:t1001 u3001	// 是否點贊
smembers like:t1001	// 點贊的所有使用者
scard like:t1001	// 點贊數
           

示例:實作關注模型,可能認識的人

  • seven關注的人:

    sevenSub -> {qing, mic, james}

  • 青山關注的人:

    qingSub->{seven,jack,mic,james}

  • Mic關注的人:

    MicSub->{seven,james,qing,jack,tom}

// 傳回sevenSub和qingSub的交集,即seven和青山的共同關注
sinter sevenSub qingSub -> {mic,james}

// 我關注的人也關注他,下面例子中我是seven
// qing在micSub中傳回1,否則傳回0
sismember micSub qing
sismember jamesSub qing

// 我可能認識的人,下面例子中我是seven
// 求qingSub和sevenSub的差集,并存在sevenMayKnow集合中
sdiffstore sevenMayKnow qingSub sevenSub -> {seven,jack}
           

Zset

類型

Redis

中的

Zset

Set

一樣,都是

String

類型的集合,也不允許有重複的成員,但不同的是

Zset

的每個元素都會有一個

double

類型的分數

score

與之關聯,而

Redis

也是通過這個分數來為這個集合排序的

  • 電商商品綜合排名
  • 按價格排名
  • 線上遊戲的積分排行榜、熱點新聞排行榜
// user1的使用者分數為 10
zadd ranking 10 user1
zadd ranking 20 user2
// 取分數最高的3個使用者
zrevrange ranking 0 2 withscores
           

繼續閱讀