在微博微信場景下學習Redis數據結構

Redis安裝

下載地址:http://redis.io/download

安裝步驟:
一、yum install gcc
二、wget http://download.redis.io/releases/redis‐5.0.3.tar.gz
tar xzf redis‐5.0.3.tar.gz
cd redis‐5.0.3
三、make
四、src/redis‐server redis.conf(注意要使用後臺啓動,因此修改redis.conf裏的daemonize改成y
es)
五、ps ‐ef | grep redis
六、src/redis‐cli

Redis核心數據結構以及使用場景

String結構

  • 字符串經常使用操做
SET  key  value             //存入字符串鍵值對
MSET  key  value [key value ...]    //批量存儲字符串鍵值對
SETNX  key  value               //存入一個不存在的字符串鍵值對
GET  key                    //獲取一個字符串鍵值
MGET  key  [key ...]        //批量獲取字符串鍵值
DEL  key  [key ...]         //刪除一個鍵
EXPIRE  key  seconds        //設置一個鍵的過時時間(秒)
  • 原子加減
INCR  key           //將key中儲存的數字值加1
DECR  key           //將key中儲存的數字值減1
INCRBY  key  increment  //將key所儲存的值加上increment
DECRBY  key  decrement  //將key所儲存的值減去decrement
  • String應用場景

這個是微信公衆號的文章閱讀量數量的統計,能夠經過redis的string數據結構來解決。使用incr原子操做命令,redis的key是article:readcount:{文章id},當該文章被閱讀時,調用incr命令,閱讀數量加一,經過get該redis的key,實現文章閱讀數量統計的功能。前端

incr article:readcount:{文章id}
get article:readcount:{文章id}

Hash結構

  • Hash經常使用操做
HSET  key  field  value             //存儲一個哈希表key的鍵值
HSETNX  key  field  value       //存儲一個不存在的哈希表key的鍵值
HMSET  key  field  value [field value ...]  //在一個哈希表key中存儲多個鍵值對
HGET  key  field                //獲取哈希表key對應的field鍵值
HMGET  key  field  [field ...]      //批量獲取哈希表key中多個field鍵值
HDEL  key  field  [field ...]       //刪除哈希表key中的field鍵值
HLEN  key               //返回哈希表key中field的數量
HGETALL  key                //返回哈希表key中全部的鍵值
HINCRBY  key  field  increment      //爲哈希表key中field鍵的值加上增量increment
  • Hash使用場景

這個是京東購物車的截圖,能夠看到不少功能都用redis的命令可來實現。在redis中保存對商品id、購物車id等等id的操做,在前端保存對於該商品的描述,在操做購物車的時候,底層其實就是操做redis的命令。web

添加商品:hset cart:1001 1088 1
添加數量:hincrby cart:1001 1088 1
商品總數:hlen cart:1001
刪除商品:hdel cart:1001 1008
獲取購物車全部商品: hgetall cart:1001
  • Hash優缺點
    優勢:同類數據歸類整合存儲,方便數據管理,相比string操做消耗內存與cpu更小
    缺點:過時功能上不能使用在field上,只能使用在key上

List結構

  • List經常使用操做
LPUSH  key  value [value ...]       //將一個或多個值value插入到key列表的表頭(最左邊)
RPUSH  key  value [value ...]       //將一個或多個值value插入到key列表的表尾(最右邊)
LPOP  key           //移除並返回key列表的頭元素
RPOP  key           //移除並返回key列表的尾元素
LRANGE  key  start  stop        //返回列表key中指定區間內的元素,區間以偏移量start和stop指定

BLPOP  key  [key ...]  timeout  //從key列表表頭彈出一個元素,若列表中沒有元素,阻塞等待,timeout秒,若是timeout=0,一直阻塞等待
BRPOP  key  [key ...]  timeout  //從key列表表尾彈出一個元素,若列表中沒有元素,阻塞等待,timeout秒,若是timeout=0,一直阻塞等待
  • List的應用場景

