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客户端
2.切换使用jedis--这是一个老版客户端
在springboot的依赖下排除io.lettuce.lettuce-core包,增加redis.clients.jedis依赖