說Redis

一:簡單介紹

  • Redis(Remote Dictionary Server 遠程字典服務器)
  • key-value
  • 內存數據庫
  • key是一個string
  • value可以是string,list,hash,set,zset,bitmaps等等
  • 幾乎所有的互聯網公司都會使用,新浪微博是全球最大的Redis使用者

二:特性

  • C語言實現,單線程Epoll模型,無鎖的爭用,速度快
  • 客戶端語言衆多,非常容易上手使用
  • RDB和AOF兩種持久化方式將數據和命令從內存保存到硬盤
  • 分佈式,因爲現代處理器大多爲多核,一般的模型是每個核上跑一個Redis實例,然後組成Redis集羣,此時可以提供TB級別的單實例。

三:說一個使用場景

舉一個很火的鬥魚直播間的例子,進入鬥魚,映入眼簾的是某遊戲的直播,如圖:

這裏寫圖片描述

重點是我用紅色圈出來的 貢獻周榜,應該就是觀看直播的人送出禮品的價值排序,假設讓我設計這樣一個系統,貢獻周榜這個模塊後端的數據庫表最簡單版本我會這樣設計:

這裏寫圖片描述

很明顯,一號主播最近比較火,在禮物排行表中前五條都是他的,現在需要生成1號主播的貢獻周榜,即用戶和貢獻值兩列數據,我們用SQL從數據庫中讀取信息並排序:

SELECT 用戶ID,送出的價值 FROM 禮物排行表 WHERE 主播ID=1 ORDER BY 送出的價值;

這裏寫圖片描述

拿出這樣的表,然後去做顯示就好了,同樣的功能用Redis如何實現呢?看下面的圖:

這裏寫圖片描述

整個數據庫是key-value,key對應的是主播ID(唯一),value對應的是一個ZSet(有序集合),value的score域對應用戶的貢獻值,member域對應用戶名,如下,我們按照用戶進入房間的順序插入用戶以及貢獻值:

這裏寫圖片描述

因爲是有序集合,直接遍歷顯示就是我們要的結果。

下面再考慮這樣的場景:一號主播近日人氣連續爆棚,觀看他直播的人數也很多,大家不停的送禮物,他不停的”感謝老鐵送我的飛機、大炮、遊艇”,哈哈,伴隨而來的就是排行榜的不斷更新,假設user1後來居上,將自己的貢獻提升至兩百,如果你直接將數據更新至MySQL:

UPDATE 禮物排行表 SET 送出的價值=200 WHERE 用戶ID=1;

//之後再次拿出數據去更新前端頁面
SELECT 用戶ID,送出的價值 FROM 禮物排行表 WHERE 主播ID=1 ORDER BY 送出的價值;

在大量併發的情況下,你這樣做肯定是滿足不了實時更新的,畢竟MySQL是寫磁盤。這時候你會說:誰這樣用,肯定加緩存啊!!沒毛病,那麼Redis就是最好的選擇(微笑臉),下面看看用Redis怎麼玩:

這裏寫圖片描述

沒錯,我們直接更新user1的貢獻值,zset自動完成排序,然後再次遍歷,user1就已經成爲第一名了。內存操作是非常的快滴。

回過頭來想想:這個例子中我們有必要使用MySQL嗎?

答案:沒有必要,直接用Redis完成它就好了,即使是持久化,Redis也支持。之所以可以這樣,是因爲這個場景下數據量小,並且要求延時小,正符合Redis的特性。

四:一些適合使用Redis的場景

  • 緩存系統:例如上面的例子,MySQL作爲後臺持久化使用,Redis做緩存。
  • 排行榜:例如新浪微博的熱搜,視頻按照發布時間排序等等,Redis提供了有序集合和列表,可以很容易實現這些功能,上面的例子也是這樣。
  • 計數器:某頁面的瀏覽次數,視頻的播放次數,incr就好了,因爲單線程,即使很高的併發,也不會出現數據出錯的問題,畢竟請求要一個一個處理,但是純內存操作又非常快。http://www.tuicool.com/articles/f2auiau
  • 社交網絡:例如共同好友,如果是關係型數據庫,假設求A和B的共同好友,需要先求出A的所有好友,然後求出B的所有好友,然後join,然後distinct。但是Redis支持交集操作(sinter),直接交集就好了。
redis> SMEMBERS group_1
1) "LI LEI"
2) "TOM"
3) "JACK"

redis> SMEMBERS group_2
1) "HAN MEIMEI"
2) "JACK"

redis> SINTER group_1 group_2
1) "JACK"

五、使用Jedis連接Redis

1:什麼是 Jedis

Jedis是 Redis 的Java客戶端,就是用來連接Redis數據庫完成數據存取操作的,Redis有各種語言的客戶端,詳見:https://redis.io/clients,如果你簡單瞭解java語言和 Redis的命令,那你很快就會使用它。

2:操作一波

  • 首先安裝Redis

http://www.runoob.com/redis/redis-install.html

如果你想試試docker,來這裏:
http://www.tuicool.com/articles/YJbyMr

  • 建立一個Java項目,下面是maven配置
<dependency>
    <groupId>redis.clients</groupId>
    <artifactId>jedis</artifactId>
    <version>2.9.0</version>
</dependency>
  • 程序如下
Jedis jedis = new Jedis("serverip","serverport");

jedis.set("key1","value1");
System.out.println(jedis.get("key1"));

jedis.close();
  • 運行程序輸出結果

這裏寫圖片描述

更多使用方式見(必須得看): http://www.blogways.net/blog/2013/06/02/jedis-demo.html

六:一些學習Redis的資料

《Redis設計與實現》瞭解底層的數據結構【推薦】:http://redisbook.com/
命令學習:http://www.redis.cn/commands.html
Redis的使用場景:http://blog.csdn.net/hguisu/article/details/8836819
Redis源碼註釋:
https://github.com/huangz1990/redis-3.0-annotated?utm_source=tuicool&utm_medium=referral
淺析Redis網絡庫:http://blog.csdn.net/yangbodong22011/article/details/65444273

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章