SpringBoot整合Redis实现缓存信息监控

SpringBoot整合Redis可以通过RedisTemplate和Redisson两种方式。

1. RedisTemplate获取Redis信息

根据Connection获取Redis缓存信息

// 方式1:获取Redis缓存全部信息

Properties info = redisTemplate.getRequiredConnectionFactory().getConnection().info();

// 方式2:根据Connection获取Redis缓存指定信息:

Properties info = redisTemplate.getRequiredConnectionFactory().getConnection().info("section");

方式2可选参数:

复制代码
server: 常规信息
clients: 客户端连接部分
memory: 内存消耗相关信息
persistence: RDB和AOF相关信息
stats: 统计信息
replication: 主/从复制信息
cpu: CPU消耗统计
commandstats: Redis命令统计
cluster: 集群部分
keyspace: 数据库、key相关统计

2. Redisson获取Redis信息

2.1 Redisson版本3.18.1及之前

根据Connection获取Redis缓存信息

private final RedissonConnectionFactory connectionFactory;

RedisConnection connection = connectionFactory.getConnection();

// 方式1:获取Redis缓存全部信息

Properties info = connection.info();

// 方式2:根据Connection获取Redis缓存指定信息

Properties info = connection.info("section");

2.2 Redisson版本3.19.0及之后

根据Connection获取Redis缓存信息

private final RedissonConnectionFactory connectionFactory;

RedisConnection connection = connectionFactory.getConnection();

// 方式1:获取Redis缓存全部信息

Properties info = connection.commands().info();

// 方式2:根据Connection获取Redis缓存指定信息

Properties info = connection.commands().info("section");

2.3 相关集成代码

xml 复制代码
<!--redisson-->
<dependency>
    <groupId>org.redisson</groupId>
    <artifactId>redisson-spring-boot-starter</artifactId>
</dependency>
java 复制代码
@RequiredArgsConstructor
public class RedisMonitorUtil {
    private final RedissonConnectionFactory connectionFactory;

    /**
     * 获取redis服务器相关信息
     * @return
     */
    public CacheListInfoVO getInfo() {
        CacheListInfoVO infoVo = new CacheListInfoVO();
        
        RedisConnection connection = connectionFactory.getConnection();
        Properties commandStats = connection.info("commandstats");

        List<CommandstatsVO> pieList = new ArrayList<>();
        if (commandStats != null) {
            commandStats.stringPropertyNames().forEach(key -> {
                CommandstatsVO commandstatsVO = new CommandstatsVO();
                String property = commandStats.getProperty(key);
                commandstatsVO.setName(StringUtils.removeStart(key, "cmdstat_"));
                commandstatsVO.setCalls(StringUtils.substringBetween(property, "calls=", ",usec"));
                commandstatsVO.setPerCall(StringUtils.substringAfter(property, "usec_per_call="));
                pieList.add(commandstatsVO);
            });
        }
        try {
            ObjectMapper objectMapper = new ObjectMapper();
            CacheInfoVO cacheInfoVO = JSON.parseObject(objectMapper.writeValueAsString(connection.info()), CacheInfoVO.class);
            infoVo.setInfo(cacheInfoVO);
        } catch (JsonProcessingException e) {
            e.printStackTrace();
        }
        infoVo.setDbSize(connection.dbSize());
        infoVo.setCommandStats(pieList);
        return infoVo;
    }
}

3. Redis Info命令信息解释

yml 复制代码
redis> INFO ALL
# Server
redis_version:5.0.5       #Redis服务器的版本
redis_git_sha1:00000000   #Git SHA1
redis_git_dirty:0         #Git dirty flag
redis_build_id:cdff23e4497417f9  #构建ID
redis_mode:cluster        #Redis启动模式:standalone、Sentinel、Cluster
os:Linux 4.4.0-143-generic x86_64  #redis宿主机操作系统
arch_bits:64              #架构:32位、64位
multiplexing_api:epoll    #事件循环机制
atomicvar_api:atomic-builtin   #Atomicvar API
gcc_version:5.4.0             #编译 Redis 时所使用的 GCC 版本
process_id:41450          #进程PID
run_id:7c1db72b9f235c5e52780aeb8817fd272230f1bc  #标识Redis服务器的唯一随机值,由Sentinel和Cluster使用
tcp_port:6379            #TCP、IP侦听端口
uptime_in_seconds:129723    #自Redis服务器启动以来的秒数
uptime_in_days:1            #自Redis服务器启动以来的天数
hz:10                    #调度serverCron每秒运行次数
configured_hz:10         #
lru_clock:10612903       #以分钟为单位进行自增的时钟,用于 LRU 管理
executable:/usr/local/redis5.0/bin/redis-server          #服务器可执行文件的路径
config_file:/usr/local/redis5.0/6379/redis6379.conf      #启动 redis 配置文件
 
