关于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

名称描述
latencyRedis响应一个请求的时间
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_lavesslave数量
master_last_io_seconds_ago最近一次主从交互之后的秒数
keyspace数据库中的key值总数

Redis持久性指标: Persistence

名称描述
rdb_last_save_time最后一次持久化保存磁盘的时间戳
rdb_changes_sice_last_save自最后一次持久化以来数据库的更改数

Redis错误指标:Error

名称描述
rejected_connections由于达到maxclient限制而被拒绝的连接数
keyspace_misseskey值查找失败(没有命中)次数
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. 设置热点数据永远不过期。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring Boot提供了与Redis集成的功能,使得使用Redis作为缓存变得非常方便。我们可以使用Spring的缓存注解@Cacheable来实现对Redis缓存监控。 首先,我们需要在项目的依赖中添加Spring Boot与Redis的集成包。在pom.xml文件中加入以下依赖: ``` <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> ``` 接下来,我们需要在Spring Boot的配置文件中配置Redis的连接信息。我们可以在application.properties或application.yml文件中添加以下配置: ``` spring.redis.host=127.0.0.1 # Redis服务器地址 spring.redis.port=6379 # Redis服务器端口 spring.redis.password= # Redis服务器密码(如果有的话) ``` 然后,我们可以在需要进行缓存的方法上添加@Cacheable注解。这个注解将使得方法的返回值被缓存Redis中,下次调用相同参数的方法时,将直接从Redis中取出缓存的值,而不再执行方法体。 示例代码如下: ``` @Service public class UserService { @Cacheable(value = "userCache", key = "#id") public User getUserById(Long id) { // 查询数据库获取用户信息 // ... return user; } } ``` 以上示例中,getUserById方法被@Cacheable注解修饰,指定了缓存的名称为"userCache",以id作为缓存的key。用户在第一次调用该方法时,会执行方法体并将结果缓存Redis中。之后再调用相同id的方法时,将直接从Redis取出缓存的用户对象。 通过以上步骤,我们就可以使用Spring Boot进行Redis缓存监控了。我们可以使用Redis的命令行工具或可视化工具来查看Redis中的缓存情况,通过监控缓存的命中率等指标,来评估缓存的效果和性能优化的需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值