redis jredis jedis 使用
一、 簡介
Redis是一種進階key-value資料庫。它跟memcached類似,不過資料可以持久化,而且支援的資料類型很豐富。有字串,鏈表,集 合和有序集合(list,set ,sorted set和hash)。支援在伺服器端計算集合的並,交和補集(difference)等,還支援多種排序功能。所以Redis也可以被看成是一個資料結構服務 器。
Redis的所有資料都是儲存在記憶體中,然後不週期性通過非同步方式儲存到磁碟上(這稱為“半持久化模式”);也可以把每一次資料變化都寫入到一個裡面(這稱為“全持久化模式”),本來可以採用memcache,但是memcache的 value只包括string類型。遠沒有redis的value類型豐富。redis也支援主從複製機制(master-slave replication)。redis的其他特性包括簡單的事務支援和 發布訂閱(pub/sub)通道功能,而且redis組態管理非常簡單。還有各種語言版本的開源用戶端類庫,類似的開源產品有很多,我接觸過的有memcache、membase、memlink。
注意:以下介紹redis檔案存放的路徑位置會因為版本的不一樣,而預設存放的位置不一樣,比如:redis1.6中redis.conf存放在redis的根目錄下,而redis2.2.5中redis.conf存放在redis/src/下面,因此以下講解中檔案存放位置會因此版本的不一致,導致預設檔案位置不一致
二、 安裝
1) 下載redis
目前redis的版本已經到了2.2.5版本,但是我們用戶端採用的是jredis,而並非jedis,因此針對於jredis,我們下載的redis版本不能超過1.2.6,因為jredis官方網站上已經做了說明:如:
因此,如果用戶端用到jredis請到該地址下載redis的1.2.6版本http://code.google.com/p/redis/downloads/list,因此經過我的測試,我能肯定jredis不支援redis的高版本,在調用時,會拋出異常,但是如果用到jedis作為用戶端,那麼可以用到redis的高版本,但是jedis不支援list作為值進行儲存(最基本的區別)。
2) 解壓縮
解壓縮下載下來的redis
3) 安裝C/C++的編譯組件(非必須)
apt-get install build-essential
4) 編譯
cd redis-2.2.5
make
make命令執行完成後,會在目前的目錄下產生本個可執行檔,分別是redis-server、redis-cli、redis-benchmark、redis-stat,它們的作用如下:
redis-server:Redis伺服器的daemon啟動程式
redis-cli:Redis命令列操作工具。你也可以用telnet根據其純文字協議來操作
redis-benchmark:Redis效能測試工具,測試Redis在你的系統及你的配置下的讀寫效能
redis-stat:Redis狀態偵查工具,可以檢測Redis目前狀態參數及延遲狀況
5) 啟動服務
Ø 預設啟動
在我們成功安裝Redis後,我們直接執行redis-server即可運行Redis,此時它是按照預設配置來啟動並執行(預設配置甚至不是後台運行)。
首先進入到redis的 src目錄下,然後命令 ./redis-server啟動
Ø 配置啟動
我們希望Redis按我們的要求運行,則我們需要修改設定檔,首先把Redis的設定檔 redis.conf cp 到 /etc目錄下,修改它就可以配置我們的server了,配置內容參考 六、相關設定檔及說明,配置完成後,可以通過下面的命令啟動伺服器:
/……/redis-server /……./etc/redis.conf(後台啟動) 或者 /……/redis-server(非後台啟動)
Ø 查看是否啟動成功
ps -ef | grep redis(通過進程查看服務是否後台開啟) ,非後台啟動可以直接查看
Ø 關閉服務
redis-cli shutdown
Ø 簡單測試
開啟redis內建的工具redis-cli進行測試。 通過set、get進行簡單的儲存、擷取以及儲存本地硬碟測試
Ø 添加到開機啟動
vi /etc/rc.d/rc.local
redis-server / etc/redis.conf
最後還要開放redis的連接埠,否則用戶端無法串連。方法如下:
vi /etc/sysconfig/iptables #需要具備其修改許可權
增加一行:
# redis
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 6379 -j ACCEPT
儲存後重啟iptables:
service iptables restart (PATH中加入了/sbin/)或者 /etc/init.d/iptables restart
三、 相關設定檔說明及修改
Ø /etc/sysctl.conf
添加:vm.overcommit_memory=1 重新整理配置使之生效
Ø
/proc/sys/vm/overcommit_memory
如果記憶體情況比較緊張的話,需要設定核心參數:
overcommit_memory檔案指定了核心針對記憶體配置的策略,其值可以是0、1、2。
0, 表示核心將檢查是否有足夠的可用記憶體供應用進程使用;如果有足夠的可用記憶體,記憶體申請允許;否則,記憶體申請失敗,並把錯誤返回給應用進程。
1, 表示核心允許分配所有的實體記憶體,而不管當前的記憶體狀態如何。
2, 表示核心允許分配超過所有實體記憶體和交換空間總和的記憶體
Ø /etc/redis.conf
redis.conf配置選項如下:
daemonize 是否以後台進程運行,預設為no
pidfile 如以後台進程運行,則需指定一個pid,預設為/var/run/redis.pid
bind 綁定主機IP,預設值為127.0.0.1(注釋)
port 監聽連接埠,預設為6379
timeout 逾時時間,預設為300(秒)
loglevel 日誌記錄等級,有4個可選值,debug,verbose(預設值),notice,warning
logfile 日誌記錄方式,預設值為stdout
databases 可用資料庫數,預設值為16,預設資料庫為0
save 指出在多長時間內,有多少次更新操作,就將資料同步到資料檔案。這個可以多個條件配合,比如預設設定檔中的設定,就設定了三個條件。
save 900 1 900秒(15分鐘)內至少有1個key被改變
save 300 10 300秒(5分鐘)內至少有300個key被改變
save 60 10000 60秒內至少有10000個key被改變
rdbcompression 儲存至本機資料庫時是否壓縮資料,預設為yes
dbfilename 本機資料庫檔案名稱,預設值為dump.rdb
dir 本機資料庫存放路徑,預設值為 ./
slaveof 當本機為從服務時,設定主服務的IP及連接埠(注釋)
masterauth 當本機為從服務時,設定主服務的串連密碼(注釋)
requirepass 串連密碼(注釋)
maxclients 最大用戶端串連數,預設不限制(注釋)
maxmemory 設定最大記憶體,達到最大記憶體設定後,Redis會先嘗試清除已到期或即將到期的Key,當此方法處理後,任到達最大記憶體設定,將無法再進行寫入操作。(注釋)
appendonly 是否在每次更新操作後進行日誌記錄,如果不開啟,可能會在斷電時導致一段時間內的資料丟失。因為redis本身同步資料檔案是按上面save條件來同步的,所以有的資料會在一段時間內只存在於記憶體中。預設值為no
appendfilename 更新記錄檔名,預設值為appendonly.aof(注釋)
appendfsync 更新日誌條件,共有3個可選值。no表示等作業系統進行資料緩衝同步到磁碟,always表示每次更新操作後手動調用fsync()將資料寫到磁碟,everysec表示每秒同步一次(預設值)。
vm-enabled 是否使用虛擬記憶體,預設值為no
vm-swap-file 虛擬記憶體檔案路徑,預設值為/tmp/redis.swap,不可多個Redis執行個體共用
vm- max-memory 只可以使用記憶體的最大值 如果超過了此值就使用虛擬記憶體了交換是使用次數少為主放在虛擬記憶體中去。預設值為0。
四、 測試
Ø JAVA用戶端調用測試
要建立java用戶端測試環境,首先需要redis用戶端調用所依賴的java包,我用了兩種進行測試,1、jredis 2、jedis
我對上述兩種用戶端都做了測試代碼的編寫,有如下直觀的區別:
Redis版本:2.5.5
Jredis: jredis直接拋出異常。
Jedis: 可以存入資料到伺服器,但是不支援集合以及對象作為值儲存。
Redis版本:1.6
Jredis: 可以正常的存取,也可以把對象和集合作為值進行儲存。
Jedis: 可以存入資料到伺服器,但是不支援集合以及對象作為值儲存。
上述兩種的共同的缺陷:不能保證高並發(我啟動超過70個線程就開始有異常拋出,因此需要使用JedisPool和JedisPoolConfig執行個體,進行池化,否則難以支援大資料量的高並發)、大資料量的穩定性。
Jredis以及jedis的
jredis:http://code.google.com/p/jredis/
jedis:https://github.com/xetorthio/jedis/downloads
圖片中是我開啟70個線程進行取值的:
相關代碼在附件中下載
Ø 系統內建工具測試
下面是我做的一個簡單的測試,首選儲存相應的資料到記憶體中,然後從記憶體中擷取儲存的資訊,最後把儲存在記憶體中的資料dump到硬碟中。
命令到redis的src目錄下啟動用戶端(前提要先啟動服務端,我這裡便於測試,沒有通過後台啟動,通過非後台啟動便於觀察)。
非後台啟動服務端:/…./redis-server
用戶端啟動:/…/redis-cli
用戶端執行:set(儲存一個索引值對) key value,get (得到一個索引值對) key如:
伺服器端顯示如:
用戶端執行:save命令,如:
伺服器端顯示如:
儲存到硬碟中的檔案為:
開啟該檔案後,可以查看相應儲存的資訊。