redis是一个性能比较出色的内存数据库或者说NOSQL.
下面使用ruby测试一下lpush和lpop的性能.
测试机 :
1. 安装redis-rb (rubygems里面叫redis, github里面叫redis-rb注意)
HP DL360G5
16G内存
2颗 4核心Intel(R) Xeon(R) CPU E5405 @ 2.00GHz
ruby版本1.9.3-p194
redis版本2.4.14
操作系统 : CentOS 5.2 x64
1. 安装redis-rb (rubygems里面叫redis, github里面叫redis-rb注意)
ruby和git安装可以参考前面几篇BLOG :
use rvm install and manage ruby version
git install
安装redis-rb模块.
2. 安装redis
[root@db-172-16-3-33 ~]# gem install redis
Fetching: redis-3.0.0.gem (100%)
Successfully installed redis-3.0.0
1 gem installed
Installing ri documentation for redis-3.0.0...
Installing RDoc documentation for redis-3.0.0...
[root@db-172-16-3-33 ~]# gem list
*** LOCAL GEMS ***
redis (3.0.0)
2. 安装redis
-- 下载redis源码
解压并安装到指定目录
修改环境变量
应用环境变量
创建配置文件目录, 拷贝配置文件模板到此目录
创建数据文件备份目录
修改内核参数
修改过的配置文件内容 :
所有内容 :
启动redis
3. 测试lpush和rpop
[root@db5 soft_bak]# wget http://redis.googlecode.com/files/redis-2.4.14.tar.gz
解压并安装到指定目录
tar -zxvf redis-2.4.14.tar.gz
cd redis-2.4.14
make all
make PREFIX=/opt/redis2.4.14 install
修改环境变量
vi ~/.bash_profile
export PATH=/opt/redis2.4.14/bin:$PATH
应用环境变量
. ~/.bash_profile
创建配置文件目录, 拷贝配置文件模板到此目录
[root@db5 redis-2.4.14]# mkdir /opt/redis2.4.14/etc
[root@db5 redis-2.4.14]# cp $redis-2.4.14/redis.conf /opt/redis2.4.14/etc/
创建数据文件备份目录
mkdir /opt/redis2.4.14/rdb
修改内核参数
[root@db5 etc]# sysctl -w vm.overcommit_memory=1
vi /etc/sysctl.conf
vm.overcommit_memory = 1
修改过的配置文件内容 :
daemonize yes
pidfile /opt/redis2.4.14/redis.pid
bind 127.0.0.1
unixsocket /opt/redis2.4.14/redis.sock
unixsocketperm 755
logfile /var/log/redis.log
dir /opt/redis2.4.14/rdb/
所有内容 :
daemonize yes
pidfile /opt/redis2.4.14/redis.pid
port 6379
bind 127.0.0.1
unixsocket /opt/redis2.4.14/redis.sock
unixsocketperm 755
timeout 0
loglevel verbose
logfile /var/log/redis.log
databases 16
save 900 1
save 300 10
save 60 10000
rdbcompression yes
dbfilename dump.rdb
dir /opt/redis2.4.14/rdb/
slave-serve-stale-data yes
appendonly no
appendfsync everysec
no-appendfsync-on-rewrite no
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
slowlog-log-slower-than 10000
slowlog-max-len 128
vm-enabled no
vm-swap-file /tmp/redis.swap
vm-max-memory 0
vm-page-size 32
vm-pages 134217728
vm-max-threads 4
hash-max-zipmap-entries 512
hash-max-zipmap-value 64
list-max-ziplist-entries 512
list-max-ziplist-value 64
set-max-intset-entries 512
zset-max-ziplist-entries 128
zset-max-ziplist-value 64
activerehashing yes
启动redis
redis-server /opt/redis2.4.14/etc/redis.conf
3. 测试lpush和rpop
测试8个客户端同时push 总共1亿个value到一个list, 使用pipeline.
测试8个客户端同时从1个list 取1亿个value
测试用的shell脚本
4. lpush和rpop测试结果
5. rpush和lpop的测试结果
6. 测试8个key的情况, pop的时候从8个key同时取出.
脚本
[root@db5 ruby]# cat lpush.rb
#!/usr/local/rvm/bin/ruby
require "rubygems"
require "redis"
require "date"
rb = Redis.new
mylist = Array.new
name = "l1"
rb.del(name)
(1..100).each do
mylist.push("abcdefghijklmnopqrstuvwxyz0123456789")
end
p DateTime.now
(1..125000).each do
rb.lpush(name,x)
end
p DateTime.now
测试8个客户端同时从1个list 取1亿个value
[root@db5 ruby]# cat rpop.rb
#!/usr/local/rvm/bin/ruby
require "rubygems"
require "redis"
require "date"
rb = Redis.new
name = "l1"
p DateTime.now
(0..12500000).each do
rb.rpop(name)
end
p DateTime.now
测试用的shell脚本
[root@db5 ruby]# cat test.sh
#!/bin/bash
lpush() {
for((i=1;i<=8;i++))
do
ruby ./lpush.rb >./lpush_$i.log 2>&1 &
done
}
rpop() {
for((i=1;i<=8;i++))
do
ruby ./rpop.rb >./rpop_$i.log 2>&1 &
done
}
case "$1" in
lpush)
lpush
;;
rpop)
rpop
;;
*)
echo $"Usage: $prog {lpush|rpop}"
exit 0
esac
4. lpush和rpop测试结果
[root@db5 ruby]# . ./test.sh lpush
完成时间95秒.
占用8.94GB内存
每秒插入105万个value, 处理13万次lpush请求.
[root@db5 ruby]# . ./test.sh rpop
完成时间2300秒.
每秒处理43478次rpop请求.
5. rpush和lpop的测试结果
脚本与前面类似, 不再重复.
[root@db5 ruby]# . ./test.sh rpush
完成时间93秒.
占用8.94GB内存
[root@db5 ruby]# . ./test.sh lpop
完成时间3300秒.
6. 测试8个key的情况, pop的时候从8个key同时取出.
redis 127.0.0.1:6379> keys *
1) "l7"
2) "l8"
3) "l1"
4) "l2"
5) "l3"
6) "l4"
7) "l5"
8) "l6"
脚本
lpop.rb :
rpush.rb :
test.sh :
测试结果 :
【小结】
[root@db5 ruby]# cat lpop1.rb
#!/usr/local/rvm/bin/ruby
require "rubygems"
require "redis"
require "date"
rb = Redis.new
name = "l"+ARGV[0]
p DateTime.now
(0..12500000).each do
rb.lpop(name)
end
p DateTime.now
rpush.rb :
[root@db5 ruby]# cat rpush1.rb
#!/usr/local/rvm/bin/ruby
require "rubygems"
require "redis"
require "date"
rb = Redis.new
mylist = Array.new
name = "l"+ARGV[0]
rb.del(name)
(1..100).each do
mylist.push("abcdefghijklmnopqrstuvwxyz0123456789")
end
p DateTime.now
(1..125000).each do
rb.rpush(name,mylist)
end
p DateTime.now
test.sh :
[root@db5 ruby]# cat test.sh
#!/bin/bash
rpush() {
for((i=1;i<=8;i++))
do
ruby ./rpush.rb $i >./rpush_$i.log 2>&1 &
done
}
lpop() {
for((i=1;i<=8;i++))
do
ruby ./lpop.rb $i >./lpop_$i.log 2>&1 &
done
}
case "$1" in
rpush)
rpush
;;
lpop)
lpop
;;
*)
echo $"Usage: $prog {rpush|lpop}"
exit 0
esac
测试结果 :
[root@db5 ruby]# . ./test.sh rpush
完成时间93秒.
占用8.94GB内存
[root@db5 ruby]# . ./test.sh lpop
完成时间3000秒.
【小结】
1. 使用1个key和多个key操作push和pop性能基本一致. 多key的情况下pop略快.
【参考】
1.
redis.io
2. redis-rb的源码 :
3. 使用pipeline
参考代码
name = "toto"
mylist = [ 1,2,3,4,5 ]
$redis.pipelined{ mylist.each{ |x| $redis.lpush(name,x) } }