关于Redis监控及缓存相关问题

关于Redis监控

什么是Redis?

Remote Dictionary Server(Redis) 远程字典服务器是完全开源免费的,用C语言编写的,遵守BSD开源协议,Redis是一个高性能的(key/value)分布式内存数据库,基于内存运行,并支持持久化的NoSQL数据库,它也通常被称为数据结构服务器,因为值(value)可以是 字符串(String), 哈希(Map), 列表(list), 集合(sets) 和 有序集合(sorted sets)等类型。

Redis特点:

  1. 性能极高 – Redis读的速度是11W次/s,写的速度是81K次/s(Redis 的数据是存在内存中,存写速度非常快)

  2. 支持持久化,将内存中的数据保存在磁盘中,重启可以再次加载使用。

  3. 丰富的数据类型,Redis不仅仅支持简单的key-value类型的数据,同时还提供Strings, Lists, Hashes, Sets 及 Ordered Sets 等数据结构的存储。

  4. 支持数据的备份,即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机。和缓存击穿不同的是,缓存击穿指并发查同一条数据,缓存雪崩是不同数据都过期了,很多数据都查不到从而查数据库。

解决方案:

  1. 缓存预热就是系统上线后,将相关的缓存数据直接加载到缓存系统。这样就可以避免在用户请求的时候,先查询数据库,然后再将数据缓存的问题。

  2. 设置不同的过期时间,让缓存失效的时间点尽量均匀。

  3. 设置热点数据永远不过期。

猜你喜欢

转载自blog.csdn.net/u012002125/article/details/106845903