今天聽一個同事說新浪使用的是Redis,於是自己將研究的過程整理出來以備后用。
我們都知道微博這玩意兒現在很火,新浪作為國內最早使用redis,並且是國內最大的redis使用者,當然備受人們關注。新浪微博中一項很重要數據,計數類業務就用到了Redis。OK,廢話不多說,直接切入主題。
Redis是什么?
解析:一種內存型數據庫,雖然其擁有了持久化機制。
Redis配置過程
首先聲明,今天我們探討的配置是在windows系統下
步驟一:下載redis文件包
下載的windows版本是redis-2.0.2,解壓到D盤下,在redis-2.0.2中有以下文件
文件解析:
01.Cygwin1.dll:動態鏈接庫文件
02.Redis.conf :redis配置文件
03.Redis-benchmark.exe:性能測試,用以模擬同時由N個客戶端發送多個SETs/GETs查詢(類似於Apache的ab工具)
04.Redis-check-aof.exe:更新日志檢查(個人感覺這個非常有用,因為其會實時監測日志文件是否更新)
05.Redis-check-dump.exe:本地數據庫檢查
06.Redis-cli:redis命令行操作工具
07.Redis-server.exe:Redis服務器的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持久化機制了。
Aof:aof 比快照方式有更好的持久化性,是由於在使用aof持久化方式時,redis會將每一個收到的寫命令都通過write函數追加到文件中(默認是 appendonly.aof)。當redis重啟時會通過重新執行文件中保存的寫命令來在內存中重建整個數據庫的內容。當然由於os會在內核中緩存 write做的修改,所以可能不是立即寫到磁盤上。這樣aof方式的持久化也還是有可能會丟失部分修改。不過我們可以通過配置文件告訴redis我們想要通過fsync函數強制os寫入到磁盤的時機。有三種方式如下(默認是:每秒fsync一次):
01. appendfsync always //每次收到寫命令就立即強制寫入磁盤,最慢的,但是保證完全的持久化,不推薦使用
02.appendfsync everysec //每秒鍾強制寫入磁盤一次,在性能和持久化方面做了很好的折中,推薦
03、appendfsync 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)數據查詢的能力肯定沒有關系型數據庫強
總結:關鍵的一句話,了解這個產品的特性和不足,把合適的產品用在合適的場景中。