1.哪些数据适合放入缓存
即时性,数据一致性要求不高的
访问量大且更新频率不高的数据(读多,写少)
距离:物流信息,并不是每走一米就要更新一次
2.本地缓存的问题
Map<> catche=new Map<>();
第二次想拿数据的时候负载均衡到了第二个微服务,这样就拿不到缓存了
而且如果修改了数据,会产生数据一致性的问题,本地缓存在分布式系统下是不可靠的
3.项目整合redis测试
product项目引入依赖
<!--redis依赖--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency>
yml文件
使用配置好的StringRedistemplate-》可以在RedisAutoConfiguration里查看配置形象
基本就用前五个就够了 Zset是带排序的集合
测试
4.将redis加入业务逻辑
@Override public Map<String, List<Catalog2Vo>> getCatelogJson() { String catalogJson = stringRedistemplate.opsForValue().get("catalogJson"); //如果缓存中没有 if(StringUtils.isEmpty(catalogJson)){ //查询数据库 Map<String, List<Catalog2Vo>> db = this.getCatelogJsonFromDB(); //查到的数据放入缓存 //缓存中存的所有对象都应该是json字符串,因为他是跨语言跨平台的兼容的--序列化过程 String s = JSON.toJSONString(db); stringRedistemplate.opsForValue().set("catalogJson",s); return db;//直接把数据库查到的东西返回 } //反序列化得到map TypeReference<Map<String, List<Catalog2Vo>>> typeReference = new TypeReference<Map<String, List<Catalog2Vo>>>() { }; Map<String, List<Catalog2Vo>> stringListMap = JSON.parSEObject(catalogJson, typeReference); return stringListMap; }
压力测试吞吐量达到了1200+
压力测试内存泄漏问题--新版本springboot好像解决了,我并没有遇到这个问题
堆外内存溢出异常:OutOfDirectMemoryError
原因:springboot2.0以后默认使用lettuce作为操作redis的客户端,他使用netty进行网络通信,这其实是lettuce操作netty产生的bug
netty如果没有指定堆外内存,会使用-Xmx100m指定的内存,可以通过-dio.netty.maxDirectMemory调大堆外内存,但是只是延后而已
真正的解决方案:
1.升级lettuce客户端
在springboot的依赖下排除io.lettuce.lettuce-core包,增加redis.clients.jedis依赖
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。