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
AI 代码解读
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)
AI 代码解读
2. 安装redis
-- 下载redis源码
解压并安装到指定目录
修改环境变量
应用环境变量
创建配置文件目录, 拷贝配置文件模板到此目录
创建数据文件备份目录
修改内核参数
修改过的配置文件内容 :
所有内容 :
启动redis
3. 测试lpush和rpop
[root@db5 soft_bak]# wget http://redis.googlecode.com/files/redis-2.4.14.tar.gz
AI 代码解读
解压并安装到指定目录
tar -zxvf redis-2.4.14.tar.gz cd redis-2.4.14 make all make PREFIX=/opt/redis2.4.14 install
AI 代码解读
修改环境变量
vi ~/.bash_profile export PATH=/opt/redis2.4.14/bin:$PATH
AI 代码解读
应用环境变量
. ~/.bash_profile
AI 代码解读
创建配置文件目录, 拷贝配置文件模板到此目录
[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/
AI 代码解读
创建数据文件备份目录
mkdir /opt/redis2.4.14/rdb
AI 代码解读
修改内核参数
[root@db5 etc]# sysctl -w vm.overcommit_memory=1 vi /etc/sysctl.conf vm.overcommit_memory = 1
AI 代码解读
修改过的配置文件内容 :
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/
AI 代码解读
所有内容 :
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
AI 代码解读
启动redis
redis-server /opt/redis2.4.14/etc/redis.conf
AI 代码解读
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
AI 代码解读
测试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
AI 代码解读
测试用的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
AI 代码解读
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请求.
AI 代码解读
5. rpush和lpop的测试结果
脚本与前面类似, 不再重复. [root@db5 ruby]# . ./test.sh rpush 完成时间93秒. 占用8.94GB内存 [root@db5 ruby]# . ./test.sh lpop 完成时间3300秒.
AI 代码解读
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"
AI 代码解读
脚本
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
AI 代码解读
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
AI 代码解读
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
AI 代码解读
测试结果 :
[root@db5 ruby]# . ./test.sh rpush 完成时间93秒. 占用8.94GB内存 [root@db5 ruby]# . ./test.sh lpop 完成时间3000秒.
AI 代码解读
【小结】
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) } }
AI 代码解读