這是咱們常常使用的新浪微博,咱們看在微博文章中如何使用redis的list數據結構。新浪微博是使用redis的大戶,據在新浪工做的朋友說,新浪使用redis的總容量超過500T,可想而知幾乎70%的功能都在redis中操做。redis

"小米手機"發微博,消息id爲1001,使用的redis命令是:數據庫

LPUSH msg:{小強-id} 1001

"號外長沙"發微博,消息id爲1002,使用的redis命令是:編程

LPUSH msg:{小強-id} 1002

小強查看最新10條的新浪微博消息:小程序

LRANGE msg:{小強-id} 0 10

Set結構

  • Set經常使用操做
SADD  key  member  [member ...]         //往集合key中存入元素,元素存在則忽略,若key不存在則新建
SREM  key  member  [member ...]         //從集合key中刪除元素
SMEMBERS  key                   //獲取集合key中全部元素
SCARD  key                  //獲取集合key的元素個數
SISMEMBER  key  member          //判斷member元素是否存在於集合key中
SRANDMEMBER  key  [count]           //從集合key中選出count個元素,元素不從key中刪除
SPOP  key  [count]              //從集合key中選出count個元素,元素從key中刪除
  • Set運算操做
SINTER  key  [key ...]              //交集運算
SINTERSTORE  destination  key  [key ..]     //將交集結果存入新集合destination中
SUNION  key  [key ..]               //並集運算
SUNIONSTORE  destination  key  [key ...]        //將並集結果存入新集合destination中
SDIFF  key  [key ...]               //差集運算
SDIFFSTORE  destination  key  [key ...]     //將差集結果存入新集合destination中
  • Set使用場景

使用這個抽獎界面做爲set的使用場景的例子,相信你們對這個界面都很熟悉,微信小程序的「抽獎」功能,這個是使用redis的set數據結構的典型場景。
當用戶點擊「參與抽獎」,也就是把將用戶ID加入集合中:後端

SADD key {userID}

查看參與抽獎的全部用戶:微信小程序

SMEMBERS key

抽取count名中獎用戶微信

SRANDMEMBER key [count]

Zset有序集合結構

  • ZSet經常使用操做
ZADD key score member [[score member]…] //往有序集合key中加入帶分值元素
ZREM key member [member …]      //從有序集合key中刪除元素
ZSCORE key member           //返回有序集合key中元素member的分值
ZINCRBY key increment member        //爲有序集合key中元素member的分值加上increment 
ZCARD key               //返回有序集合key中元素個數
ZRANGE key start stop [WITHSCORES]  //正序獲取有序集合key從start下標到stop下標的元素
ZREVRANGE key start stop [WITHSCORES]   //倒序獲取有序集合key從start下標到stop下標的元素
  • Zset使用場景

微博熱搜榜到處使用到了Redis的有序集合這個數據結構,咱們都知道有序集合是對集合的一個擴展,增長了score字段。經過score字段,咱們能夠選出最大或者最小的topN,這樣就有了排行榜,若是用傳統的數據庫去實現這個功能,估計對數據性能的消耗很是大。數據結構

1)點擊新聞
ZINCRBY  hotNews:20190819  1  烏鎮十二時辰
2)展現當日排行前十
ZREVRANGE  hotNews:20190819  0  10  WITHSCORES 
3)七日搜索榜單計算
ZUNIONSTORE  hotNews:20190813-20190819  7 
hotNews:20190813  hotNews:20190814... hotNews:20190819
4)展現七日排行前十
ZREVRANGE hotNews:20190813-20190819  0  10  WITHSCORES

還沒關注個人公衆號?

  • 掃文末二維碼關注公衆號【小強的進階之路】可領取以下:
  • 學習資料: 1T視頻教程:涵蓋Javaweb先後端教學視頻、機器學習/人工智能教學視頻、Linux系統教程視頻、雅思考試視頻教程;
  • 100多本書:包含C/C++、Java、Python三門編程語言的經典必看圖書、LeetCode題解大全;
  • 軟件工具:幾乎包括你在編程道路上的可能會用到的大部分軟件;
  • 項目源碼:20個JavaWeb項目源碼。
    小強的進階之路二維碼
相關文章
相關標籤/搜索