Redis
redis是類似於memcached的高性能鍵值緩存工具,但它支持更多的值類型、功能更加豐富,且可以將存儲內容定時持久化到磁盤中,是NoSQL家庭中出色的一員
安裝
wget https://github.com/antirez/redis/tarball/2.2.0-rc2 tar -xzvf antirez-redis-2.2.0-rc2-0-g0540df2.tar.gz cd antirez-redis-b703b5d make sudo make install
客戶端
redis-cli
調試
運行客戶端后,輸入命令
monitor
注意expire
redis的expire命令有限制,執行此命令后,對key進行的任何操作都將先對key進行清空操作,詳見 http://redis.io/topics/expire
2.1.3以上版本不存在這個限制,但未正式發布穩定版,2.1正式發布時會更改為2.2版本
具體表現如下:
redis> set a 100
OK
redis> expire a 600
(integer) 1
redis> incr a
(integer) 1
redis> get a
“1” #正常來說,應返回101,因為還key還沒有過期
如果對這個限制敏感,可以嘗試 2.2.0rc2版本make
之后最好再執行下 make test
測試是否正常,我試過,確實不再存在上面說的奇怪表現
redis-rb
redis支持多語言實現的客戶端訪問,redis-rb是redis的客戶端之一,基於ruby語言實現。
redis-rb中的方法名稱與redis的一致
Resque
resque是基於redis的后台任務組件,能把任何類或模塊作為任務在后台執行,且自帶前台管理功能,方便查看執行情況。
使用
1. 編寫任務
class WorkerClass @queue = "demo" def self.perform(args) sleep 3 puts "Doing something complex with #{args}" end end
2. 進入任務隊列
require "resque" Resque.enqueue(WorkerClass, args)
3. 運行任務
與rails3整合
0. 配置redis
新增 config/redis.yml
文件,加入以下內容
defaults: &defaults host: localhost port: 6379 development: <<: *defaults test: <<: *defaults staging: <<: *defaults production: <<: *defaults
1. 加載resque
echo "require 'resque'" > config/initializers/load_resque.rb config = YAML::load(File.open("#{Rails.root}/config/redis.yml"))[Rails.env] Resque.redis = Redis.new(:host => config['host'], :port => config['port'])
2. 由於worker類都放在app/jobs,因此需要指定rails加載此目錄
修改 config/application.rb
,加入以下內容
config.autoload_paths += %W(#{config.root}/app/jobs)
3. 加入rake任務
修改 @RakeFile@,加入以下內容
require ‘resque/tasks’
task “resque:setup” => :environment
第二句指明運行 resque:setup
前先初始化rails環境
運行resque后台任務
QUEUE=* rake resque:work
查看任務執行情況
#運行resque前台管理服務器 resque-web -p 8282
打開瀏覽器,訪問 http://0.0.0.0:8282
前台可以查看失敗的worker及其日志,可以手動執行retry操作
定時任務
如需定時執行任務,可以使用 resque-scheduler
測試
在測試的時候我們不需要測試過程與resque是異步的,否則resque執行的時候數據可能已經被清空了,使用resque_spec插件可以讓resque worker立即執行