# Clients
connected_clients:1                   #已连接客户端的数量(不包括通过从服务器连接的客户端)
client_recent_max_input_buffer:2      #当前连接的客户端当中,最大输入缓存
client_recent_max_output_buffer:0     #当前连接的客户端当中,最长的输出列表
blocked_clients:0                     #正在等待阻塞命令(BLPOP、BRPOP、BRPOPLPUSH)的客户端的数量
 
# Memory
used_memory:2660408                 #由 redis 分配器(标准libc,jemalloc或其他分配器,例如tcmalloc)分配的内存总量,以字节(byte)为单位
used_memory_human:2.54M             #以可读的格式返回 redis 分配的内存总量
used_memory_rss:9154560             #从操作系统的角度,返回 Redis 已分配的内存总量(俗称常驻集大小)。这个值和 top、ps 等命令的输出一致。
used_memory_rss_human:8.73M         #以可读的格式,操作系统角度,返回 redis 分配的内存总量
used_memory_peak:204081928          #redis 的内存消耗峰值(以字节为单位)
used_memory_peak_human:194.63M      #以可读的格式,返回 Redis 的内存消耗峰值
used_memory_peak_perc:1.30%         #used_memory_peak在used_memory中所占的百分比
used_memory_overhead:2565048        #分配用于管理其内部数据结构的所有开销的总字节数
used_memory_startup:1449744         #启动时消耗的初始内存量(以字节为单位)
used_memory_dataset:95360           #数据集的大小(以字节为单位,used_memory - used_memory_overhead)
used_memory_dataset_perc:7.88%      #used_memory_dataset在净内存(used_memory-used_memory_startup)使用量中所占的百分比
allocator_allocated:2770640         #分配器分配的内存
allocator_active:3371008            #分配器活跃的内存
allocator_resident:11554816         #分配器常驻的内存
total_system_memory:1021468672      #主机拥有的内存总量
total_system_memory_human:974.15M   #以可读的格式返回主机拥有的内存总量
used_memory_lua:37888               #Lua引擎使用的字节数
used_memory_lua_human:37.00K        #以可读的格式返回Lua引擎使用内存
used_memory_scripts:0         
used_memory_scripts_human:0B
number_of_cached_scripts:0
maxmemory:0                         #配置设置的最大可使用内存值,默认0,不限制
maxmemory_human:0B                  #以可读的格式返回最大可使用内存值
maxmemory_policy:noeviction         #内存容量超过maxmemory后的处理策略,noeviction当内存使用达到阈值的时候,所有引起申请内存的命令会报错
allocator_frag_ratio:1.22           #分配器的碎片率
allocator_frag_bytes:600368         #分配器的碎片大小(以字节为单位)
allocator_rss_ratio:3.43            #分配器常驻内存比例
allocator_rss_bytes:8183808         #分配器的常驻内存大小(以字节为单位)
rss_overhead_ratio:0.79             #常驻内存开销比例
rss_overhead_bytes:-2400256         #常驻内存开销大小(以字节为单位)
mem_fragmentation_ratio:3.50         #内存碎片率,used_memory_rss 和 used_memory 之间的比率
mem_fragmentation_bytes:6536432      #内存碎片的大小(以字节为单位)
mem_not_counted_for_evict:0          #被驱逐的大小
mem_replication_backlog:1048576      #repl_backlog
mem_clients_slaves:16922             #clients_slaves
mem_clients_normal:49694             #clients_normal
mem_aof_buffer:0                     #aof时,占用的缓冲
mem_allocator:jemalloc-5.1.0         #内存分配器(在编译时选择)
active_defrag_running:0              #碎片整理是否处于活动状态
lazyfree_pending_objects:0           #等待释放的对象数(由于使用ASYNC选项调用UNLINK或FLUSHDB和FLUSHALL)
 
