缓存管理模式,监控和内存回收策略( 二 )


方案二说明:

  • 提供一个数据库Binlog订阅服务,并解析修改日志;
  • 服务获取修改数据,并向Redis服务发送消息;
  • Redis数据进行修改,类似MySQL的主从同步机制;
分析:系统架构层面多出一个服务,且需要解析MySQL日志,操作难度较大,但流程上更为合理 。
总结描述
分布式架构中,缓存层面的基本需求就是提高响应速度,不断优化,追求数据库和Redis缓存的数据快速一致性,从提供的各种方案中都可以看出,这也在增加缓存层面处理的复杂性,架构逻辑复杂,就容易导致程序错误,所以针对业务选择合理的处理逻辑,这点很关键 。
三、缓存监控1、Redis服务监控通过info命令查看Redis服务的参数信息,可以通过传参查看指定分类配置 。通过config..set设置具体配置参数 。例如:
@Overridepublic Properties info(String var) {if (StringUtils.isEmpty(var)){return redisTemplate.getRequiredConnectionFactory().getConnection().info();}return redisTemplate.getRequiredConnectionFactory().getConnection().info(var);}传参说明:
  • memory:内存消耗相关信息
  • server:有关Redis服务器的常规信息
  • clients:客户端连接部分
  • stats:一般统计
  • cpu:CPU消耗统计信息
应用案例:
@RestControllerpublic class MonitorController {@Resourceprivate RedisService redisService ;private static final String[] monitorParam = new String[]{"memory","server","clients","stats","cpu"} ;@GetMapping("/monitor")public List<MonitorEntity> monitor (){List<MonitorEntity> monitorEntityList = new ArrayList<>() ;for (String param:monitorParam){Properties properties = redisService.info(param) ;MonitorEntity monitorEntity = new MonitorEntity () ;monitorEntity.setMonitorParam(param);monitorEntity.setProperties(properties);monitorEntityList.add(monitorEntity);}return monitorEntityList ;}}通过上述参数组合,把Redis相关配置参数打印出来,然后可视化输出,俨然一副高端的感觉 。
配置参数说明:
这里只对两个参数说明一下,计算命中率的关键信息:
  • keyspace_misses:查找缓存Key失败的次数;
  • keyspace_hits:查找缓存Key命中的次数;
公式:命中率=命中次数/(hits+misses)查找总次数 。
2、LRU算法说明Redis的数据是放在内存中的,所以速度快,自然也就受到内存大小的限制,如果内存使用超过配置,Redis有不同的回收处理策略 。
内存模块参数:maxmemory_policy
  • noenviction:不回收数据,查询直接返回错误,但可以执行删除;
  • allkeys-lru:从所有的数据中挑选最近最少使用的数据淘汰;
  • volatile-lru:已设置过期时间的数据中挑选最近最少使用的数据淘汰;
  • allkeys-random:从所有数据中任意选择数据淘汰;
  • volatile-random:从已设置过期时间的数据中任意选择数据淘汰;
  • volatile-ttl:从已设置过期时间的数据中挑选将要过期的数据淘汰;
大部分情况下,业务都是希望最热点数据可以被缓存,所以相对使用allkeys-lru策略偏多 。这里要根据业务模式特点衡量 。

【缓存管理模式,监控和内存回收策略】


推荐阅读