新浪計數業務之Redis

           

      今天聽一個同事說新浪使用的是Redis,因而本身將研究的過程整理出來以備後用。mysql

咱們都知道微博這玩意兒如今很火,新浪做爲國內最先使用redis,而且是國內最大的redis使用者,固然備受人們關注。新浪微博中一項很重要數據,計數類業務就用到了RedisOK,廢話很少說,直接切入主題。redis

   Redis是什麼?sql

   解析:一種內存型數據庫,雖然其擁有了持久化機制。mongodb

   Redis配置過程數據庫

      首先聲明,今天咱們探討的配置是在windows系統下windows

     步驟一:下載redis文件包緩存

     下載的windows版本是redis-2.0.2,解壓到D盤下,在redis-2.0.2中有如下文件服務器

   

  文件解析:數據結構

      01.Cygwin1.dll:動態連接庫文件app

  02.Redis.conf  :redis配置文件

  03.Redis-benchmark.exe:性能測試,用以模擬同時由N個客戶端發送多個SETs/GETs查詢(相似於Apacheab工具)

  04.Redis-check-aof.exe:更新日誌檢查(我的感受這個很是有用,由於其會實時監測日誌文件是否更新)

  05.Redis-check-dump.exe:本地數據庫檢查

  06.Redis-cli:redis命令行操做工具

  07.Redis-server.exeRedis服務器的daemon啓動程序

     步驟二:啓動Redis服務(conf文件是配置文件,若不指定,則redis-server.exe按默認方式啓動)

因此,啓動命令有兩種寫法

寫法一:D:\redis-2.0.2>redis-server.exe 

 在這種場景下,服務啓動的參數設置都會走默認值

寫法二:D:\redis-2.0.2>redis-server.exe redis.conf(推薦方式)

     既然啓動的時候要讀取配置文件的信息,那麼咱們在啓動服務前先作一件事情,修正配置

文件中一個變量的開關,用高級記事本打開conf文件,而後Ctrl+F,輸入appendonly,以下圖,找到appendonly no ,將其值設置成yes

 

接下來就能夠啓動服務了,啓動方式以下圖

 

    上圖反映的是就是redis的服務開啓效果,相似於SQL Server中在的MSSQL服務的開啓,固然服務開啓後,該窗口不能關閉,不然就表明你要關閉服務。固然能夠經過參數的設置讓服務在後臺運行,但不屬於咱們今天討論的範圍。

步驟三:經過cmd窗口模擬一個客戶端,底層固然仍是經過Socket實現。

    這時服務開啓着,另外開一個窗口進行,設置客戶端:

   D:\redis-2.0.2>redis-cli.exe -h 192.168.8.50 -p 6379

 

     OK,到此配置成功!

      有人可能會問,那麼如何將應用程序中的數據寫入到redis中呢?

   解析:這是一個好問題,這裏咱們用Jedis爲例來給你們作下演示。演示以前,但願你們能明白一件事情,redis是內存數據庫,內存寫滿後,不會存儲到硬盤上(VM不穩定,diskstore未啓用),

針對這個不足,redis提供了兩種持久化利器:一種是 Snapshotting(快照)也是默認方式,另外一種是Append-only file(縮寫aof)的方式。

快照缺點:由於兩次快照操做之間是有時間間隔的,一旦數據庫出現問題,那麼快照文件中保存的數據並非全新的,從上次快照文件生成到Redis停機這段時間的數據所有丟掉了。若是業務對數據準確性要求極高的話,就得采用aof持久化機制了。

Aofaof 比快照方式有更好的持久化性,是因爲在使用aof持久化方式時,redis會將每個收到的寫命令都經過write函數追加到文件中(默認是 appendonly.aof)。當redis重啓時會經過從新執行文件中保存的寫命令來在內存中重建整個數據庫的內容。固然因爲os會在內核中緩存 write作的修改,因此可能不是當即寫到磁盤上。這樣aof方式的持久化也仍是有可能會丟失部分修改。不過咱們能夠經過配置文件告訴redis咱們想要經過fsync函數強制os寫入到磁盤的時機。有三種方式以下(默認是:每秒fsync一次):

   01. appendfsync always //每次收到寫命令就當即強制寫入磁盤,最慢的,可是保證徹底的持久化,不推薦使用  

   02.appendfsync everysec //每秒鐘強制寫入磁盤一次,在性能和持久化方面作了很好的折中,推薦  

    03appendfsync no //徹底依賴os,性能最好,持久化沒保證  

    因此在配置文件中,咱們採用的是everysec方式,也就是每隔1s鍾,將內存中的數據flush到硬盤上,那麼不少人又會問,寫到硬盤的位置呢?文件名是什麼呢?這通通都要依賴於配置文件的配置,上文已經說過默認會寫入到redis目錄的appendonly.aof文件中。

接下來就能夠去下載Jedis,在Java項目中導入Jedis,而後便可使用。

 1 import redis.clients.jedis.Jedis;
 2 public class Test {
 3 
 4     public static void main(String[] args) {
 5             Jedis jj = new  Jedis("192.168.8.50");
 6             jj.set("name", "李小龍222");
 7             String ss = jj.get("name");
 8             System.out.println(ss);
 9  }
10 }

 

  注意點:不能將redis取代數據庫的位置,目前redis作數據庫還不太靠譜。它支持的數據類型太少,並且查詢功能太弱。redis並非爲了做爲數據庫使用的,它更多地是一個高速存取器,通常用做緩存和相似場景。若是你想找一個關係型數據庫如mysql的替代者,推薦使用mongodb,支持海量數據,查詢功能強大,數據類型支持普遍。目前已有一些團隊在後臺徹底使用mongodb做爲數據庫。

     固然新浪微博就是使用mysql+redis來作數據存儲的。

Redis優勢:

使用redis的好處是:
1)擁有多種數據結構,能夠豐富cache的數據結構和方式。
2)有持久化的機制,可以保證數據在宕機後也不會丟失數據。

使用redis須要考慮的地方:
1)在使用前要須要對容量要有詳細的規劃
2)沒有官方提供的集羣方案
3)數據查詢的能力確定沒有關係型數據庫強

總結:關鍵的一句話,瞭解這個產品的特性和不足,把合適的產品用在合適的場景中。

相關文章
相關標籤/搜索