# Persistence
loading:0                           #记录服务器是否正在载入持久化文件
rdb_changes_since_last_save:0       #最近一次成功创建持久化文件之后,经过了多少秒
rdb_bgsave_in_progress:0            #记录了服务器是否正在创建 RDB 文件
rdb_last_save_time:1570890961       #最近一次成功创建 RDB 文件的 UNIX 时间戳
rdb_last_bgsave_status:ok           #记录最近一次创建 RDB 文件的状态,是成功还是失败
rdb_last_bgsave_time_sec:0          #记录了最近一次创建 RDB 文件耗费的秒数
rdb_current_bgsave_time_sec:-1      #如果正在创建 RDB 文件,记录当前的创建操作已经耗费的秒数
rdb_last_cow_size:249856            #上一次RBD保存操作期间写时复制的大小(以字节为单位)
aof_enabled:1                       #AOF是否开启
aof_rewrite_in_progress:0           #记录了是否正在创建 AOF 文件
aof_rewrite_scheduled:0             #记录了 RDB 文件创建完毕之后,是否需要执行 AOF 重写操作
aof_last_rewrite_time_sec:0         #最近一次创建 AOF 文件耗费的秒数
aof_current_rewrite_time_sec:-1     #如果正在创建 AOF 文件,那么记录当前的创建操作耗费的秒数
aof_last_bgrewrite_status:ok        #记录了最近一次创建 AOF 文件的状态,是成功还是失败
aof_last_write_status:ok            #AOF的最后写入操作的状态,是成功还是失败
aof_last_cow_size:307200            #上一次AOF保存操作期间写时复制的大小(以字节为单位)
aof_current_size:115                #AOF 文件当前的大小
aof_base_size:115                   #最近一次启动或重写时的AOF文件大小
aof_pending_rewrite:0               #记录了是否有 AOF 重写操作在等待 RDB 文件创建完毕之后执行
aof_buffer_length:0                 #AOF缓冲区的大小
aof_rewrite_buffer_length:0         #AOF 重写缓冲区的大小
aof_pending_bio_fsync:0             #后台 I/O 队列里面,等待执行的 fsync 数量
aof_delayed_fsync:0                 #被延迟的 fsync 调用数量,如果该值比较大,可以开启参数:no-appendfsync-on-rewrite=yes
 
如果正在进行加载操作,会有以下状态:
loading_start_time:                #加载操作开始的时间戳
loading_total_bytes:               #加载文件总大小
loading_loaded_bytes:              #已加载的字节数
loading_loaded_perc:               #已加载的百分比
loading_eta_seconds:               #完成加载所需的秒数(以秒为单位)
 
注意:
changes_since_last_save是指自上次调用SAVE或BGSAVE以来在数据集中产生某种更改的操作数。
 
 
# Stats
total_connections_received:11046    #服务器接受的连接总数
total_commands_processed:2086515    #服务器已执行的命令数量
instantaneous_ops_per_sec:0         #服务器每秒钟执行的命令数量
total_net_input_bytes:116217212     #启动以来,流入的字节总数
total_net_output_bytes:161658834    #启动以来,流出的字节总数
instantaneous_input_kbps:0.02       #接收输入的速率(每秒)
instantaneous_output_kbps:0.00      #输出的速率(每秒)
rejected_connections:0              #由于maxclients限制而被拒绝的连接数
sync_full:1                         #与slave full sync的次数      
sync_partial_ok:14                  #接受的部分重新同步(psync)请求的数量
sync_partial_err:1                  #被拒绝的部分重新同步(psync)请求的数量
expired_keys:0                      #key过期事件总数
expired_stale_perc:0.00             #过期的比率
expired_time_cap_reached_count:0    #过期计数
evicted_keys:0                      #由于最大内存限制而被驱逐的key数量
keyspace_hits:1057312               #key命中次数
keyspace_misses:38734               #key未命中次数
pubsub_channels:0                   #发布/订阅频道的数量
pubsub_patterns:0                   #发布/订阅的模式数量
latest_fork_usec:1460               #最近一次 fork() 操作耗费的毫秒数(以微秒为单位)
migrate_cached_sockets:0            #为迁移而打开的套接字数
slave_expires_tracked_keys:0        #跟踪过期key数量(仅适用于可写从)
active_defrag_hits:0                #活跃碎片执行的值重新分配的数量
active_defrag_misses:0              #活跃碎片执行的中止值重新分配的数量
active_defrag_key_hits:0            #活跃碎片整理的key数
active_defrag_key_misses:0          #活跃碎片整理过程跳过的key数
 
 
# Replication
role:master                         #角色(master、slave),一个从服务器也可能是另一个服务器的主服务器
connected_slaves:1                  #连接slave实例的个数
slave0:ip=192.168.163.132,port=6382,state=online,offset=64547142,lag=1 #连接的slave的信息
master_replid:1726c598c37f039c4b69db7a4281392a650eb88b                 #服务器的复制ID
master_replid2:0000000000000000000000000000000000000000                #第二服务器复制ID,用于故障转移后的PSYNC,用于集群等高可用之后主从节点的互换
master_repl_offset:64547142                                            #复制偏移量1
second_repl_offset:-1                                                  #第二服务器复制偏移量2
repl_backlog_active:1                                                  #复制缓冲区状态
repl_backlog_size:1048576                                              #复制缓冲区的大小(以字节为单位)
repl_backlog_first_byte_offset:63498567                                #复制缓冲区的偏移量,标识当前缓冲区可用范围
repl_backlog_histlen:1048576                                           #复制缓冲区中数据的大小(以字节为单位)
 
