Redis之一塊兒步

1.Redis簡介

    Redis 是一個開源(BSD許可)的,內存中的key-value數據結構存儲系統,它能夠用做數據庫、緩存和消息中間件,解決了斷電後數據徹底丟失的狀況。它支持多種類型的數據結構,如 字符串(strings), 散列(hashes), 列表(lists), 集合(sets), 有序集合(sorted sets) 與範圍查詢, bitmaps, hyperloglogs 和 地理空間(geospatial) 索引半徑查詢。 這些數據類型都支持push/pop、add/remove及取交集並集和差集及更豐富的操做,並且這些操做都是原子性的。Redis 內置了 複製(replication)LUA腳本(Lua scripting), LRU驅動事件(LRU eviction)事務(transactions) 和不一樣級別的 磁盤持久化(persistence), 並經過 Redis哨兵(Sentinel)和自動 分區(Cluster)提供高可用性(high availability)。php

2.Redis的性能

對於redis 的一些簡單測試,僅供參考:html

測試環境:Redhat6.2 , Xeon E5520(4核)*2/8G,1000M網卡mysql

Redis 版本:2.6.9web

 

客戶端機器使用redis-benchmark 簡單GET、SET操做:redis

2. 1單實例測試

1. Value大小:10Byte~1390Bytesql

處理速度: 7.5 w/s,速度受單線程處理能力限制數據庫

2. Value 大小:1400 左右緩存

處理速度突降到5w/s 樣子,網卡未能跑滿;因爲請求包大於MTU形成TCP分包,服務端中斷處理請求加倍,形成業務急劇降低。服務器

3. Value大小:>1.5 k數據結構

1000M網卡跑滿,速度受網卡速度限制

處理速度與包大小大概關係以下:

2.2 多實例測試

前提是系統網卡軟中斷均衡到多CPU核心處理,測試機器網卡開啓RSS,有16個隊列:

操做:10字節Value SET,服務端開啓8個實例,四臺客戶端服務器每臺開啓兩個redis-benchmark,每一個client 速度近4W/s,服務端總處理30w/s左右。

網卡流量:

其中8個單數核心CPU所有耗盡,像是超線程沒有利用上,測試已經達到很好效果,就沒有繼續測試下去了。從單實例跑滿一個核心7.5w/s,8個實例跑滿8個核心,30W/s來看,CPU使用和性能提高不成正比, RSS會形成redis-server線程基本每收到一個請求都切換一次CPU核心,軟中斷CPU佔用過高。這種狀況RPS/RFS功能也許就很合適了,RSS只須要映射1~2個核心,而後再講軟中斷根據redis-server端口動態轉發,保證redis進程都在一個核心上執行,減小進程沒必要要的切換。

 

開多實例能夠充分利用系統CPU、網卡處理小包能力。具體看業務場景,考慮包平均大小、處理CPU消耗、業務量。若是多實例是爲了提升處理能力,須要注意配置網卡軟中斷均衡,不然處理能力也沒法提高。

3.安裝Redis

    Redis的代碼遵循ANSI-C編寫,能夠在全部POSIX系統(如Linux, *BSD, Mac OS X, Solaris等)上安裝運行。並且Redis並不依賴任何非標準庫,也沒有編譯參數必需添加。redis的安裝出奇的簡單,這可能也是他風靡的一個緣由,讓人很容易上手,不像某些東西,編譯階段就能讓人徹底絕望。

先去官網下載源碼:

解壓:

tar –zxvf redis-*.tar.gz

編譯

須要說明的事,redis的安裝很是簡單,已經有現成的Makefile文件,直接運行make命令便可。

make

make install

Redis 由四個可執行文件:redis-benchmark、redis-cli、redis-server、redis-stat 這四個文件,加上一個redis.conf就構成了整個redis的最終可用包。它們的做用以下:

    - redis-server:Redis服務器的daemon啓動程序

    - redis-cli:Redis命令行操做工具。固然,你也能夠用telnet根據其純文本協議來操做

    - redis-benchmark:Redis性能測試工具,測試Redis在你的系統及你的配置下的讀寫性能

    - redis-stat:Redis狀態檢測工具,能夠檢測Redis當前狀態參數及延遲情況

如今就能夠啓動redis了,redis只有一個啓動參數,就是他的配置文件路徑。

redis-server /etc/redis.conf

注意,默認複製過去的redis.conf文件的daemonize參數爲no,因此redis不會在後臺運行,這時要測試,咱們須要從新開一個終端。修改成yes則爲後臺運行redis。另外配置文件中規定了pid文件,log文件和數據文件的地址,若是有須要先修改,默認log信息定向到stdout.

