Redisson客户端可视化监控Redis服务
前言
Redis是我们目前项目中运用最多和最广的缓存技术.作为表现优异的缓存技术读写性能可以达到10万/秒.将数据读取到内存中,采用单线程不存在加锁资源竞争,非阻塞的io流,所以读取数据非常的快.
往往在项目中,我们需要监控系统服务.本篇文章我们来探讨的是redisson客户端监控redis运行情况.
- Redisson官方网站: https://redisson.org.
- Redisson的github的官方的文档:
https://github.com/redisson/redisson/wiki.
中文地址:
https://github.com/redisson/redisson/wiki/%E7%9B%AE%E5%BD%95. - Redisson基于Netty框架的事件驱动的通信层,其方法调用是异步的.Redisson的API是线程安全的.
- Redisson提供了一系列分布式对象和服务.
- Redisson将hash、list、set、string、Geo和HyperLogLog等原生的Redis数据类型封装成了易于使用的Java数据结构或对象(Map, List, Set, Object Bucket, Geospatial Bucket和HyperLogLog).
- Redisson完美支持各种分布式锁,可重入锁,公平锁,联锁,红锁,读写锁 ,还有CountDownLantch.
- Redisson支持单机模式,主从模式,集群模式,哨兵模式启动运行.
下面开始讲解Redisson作为java客户端的监控方案:
引入Redisson到项目
<!-- redisson -->
2 <dependency>
3 <groupId>org.redisson</groupId>
4 <artifactId>redisson</artifactId>
5 <version>3.5.7</version>
6 </dependency>
redisson基于Java NIO的Netty框架因此引入netty包:
<dependency>
<groupId>io.netty</groupId>
<artifactId>netty-all</artifactId>
<version>5.0.0.Alpha2</version>
</dependency>
编码实现
1:首先获取redis连接:
/**
* 获取redis连接
* @return
*/
private RedisConnection getRedisConnection() {
EventLoopGroup group = new NioEventLoopGroup();
RedisClientConfig config = new RedisClientConfig();
//redis地址
config.setAddress("redis://x.x.x.x:xx");
//redis密码
config.setPassword("xxx");
//redis 库
config.setDatabase(1)
.setClientName("myClient")
.setGroup(group);
RedisClient redisClient = RedisClient.create(config);
return redisClient.connect();
}
2:了解下RedisCommands(redis客户端命令)这个类:
看最下面的一段代码:
RedisStrictCommand<Map<String, String>> INFO_ALL = new RedisStrictCommand<Map<String, String>>("INFO", "ALL", new StringMapDataDecoder());
RedisStrictCommand<Map<String, String>> INFO_DEFAULT = new RedisStrictCommand<Map<String, String>>("INFO", "DEFAULT", new StringMapDataDecoder());
RedisStrictCommand<Map<String, String>> INFO_SERVER = new RedisStrictCommand<Map<String, String>>("INFO", "SERVER", new StringMapDataDecoder());
RedisStrictCommand<Map<String, String>> INFO_CLIENTS = new RedisStrictCommand<Map<String, String>>("INFO", "CLIENTS", new StringMapDataDecoder());
RedisStrictCommand<Map<String, String>> INFO_MEMORY = new RedisStrictCommand<Map<String, String>>("INFO", "MEMORY", new StringMapDataDecoder());
RedisStrictCommand<Map<String, String>> INFO_PERSISTENCE = new RedisStrictCommand<Map<String, String>>("INFO", "PERSISTENCE", new StringMapDataDecoder());
RedisStrictCommand<Map<String, String>> INFO_STATS = new RedisStrictCommand<Map<String, String>>("INFO", "STATS", new StringMapDataDecoder());
RedisStrictCommand<Map<String, String>> INFO_REPLICATION = new RedisStrictCommand<Map<String, String>>("INFO", "REPLICATION", new StringMapDataDecoder());
RedisStrictCommand<Map<String, String>> INFO_CPU = new RedisStrictCommand<Map<String, String>>("INFO", "CPU", new StringMapDataDecoder());
RedisStrictCommand<Map<String, String>> INFO_COMMANDSTATS = new RedisStrictCommand<Map<String, String>>("INFO", "COMMANDSTATS", new StringMapDataDecoder());
RedisStrictCommand<Map<String, String>> INFO_CLUSTER = new RedisStrictCommand<Map<String, String>>("INFO", "CLUSTER", new StringMapDataDecoder());
RedisStrictCommand<Map<String, String>> INFO_KEYSPACE = new RedisStrictCommand<Map<String, String>>("INFO", "KEYSPACE", new StringMapDataDecoder());
对应info 命令查看redis信息:
Server,clients,memory,persistence,stats,replication,cpu,commandstats,cluster,keyspace
3.监控redis服务:
@ApiOperation(value = "获取redis信息")
@GetMapping("/redisInfo/{key}")
public List<RedisInfo> redisInfo(@PathVariable String key){
RedisConnection conn = getRedisConnection();
List<RedisInfo> list = new ArrayList<>();
Map<String,String> redisInfo = new HashMap<>();
switch (key){
case "1":
//memory
redisInfo = conn.sync(StringCodec.INSTANCE, RedisCommands.INFO_MEMORY);
break;
case "2":
//keysize
redisInfo = conn.sync(StringCodec.INSTANCE, RedisCommands.INFO_KEYSPACE);
break;
case "3":
//cpu
redisInfo = conn.sync(StringCodec.INSTANCE, RedisCommands.INFO_CPU);
break;
case "4":
//server
redisInfo = conn.sync(StringCodec.INSTANCE, RedisCommands.INFO_SERVER);
break;
default:
break;
}
redisInfo.forEach((k,v)->{
logger.info("key = " + k+",value = " + v);
RedisInfo info = new RedisInfo(k,v,RedisInfo.map.get(k));
list.add(info);
});
return list;
}
4:redis memory数据获取:
5:redis db size数据获取:
6.redis cpu数据获取:
7.redis server数据获取:
前段页面展示
RedisMemory:
DB size:
RedisCPU:
RedisServer:
总结
redisson 的监控基于netty异步的、事件驱动的网络应用程序.
redisson 监控最终是执行的redis info 命令再将数据组合封装.
本文中的效果图是目前一个运行的后台管理:
YOU-LIAO 后台管理系统
链接: http://132.232.43.102.
guest/guest