关于Redis监控
什么是Redis?
Remote Dictionary Server(Redis) 远程字典服务器是完全开源免费的,用C语言编写的,遵守BSD开源协议,Redis是一个高性能的(key/value)分布式内存数据库,基于内存运行,并支持持久化的NoSQL数据库,它也通常被称为数据结构服务器,因为值(value)可以是 字符串(String), 哈希(Map), 列表(list), 集合(sets) 和 有序集合(sorted sets)等类型。
Redis特点:
-
性能极高 – Redis读的速度是11W次/s,写的速度是81K次/s(Redis 的数据是存在内存中,存写速度非常快)
-
支持持久化,将内存中的数据保存在磁盘中,重启可以再次加载使用。
-
丰富的数据类型,Redis不仅仅支持简单的key-value类型的数据,同时还提供Strings, Lists, Hashes, Sets 及 Ordered Sets 等数据结构的存储。
-
支持数据的备份,即master-slave模式的数据备份。
Redis使用场景
查询出的数据保存到Redis中,下次查询的时候直接从Redis中拿到数据。不用和数据库进行交互,减轻数据库压力。
Redis性能指标:Performance
名称 | 描述 |
---|---|
latency | Redis响应一个请求的时间 |
instantaneous_ops_per_sec | 平均每秒处理请求总数 |
hi rate(calculated) | 缓存命中率(计算出来的 |
Redis内存指标: Memory
名称 | 描述 |
---|---|
used_memory | 已使用内存 |
mem_fragmentation_ratio | 内存碎片率 |
evicted_keys | 由于最大内存限制被移除的key的数量 |
blocked_clients | 由于BLPOP,BRPOP,or BRPOPLPUSH而备阻塞的客户端 |
Redis基本活动指标:Basic activity
名称 | 描述 |
---|---|
connected_clients | 客户端连接数 |
conected_laves | slave数量 |
master_last_io_seconds_ago | 最近一次主从交互之后的秒数 |
keyspace | 数据库中的key值总数 |
Redis持久性指标: Persistence
名称 | 描述 |
---|---|
rdb_last_save_time | 最后一次持久化保存磁盘的时间戳 |
rdb_changes_sice_last_save | 自最后一次持久化以来数据库的更改数 |
Redis错误指标:Error
名称 | 描述 |
---|---|
rejected_connections | 由于达到maxclient限制而被拒绝的连接数 |
keyspace_misses | key值查找失败(没有命中)次数 |
master_link_down_since_seconds | 主从断开的持续时间(以秒为单位) |
Redis监控方式
redis-benchmark
redis-stat
redis-faina
redislive
monitor
showlog
redis-cli
性能监控:
redis-cli info | grep ops # 每秒操作数
内存监控:
Redis消耗的资源 # ./redis-cli info | grep used | grep human used_memory_human:2.99M # 内存分配器从操作系统分配的内存总量 used_memory_rss_human:8.04M #操作系统看到的内存占用,top命令看到的内存 used_memory_peak_human:7.77M # redis内存消耗的峰值 used_memory_lua_human:37.00K # lua脚本引擎占用的内存大小 由于BLPOP,BRPOP,or BRPOPLPUSH而备阻塞的客户端 # ./redis-cli info | grep blocked_clients blocked_clients:0 由于最大内存限制被移除的key的数量 # ./redis-cli info | grep evicted_keys evicted_keys:0 # Redis内存碎片率 ./redis-cli info | grep mem_fragmentation_ratio mem_fragmentation_ratio:2.74 Redis已使用内存 # ./redis-cli info | grep used_memory: used_memory:3133624 Redis由于超出最大连接数限制而被拒绝的客户端连接次数,如果这个数字很大,则意味着服务器的最大连接数设置得过低,需要调整maxclients # ./redis-cli info | grep connected_clients connected_clients:1 Redis key值查找失败(没有命中)次数 # ./redis-cli info | grep keyspace keyspace_misses:0 Redis主从断开的持续时间(以秒为单位) # ./redis-cli info | grep rdb_changes_since_last_save rdb_changes_since_last_save:0 复制积压缓冲区如果设置得太小,会导致里面的指令被覆盖掉而找不到偏移量,从而触发全量同步 # ./redis-cli info | grep backlog_size repl_backlog_size:1048576 Redis通过查看sync_partial_err变量的次数来决定是否需要扩大积压缓冲区,它表示主从半同步复制失败的次数 # ./redis-cli info | grep sync_partial_err sync_partial_err:1
1.get:获取慢查询日志
2.len:获取慢查询日志条目数
3.reset:重置慢查询日志
Redis命令交互
slowlog-log-slower-than 1000 # 设置慢查询的时间下线,单位:微秒 slowlog-max-len 100 # 设置慢查询命令对应的日志显示长度,单位:命令数
Redis info命令使用
1.server:服务器运行的环境参数 2.clients:客户端相关信息 3.memory:服务器运行内存统计数据 4.persistence:持久化信息 5.stats:通用统计数据 6.Replication:主从复制相关信息 7.CPU:CPU使用情况 8.cluster:集群信息 9.Keypass:键值对统计数量信息 ##命令格式 #./redis-cli info 按块获取信息 | grep 需要过滤的参数 例 #./redis-cli info stats | grep ops #./redis-cli > info server
Redis性能测试命令
#./redis-benchmark -c 100 -n 5000 #说明:100个连接,5000次请求对应的性能
关于缓存的几个问题
缓存穿透
描述:
故意去请求缓存中不存在的数据,从而去数据库中查,数据库中也没有,所以无法加到缓存,下次还是直接查询数据库,所以高并发的时候就导致数据库崩了。
解决方案:
1)利用互斥锁,缓存失效的时候,先去获得锁,得到锁了,再去请求数据库。没得到锁,则休眠一段时间重试。
2)数据库没查到数据,也往缓存中写入一个空值,但是设置失效时间短一点,防止恶意攻击。
缓存击穿
描述:
缓存击穿是指缓存中没有但数据库中有的数据,缓存的数据刚好过期(失效),这时并发用户特别多,同时读缓存没读到数据,直接在数据库去取数据,引起数据库压力瞬间增大,造成过大压力 ,可能导致数据库崩溃。
解决方案:
1、当多个线程同时去查询数据库的这条数据,那么我们可以在第一个查询数据的请求上使用一个互斥锁来锁住它 ,其他的线程走到这一步拿不到锁就等着,等第一个线程查询到了数据,然后做缓存。后面的线程进来发现已经有缓存了,就直接走缓存
2、可以将爆款的缓存失效时间设置为永久。
缓存雪崩
描述:
缓存雪崩是指缓存中数据大批量到过期时间,而大量查询打到数据库上,引起数据库压力过大甚至down机。和缓存击穿不同的是,缓存击穿指并发查同一条数据,缓存雪崩是不同数据都过期了,很多数据都查不到从而查数据库。
解决方案:
-
缓存预热就是系统上线后,将相关的缓存数据直接加载到缓存系统。这样就可以避免在用户请求的时候,先查询数据库,然后再将数据缓存的问题。
-
设置不同的过期时间,让缓存失效的时间点尽量均匀。
-
设置热点数据永远不过期。