Java开发大型互联网深入理解Redis性能调优之redis性能测试

引言

Redis是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。从2010年3月15日起,Redis的开发工作由VMware主持。从2013年5月开始,Redis的开发由Pivotal赞助。

简介

Redis的优点

性能极高 – Redis能支持超过 100K+ 每秒的读写频率。

丰富的数据类型 – Redis支持二进制案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets 数据类型操作。

原子 – Redis的所有操作都是原子性的,同时Redis还支持对几个操作全并后的原子性执行。

丰富的特性 – Redis还支持 publish/subscribe, 通知, key 过期等等特性。

redis数据结构

redis是一种高级的key:value存储系统,其中value支持五种数据类型:

字符串(strings)

字符串列表(lists)

字符串集合(sets)

有序字符串集合(sorted sets)

哈希(hashes)

而关于key,有几个点要提醒大家:

key不要太长,尽量不要超过1024字节,这不仅消耗内存,而且会降低查找的效率;

key也不要太短,太短的话,key的可读性会降低;

在一个项目中,key最好使用统一的命名模式,例如user:10000:passwd。

安装redis

从redis.io下载最新版redis-X.Y.Z.tar.gz后解压,然后进入redis-X.Y.Z文件夹后直接make即可,安装非常简单。

make成功后会在src文件夹下产生一些二进制可执行文件,包括redis-server、redis-cli等等:

$ find . -type f -executable

./redis-benchmark //用于进行redis性能测试的工具

./redis-check-dump //用于修复出问题的dump.rdb文件

./redis-cli //redis的客户端

./redis-server //redis的服务端

./redis-check-aof //用于修复出问题的AOF文件

./redis-sentinel //用于集群管理

启动redis

启动redis非常简单,直接./redis-server就可以启动服务端了,还可以用下面的方法指定要加载的配置文件:

./redis-server ../redis.conf

默认情况下,redis-server会以非daemon的方式来运行,且默认服务端口为6379。

有关作者为什么选择6379作为默认端口,还有一段有趣的典故,英语好的同学可以看看作者这篇博文中的解释。

使用redis客户端

我们直接看一个例子:

//这样来启动redis客户端了

$ ./redis-cli

//用set指令来设置key、value

127.0.0.1:6379> set name "roc"

OK

//来获取name的值

127.0.0.1:6379> get name

"roc"

//通过客户端来关闭redis服务端

127.0.0.1:6379> shutdown

127.0.0.1:6379>

Redis性能调优

尽管Redis是一个非常快速的内存数据存储媒介,也并不代表Redis不会产生性能问题。

前文中提到过,Redis采用单线程模型,所有的命令都是由一个线程串行执行的,所以当某个命令执行耗时较长时,会拖慢其后的所有命令,这使得Redis对每个任务的执行效率更加敏感。

针对Redis的性能优化,主要从下面几个层面入手:

最初的也是最重要的,确保没有让Redis执行耗时长的命令

使用pipelining将连续执行的命令组合执行

操作系统的Transparent huge pages功能必须关闭:

echo never > /sys/kernel/mm/transparent_hugepage/enabled

如果在虚拟机中运行Redis,可能天然就有虚拟机环境带来的固有延迟。可以通过./redis-cli --intrinsic-latency 100命令查看固有延迟。同时如果对Redis的性能有较高要求的话,应尽可能在物理机上直接部署Redis。检查数据持久化策略,考虑引入读写分离机制。

.

Redis性能测试.

基准测试

基准的测试命令:

redis-benchmark -q -n 100000

结果入下:

root@centos1 bin]# redis-benchmark -q -n 100000

-bash: redis-benchmark: command not found

[root@centos1 bin]# ./redis-benchmark -q -n 100000

PING_INLINE: 61576.36 requests per second

PING_BULK: 60277.28 requests per second

SET: 61349.69 requests per second

GET: 60459.49 requests per second

INCR: 58858.15 requests per second

LPUSH: 59066.75 requests per second

RPUSH: 57339.45 requests per second

LPOP: 55586.44 requests per second

RPOP: 56465.27 requests per second

SADD: 57045.07 requests per second

SPOP: 53734.55 requests per second

LPUSH (needed to benchmark LRANGE): 57012.54 requests per second

LRANGE_100 (first 100 elements): 55803.57 requests per second

LRANGE_300 (first 300 elements): 54914.88 requests per second

LRANGE_500 (first 450 elements): 53333.33 requests per second

LRANGE_600 (first 600 elements): 56529.11 requests per second

MSET (10 keys): 59276.82 requests per second

这里可以看出,单机版的redis每秒可以处理6万个请求,这已经是一个非常厉害的数据了,不得不佩服

我们再来看下集群情况下是是什么情况

[root@centos1 bin]# ./redis-benchmark -q -n 100000 -p 7000

PING_INLINE: 64599.48 requests per second

PING_BULK: 64184.85 requests per second

SET: 66800.27 requests per second

GET: 65616.80 requests per second

INCR: 66269.05 requests per second

LPUSH: 40273.86 requests per second

RPUSH: 40355.12 requests per second

LPOP: 43421.62 requests per second

RPOP: 45187.53 requests per second

SADD: 62539.09 requests per second

SPOP: 61538.46 requests per second

LPUSH (needed to benchmark LRANGE): 38182.51 requests per second

LRANGE_100 (first 100 elements): 25555.84 requests per second

LRANGE_300 (first 300 elements): 9571.21 requests per second

LRANGE_500 (first 450 elements): 7214.49 requests per second

LRANGE_600 (first 600 elements): 5478.85 requests per second

MSET (10 keys): 41893.59 requests per second

总结

以 上就是我对Java开发大型互联网深入理解Redis性能调优之redis性能测试            问题及其优化总结,分享给大家,觉得收获的话可以点个关注收藏转发一波喔,谢谢大佬们支持!

最后,每一位读到这里的网友,感谢你们能耐心地看完。希望在成为一名更优秀的Java程序员的道路上,我们可以一起学习、一起进步!都能赢取白富美,走向架构师的人生巅峰!

想了解学习Java方面的技术内容以及Java技术视频的内容可加群:722040762 验证码:(666 必过)欢迎大家的加入哟!

你可能感兴趣的:(Java开发大型互联网深入理解Redis性能调优之redis性能测试)