前言 redis性能分析常见的有以下几个方面: redis slowlog分析 SCAN,SSCAN,HSCAN和ZSCAN命令的使用方法 redis是否受到系统使用swap redis watchdog 定位延时 关于redis的延时监控框架,可参考官网资料下面我们分别从这几个方面来介绍 redis slowlog分析 慢查询设置在Redis中有两种修改配置的方法,一种是修改配置文件 slowlog-log-slower-than 并不包括命令排队和网络传输时间.因此客户端执行命令的时间会大于命令的实际执行时间.因为命令执行排队机制,慢查询会导致其他命令级联阻塞,因此客户端出现请求超时时,需要检查该时间点是否有对应的慢查询,从而分析是否为慢查询导致的命令级联阻塞 watchdog定位延时 注意:实验功能,请确保redis数据已备份,会对redis服务性能产生影响 Redis software watchdog #该功能只能动态启用,使用以下命令: CONFIG 2) (integer) 207 2) 1) (integer) 1480865711 2) (integer) 217 LATENCY DOCTOR延时事件统计信息的智能分析与建议
在一些网络服务的系统中,Redis 的性能,可能是比 MySQL 等硬盘数据库的性能更重要的课题。 比如微博,把热点微博、最新的用户关系都存储在 Redis 中,大量的查询击中 Redis,而不走 MySQL。 那么,针对 Redis 服务,我们能做哪些性能优化呢? 或者说,应该避免哪些性能浪费呢? Redis 性能的基本面 在讨论优化之前,我们需要知道,Redis 服务本身就有一些特性,比如单线程运行。 除非修改 Redis 的源代码,不然这些特性,就是我们思考性能优化的基本面。 那么,有哪些 Redis 基本特性需要我们考虑呢? 考虑操作系统和硬件是否影响性能 Redis 运行的外部环境,也就是操作系统和硬件显然也会影响 Redis 的性能。
Redis性能分析有几个大的方向。 分别是 (1)基准对比 (2)配置优化 (3)数据持久化 (4)键值优化 (5)缓存淘汰 (6)Redis集群 基准对比 在没有业务实例运行的情况下,在服务器上通过测试Redis 实例的基准性能来对比有实例运行情况下的 redis性能。 此时total_commands_processed增长会很快 如果是个别指令很慢导致的延迟增加,那么可以看到total_commands_processed下降或者不变,而Redis性能却在明显下降 如果实例的延迟时间是Redis基准性能时间的1.5-2倍以上,可以认为这个Redis实例性能比较差 配置优化 linux配置优化 vm.overcommit_memory Redis是内存数据库
什么是AOF AOF是redis防止数据丢失的日志备份策略,总共有三种方式 Always 同步写回:每个写命令执行完同步地将日志写回磁盘;可靠性高,数据基本不会丢失,但同时每次命令都需要写到磁盘,性能影响比较大 ,可能会丢失1s左右的数据,但是性能得到了保证。 由操作系统控制何时写会,性能非常好;如果发生宕机,也会造成大量数据丢失。 说到AOF,其实很多人都会拿它跟Rdb去做比较,Rdb是以二进制的方式存储到磁盘上。 另外一点,RDB和AOF对客户端的写入性能影响,一般情况下,AOF的写入性能是比不上RDB的,因为AOF多了一个写入操作,但是随着写入数据量越来越大,这个差距会越来越小。 具体可以参考redis官网https://redis.io/topics/persistence,这里不过多赘述。 2.
来源:rrd.me/gteAC 嘿,我是咸鱼,之前给大家推荐过关于 redis 的不少干货,这次再一起学习一下 Redis 的性能分析。 在一些网络服务的系统中,Redis 的性能,可能是比 MySQL 等硬盘数据库的性能更重要的课题。 考虑操作系统和硬件是否影响性能 Redis 运行的外部环境,也就是操作系统和硬件显然也会影响 Redis 的性能。 但这种机制并不是数据库所需要的,可能是因为 THP 会把内存空间变得紧凑而连续吧,就像mongodb 的文档[11]中明确说的,数据库需要的是稀疏的内存空间,所以请禁掉 THP 功能。 [11] mongodb 的文档: https://docs.mongodb.com/manual/tutorial/transparent-huge-pages/ [12] 实验: 参见:https
Redis集群性能问题深度分析 参考 Redis开发与运维 https://redis.io/ http://www.redis.cn/ https://github.com/antirez/redis 2,集群扩容,升级到3.2.9版本后为了均摊QPS扩容了几个节点,后续发现有2个节点内核版本比其他的高但是性能反而表现比其他差,后替换了同版本的内核。 4,建立了CacheCloud监控系统,便于分析观察问题,另外Zabbix也使用Redis模版出现大故障时会报错。 6,每个Redis集群版本升级在功能与性能上都有比较大的提升,需要持久化功能的集群后续可以使用4.0.2版本,另外如果使用虚拟化不建议使用XEN、Hyper-V等,最好使用vSphere压力测试vSphere 一,发现问题 1,慢查询 slowlog get n 默认保留128个日志执行超过10毫秒的记录,可以根据实际情况修改 2,应用报错 主要是应用邮件报超时 二,分析问题 1,内在原因 1)API或数据结构使用不合理
完工后对服务进行压测后发现georadius的性能比预期要差,因此我分析了georadius的源码,并对原始的实现方案进行了优化,总结成了本文。 我们生产环境使用的redis版本为4.0.13,因此本文redis源码皆为4.0.13版本的源码 redis geo原理 往redis中添加坐标的命令是GEOADD key longitude latitude 又因为redis工作线程是单线程的,因此无法充分利用多核,无法通过增加redis server的CPU核数来提升性能,只能添加从库。 80% 86 90% 92 95% 98 98% 104 99% 111 100% 159 (longest request) 可以看到性能并没有巨大的提升 80% 22 90% 24 95% 26 98% 28 99% 30 100% 66 (longest request) 可以看到当优化后性能更差了
redis pipeline 什么是流水线(pipeline) 首先来看 redis 执行一次操作所需要的时间: 1 次时间 = 1 次网络时间 + 1次命令时间 ? 对比如下: M操作在Redis队列中是一个原子操作,pipeline不是原子操作 pipeline与M操作都会将数据顺序的传送顺序地返回(redis 单线程) M 操作一个命令对应多个键值对,而Pipeline 是多条命令 pipeline注意事项 每次pipeline携带数量不推荐过大,否则会影响网络性能 pipeline每次只能作用在一个Redis节点上 pipeline-Jedis使用 Maven 依赖 <dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> <version>2.9.0
Redis3.0 Redis3.0在2015年4月1日正式发布,截止到本书完成已经到3.0.7版本,相比于Redis2.8主要特性如下: Redis3.0最大的改动就是添加Redis的分布式实现Redis Cluster,填补了Redis官方没有分布式实现的空白。 Redis Cluster经历了4年才正式发布也是有原因的,具体可以参考Redis Cluster的开发日志 1) Redis Cluster: Redis的官方分布式实现。 7) bitcount命令性能提升。 8) config set设置maxmemory时候可以设置不同的单位(之前只能是字节),例如config set maxmemory1gb。 9) Redis日志小做调整:日志中会反应当前实例的角色(master或者slave)。 10) incr命令性能提升。
,以顺利进行连接设置密码到配置文件跟复制和只读设置一样,运行时的配置在重启后将丢失,要想重启后依然生效,得修改配置文件master side[root@m1 ~]# grep requirepass redis.conf "requirepass" configurationrequirepass 123456[root@m1 ~]# slave side[root@m2 tmp]# grep masterauth redis.conf
1、性能 Redis本身的QPS已经很高了,但是如果在一些并发量非常高的情况下,性能还是会受到影响。这个时候我们希望有更多的Redis服务来完成工作。 2、扩展 第二个是出于存储的考虑。 可用性、数据安全、性能都可以通过搭建多个Reids服务实现。其中有一个是主节点(master),可以有多个从节点(slave)。主从之间通过数据同步,存储完全相同的数据。 通过master_repl_offset记录的偏移量 redis>info replication 主从复制的不足 主从模式解决了数据备份和性能(通过读写分离)的问题,但是还是存在一些不足: RDB文件过大的情况下 我们会启动一个或者多个Sentinel的服务(通过src/redis-sentinel),它本质上只是一个运行在特殊模式之下的Redis,Sentinel通过info命令得到被监听Redis机器的master Redis虚拟槽分区 Redis既没有用哈希取模,也没有用一致性哈希,而是用虚拟槽来实现的。 Redis创建了16384个槽(slot),每个节点负责一定区间的slot。
分析redis故障的Root cause redis容量规划和性能管理 redis硬件资源利用率和成本 1、redis故障快速发现,定位故障点和解决故障 当redis出现故障时,DBA应在尽可能短时间内发现告警 2、分析redis故障的根本原因 任何一个故障和性能问题,其根本“诱因”往往只有一个,称为这个故障的Root cause。 3、Redis容量规划和性能管理 通过分析redis资源使用和性能指标的监控历史趋势数据;对集群进行合理扩容(Scale-out)、缩容(Scale-back);对性能瓶颈优化处理等。 要分析解决这个性能问题,需要跟踪命令处理数的数量和延迟时间。 详细分析见文章: Redis复制中断和无限同步问题 。
前面的话 测试将54w多条数据bak出来,在一台新的redis数据库重载,查看带来的压力 546167) "nssum005471" 546168) "nssum397176" 546169) "nssum196383 " 546170) "nssum163750" (17.14s) redis的aof文件大小 47M root@233:~/redis-5.0.4# ll -h /var/lib/redis/ total 60M drwxr-xr-x 2 root root 4.0K May 16 14:02 ./ drwxr-xr-x 40 root root 4.0K May 16 11:08 ../ -rw-r 6379> bgsave Background saving started 127.0.0.1:6379> 测试 在重载的某一刻,cpu的idl值直接为0,真是重重的的一击 loading的过程中,redis
1、存在的问题 单台redis容量限制,如何进行扩容?继续加内存、加硬件么? 单台redis并发写量太大有性能瓶颈,如何解决? redis3.0中提供了集群可以解决这些问题。 2、什么是集群 redis集群是对redis的水平扩容,即启动N个redis节点,将整个数据分布存储在这个N个节点中,每个节点存储总数据的1/N。 /opt/cluster/ 3.3、将redis.conf复制到cluster目录 redis.conf 是redis默认配置文件 cp /opt/redis-6.2.1/redis.conf /redis-6379.conf redis-server /opt/cluster/redis-6380.conf redis-server /opt/cluster/redis-6381.conf redis-server /opt/cluster/redis-6389.conf redis-server /opt/cluster/redis-6390.conf redis-server /opt
# pip install redis import redis # 1.链接数据库 key--value client = redis.StrictRedis(host='127.0.0.1',
springboot11、redis 前言 redis可以说是现在最火的非关系型数据库,主要是它处理数据的能力是真的很强。就说win环境的处理能力一般的机器也能在每秒3万次以上,已经很厉害了。 中) 3、编写配置文件【com.item.redis】 4、操作提示 5、RedisBase编码(只包含字符串处理) 6、创建测试接口【com.item.controller】内 7、编写redis层级 数据库索引(默认为0) spring.redis.database=0 # Redis服务器地址 spring.redis.host=localhost # Redis服务器连接端口 spring.redis.port =6379 # Redis服务器连接密码(默认为空) spring.redis.password= #连接池最大连接数(使用负值表示没有限制) spring.redis.pool.max-active =8 # 连接池最大阻塞等待时间(使用负值表示没有限制) spring.redis.pool.max-wait=-1 # 连接池中的最大空闲连接 spring.redis.pool.max-idle
当线程 1 释放锁之后,会触发 redis 的解锁消息,消息的观察者会观察到然后去唤醒解锁的逻辑,线程 2 继续竞争锁。 配置部分 Config config = new Config(); String address = "redis://127.0.0.1:6379"; ('exists', KEYS[1]) == 0) then " + "redis.call('hincrby', KEYS[1], ARGV[2], 1 ); " + "redis.call('pexpire', KEYS[1], ARGV[1]); " + "return nil; " + "end; " + "if (redis.call('hexists',
大家好,又见面了,我是全栈君 一般常见的分析standby database的性能问题的方法就是通过动态性能视图来判断,从11g开始,随着Active Data Guard功能的出现,早期的 Statspack 工具可以在standby database上收集性能分析数据, 这个收集工作是需要在Primary Database上来完成的。 安装standby statspack 以下步骤是针对11gR2的,对于11gR1来说,还稍微有点不同。 (4)然后你就可以收集和分析standby database性能 http://hovertree.com/menu/oracle/ SQL> conn stdbyperf/stdbyperf
\redis-benchmark.exe -n 100 测试结果: ====== PING_INLINE ====== 100 requests completed in 0.00 seconds
Redis 性能测试 Redis 性能测试是通过同时执行多个命令实现的。 语法 redis 性能测试的基本命令如下: redis-benchmark [option] [option value] 注意:该命令是在redis的目录下执行的,而不是redis客户端的内部指令。 实例 以下实例同时执行10000个请求来检测性能: [root@localhost ~]# redis-benchmark -n 10000 -q PING_INLINE: 99009.90 requests 仅显示 query/sec 值 11 --csv 以 CSV 格式输出 12 -l 生成循环,永久执行测试 13 -t 仅运行以逗号分隔的测试命令列表。 14 -I Idle 模式。 实例 以下实例我们使用了多个参数来测试redis性能: [root@localhost ~]# redis-benchmark -h 127.0.0.1 -p 6379 -t set,lpush -n