18.缓存

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文件

18.缓存

 

 

 使用配置好的StringRedisTemplate-》可以在RedisAutoConfiguration里查看配置形象

基本就用前五个就够了 Zset是带排序的集合

18.缓存

 

 

 测试

18.缓存

 

 

 4.将redis加入业务逻辑

18.缓存

@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+

18.缓存

压力测试内存泄漏问题--新版本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依赖

 

18.缓存

上一篇:记一次程序设计及KeyError错误


下一篇:2-2、深入搜索 -基于词项和基于全文的搜索