微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

 

 

 使用配置好的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依赖

 

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