#如果是从节点,会有以下状态:
master_host:192.168.163.132                                      #Master IP
master_port:6379                                                 #Master Port
master_link_status:up                                            #Master的连接状态(up/down)
master_last_io_seconds_ago:8                                     #最近一次主从交互之后的秒数
master_sync_in_progress:0                                        #表示从服务器是否一直在与主服务器进行同步
slave_repl_offset:64547142                                       #复制偏移量
slave_priority:100                                               #从服务器的优先级
slave_read_only:1                                                #从服务是否只读
 
#如果正在进行SYNC操作,会有以下状态:
master_sync_left_bytes:                                          #同步完成前剩余的字节数
master_sync_last_io_seconds_ago:                                 #自SYNC操作以来最后一次传输I/O经过的秒数
 
#如果主服务器和副本服务器之间的链接断开,会有以下状态:
master_link_down_since_seconds:                                  #主从连接断开后经过的秒数
connected_slaves:                                                #已连从的数量
 
#如果服务器配置(的Redis 5)有min-slaves-to-write(或以min-replicas-to-write)指令,会有以下状态:
min_slaves_good_slaves:                                          #当前认为良好的副本数,对于每个副本,添加以下行:
slaveXXX: id, IP address, port, state, offset, lag      
 
 
# CPU
used_cpu_sys:133.908000                                          #消耗的系统CPU
used_cpu_user:70.692000                                          #消耗的用户CPU
used_cpu_sys_children:0.016000                                   #后台进程占用的系统CPU
used_cpu_user_children:0.044000                                  #后台进程占用的用户CPU
 
 
# Commandstats   #提供基于命令类型的统计信息,包括调用次数,这些命令消耗的总CPU时间以及每个命令执行消耗的平均CPU时间。
cmdstat_cluster:calls=33169,usec=3835426,usec_per_call=115.63
cmdstat_keys:calls=3,usec=7828,usec_per_call=2609.33
cmdstat_get:calls=1096046,usec=914358,usec_per_call=0.83
cmdstat_set:calls=872138,usec=984030,usec_per_call=1.13
cmdstat_monitor:calls=6,usec=4,usec_per_call=0.67
cmdstat_replconf:calls=74181,usec=103173,usec_per_call=1.3
cmdstat_client:calls=11,usec=2812,usec_per_call=255.64
cmdstat_flushdb:calls=2,usec=23058,usec_per_call=11529.00
cmdstat_dbsize:calls=22,usec=27,usec_per_call=1.23
cmdstat_auth:calls=10883,usec=19716,usec_per_call=1.81
cmdstat_info:calls=14,usec=6987,usec_per_call=499.07
cmdstat_config:calls=9,usec=5819,usec_per_call=646.56
cmdstat_psync:calls=15,usec=4288,usec_per_call=285.87
cmdstat_command:calls=16,usec=98434,usec_per_call=6152.12
 
# Cluster
cluster_enabled:1                              #是否开启集群模式
 
# Keyspace   #键空间部分提供有关每个数据库的统计信息。 统计信息是键的数量,以及带有到期时间的键的数量。
db0:keys=2,expires=0,avg_ttl=0
相关推荐
0xDevNull13 分钟前
Linux 中 Nginx 代理 Redis 的详细教程
redis·后端
倒霉蛋小马36 分钟前
【Redis】什么是缓存穿透?
缓存
RuoyiOffice37 分钟前
SpringBoot+Vue3 企业考勤如何处理法定假期?节假日方案、调休补班与工作日判断链路拆解
spring boot·后端·vue·anti-design-vue·ruoyioffice·假期·人力
xmjd msup1 小时前
spring security 超详细使用教程(接入springboot、前后端分离)
java·spring boot·spring
952361 小时前
SpringBoot统一功能处理
java·spring boot·后端
MiNG MENS1 小时前
nginx 代理 redis
运维·redis·nginx
rleS IONS2 小时前
SpringBoot中自定义Starter
java·spring boot·后端
TeDi TIVE3 小时前
springboot和springframework版本依赖关系
java·spring boot·后端
二哈赛车手3 小时前
新人笔记---ES和kibana启动问题以及一些常用的linux的错误排查方法,以及ES,数据库泄密解决方案[超详细]
java·linux·数据库·spring boot·笔记·elasticsearch
千月落4 小时前
Redis数据迁移
数据库·redis·缓存