下面是redis.conf的主要配置參數的意義:

    - daemonize:是否之後臺daemon方式運行

    - pidfile:pid文件位置

    - port:監聽的端口號

    - timeout:請求超時時間

    - loglevel:log信息級別

    - logfile:log文件位置

    - databases:開啓數據庫的數量

    - save * *:保存快照的頻率,第一個*表示多長時間,第三個*表示執行多少次寫操做。在必定時間內執行必定數量的寫操做時,自動保存快照。可設置多個條件。

    - rdbcompression:是否使用壓縮

    - dbfilename:數據快照文件名(只是文件名,不包括目錄)

    - dir:數據快照的保存目錄(這個是目錄)

    - appendonly:是否開啓appendonlylog,開啓的話每次寫操做會記一條log,這會提升數據抗風險能力,但影響效率。

    - appendfsync:appendonlylog如何同步到磁盤(三個選項,分別是每次寫都強制調用fsync、每秒啓用一次fsync、不調用fsync等待系統本身同步)

這時你能夠打開一個終端進行測試了,配置文件中默認的監聽端口是6379

咱們能夠開啓一個Redis客戶端進行測試

[root@SNDA-192-168-1-114 ~]# redis-cli 
Could not connect to Redis at 127.0.0.1:6379: Connection refused 
not connected> exit 
[root@SNDA-192-168-1-114 ~]# redis-server /etc/redis.conf 
[root@SNDA-192-168-1-114 ~]# redis-cli 
redis 127.0.0.1:6379> quit

4.redis數據結構

    redis 的做者antirez曾稱其爲一個數據結構服務器(data structures server),這是一個很是準確的表述,redis的全部功能就是將數據以其固有的幾種結構保存,並提供給用戶操做這幾種結構的接口。咱們能夠想象咱們在各類語言中的那些固有數據類型及其操做。

redis目前提供四種數據類型:string,list,set及zset(sorted set)和Hash。

    - string是最簡單的類型,你能夠理解成與Memcached一模一個的類型,一個key對應一個value,其上支持的操做與Memcached的操做相似。但它的功能更豐富。

    - list是一個鏈表結構,主要功能是push、pop、獲取一個範圍的全部值等等。操做中key理解爲鏈表的名字。

    - set是集合,和咱們數學中的集合概念類似,對集合的操做有添加刪除元素,有對多個集合求交併差等操做。操做中key理解爲集合的名字。

    - zset是set的一個升級版本,他在set的基礎上增長了一個順序屬性,這一屬性在添加修改元素的時候能夠指定,每次指定後,zset會自動從新按新的值調整順序。能夠理解了有兩列的mysql表,一列存value,一列存順序。操做中key理解爲zset的名字。

    - Hash數據類型容許用戶用Redis存儲對象類型,Hash數據類型的一個重要優勢是,當你存儲的數據對象只有不多幾個key值時,數據存儲的內存消耗會很小.更多關於Hash數據類型的說明請見:

    - http://code.google.com/p/redis/wiki/Hashes

    在官網上給出了全部支持的接口列表,並副副附有詳細的介紹,地址:

http://code.google.com/p/redis/wiki/CommandReference

    另外,做者還提供了一個很是貼心的web命令行模擬頁面,供初學者試用redis,地址:

http://try.redis-db.com/

5.redis數據存儲

redis的存儲分爲內存存儲、磁盤存儲和log文件三部分,配置文件中有三個參數對其進行配置。

save seconds updatessave配置,指出在多長時間內,有多少次更新操做,就將數據同步到數據文件。這個能夠多個條件配合,好比默認配置文件中的設置,就設置了三個條件。

appendonly yes/no appendonly配置,指出是否在每次更新操做後進行日誌記錄,若是不開啓,可能會在斷電時致使一段時間內的數據丟失。由於redis自己同步數據文件是按上面的save條件來同步的,因此有的數據會在一段時間內只存在於內存中。

appendfsync no/always/everysec appendfsync配置,no表示等操做系統進行數據緩存同步到磁盤,always表示每次更新操做後手動調用fsync()將數據寫到磁盤,everysec表示每秒同步一次。

6.redis主從配置

redis支持master-slave的主從配置,配置方法是在從機的配置文件中指定slaveof參數爲主機的ip和port便可

7.redis起步(連接整理)

項目首頁,下方是各類語言支持列表:

http://code.google.com/p/redis/

做者在wiki中給出了一個很是好的例子,以使咱們能夠快速上手,地址:

http://code.google.com/p/redis/wiki/TwitterAlikeExample

同時做者推薦的另外一個教程,地址:

http://labs.alcacoop.it/doku.php?id=articles:redis_land

一個redis愛好者建立的相關問題討論網站:

http://www.rediscookbook.org/

爲何使用 Redis及其產品定位

http://www.infoq.com/cn/articles/tq-why-choose-redis

Redis內存使用優化與存儲

http://www.infoq.com/cn/articles/tq-redis-memory-usage-optimization-storage

相關文章
相關標籤/搜索