当前位置: 首页 > news >正文

Redis提升并发能力 | 从0开始构建SpringCloud微服务(2)

照例附上项目github链接

本项目实现的是将一个简单的天气预报系统一步一步改造成一个SpringCloud微服务系统的过程,本节将介绍项目中Redis的引入。


Redis下载教程。

若对Redis感兴趣,还可以看一下我的另一篇文章造个轮子 | 自己动手写一个Redis


存在问题:

数据来源于第三方的接口,依赖性太强。
可能带来的不良结果:

(1)延时性:用户访问我们的时候,我们需要再去访问第三方的接口,我们是数据的中间者,不是数据的产生者,有一定的延时性。

(2)访问上限:免费的接口,可能会达到上限。

(3)调死:可能将对方的接口给调死。


解决方案:

使用redis缓存系统,提高整体的并发访问能力。

Redis 是一个高性能的key-value数据库,基于内存的缓存系统,对内存的操作时非常快的,所以可以做到及时响应。


为什么选择Redis

(1)及时响应

(2)减少服务调用



Redis如何引入

Redis是一个key-value结构的数据存储系统,这里我们使用天气数据的uri作为它的key,通过ValueOperations<String, String>ops对象的set方法将数据写入缓存中,通过其get方法可以从缓存中获取数据,并且使用TIME_OUT设置缓存失效的时间。

我们并不是每次都去调用第三方的接口,若Redis缓存中有要查找的天气数据,则从缓存中取;若缓存中没有,则请求第三方接口,然后将数据写入Redis缓存中。

    private WeatherResponse doGetWeahter(String uri) {
        String key = uri;
        String strBody = null;
        ObjectMapper mapper = new ObjectMapper();
        WeatherResponse resp = null;
        ValueOperations<String, String>  ops = stringRedisTemplate.opsForValue();
        // 先查缓存,缓存有的取缓存中的数据
        if (stringRedisTemplate.hasKey(key)) {
            logger.info("Redis has data");
            strBody = ops.get(key);
        } else {
            logger.info("Redis don't has data");
            // 缓存没有,再调用服务接口来获取
             ResponseEntity<String> respString = restTemplate.getForEntity(uri, String.class);

             if (respString.getStatusCodeValue() == 200) {
                strBody = respString.getBody();
            }
            
            // 数据写入缓存
            ops.set(key, strBody, TIME_OUT, TimeUnit.SECONDS);
        }

        try {
            resp = mapper.readValue(strBody, WeatherResponse.class);
        } catch (IOException e) {
            //e.printStackTrace();
            logger.error("Error!",e);
        }
        
        return resp;
    }



相关文章:

  • HTTP 简介
  • 学习正则表达式
  • Go test 命令工作原理
  • 监控Linux系统状态、手动增加swap空间
  • React16时代,该用什么姿势写 React ?
  • 今年的LC3大会没了?
  • 戴姆勒与宝马抱团开发自动驾驶 新旧车企大战在即
  • TableStore多元索路由探微
  • JPress v2.0-rc.4 发布,修复插件安装卸载的若干问题
  • 002_python基础语录
  • redis事务和脚本
  • Spring源码分析(六)SpringAOP实例及标签的解析
  • Nodejs教程11:assert(断言)
  • use Google search engine
  • 【zookeeper源码】启动流程详解
  • 2017 前端面试准备 - 收藏集 - 掘金
  • canvas绘制圆角头像
  • Facebook AccountKit 接入的坑点
  • JavaScript对象详解
  • LeetCode29.两数相除 JavaScript
  • Making An Indicator With Pure CSS
  • Markdown 语法简单说明
  • 从伪并行的 Python 多线程说起
  • 道格拉斯-普克 抽稀算法 附javascript实现
  • 技术发展面试
  • 快速构建spring-cloud+sleuth+rabbit+ zipkin+es+kibana+grafana日志跟踪平台
  • 每天10道Java面试题,跟我走,offer有!
  • 译米田引理
  • - 语言经验 - 《c++的高性能内存管理库tcmalloc和jemalloc》
  • 在electron中实现跨域请求,无需更改服务器端设置
  • 找一份好的前端工作,起点很重要
  • $.type 怎么精确判断对象类型的 --(源码学习2)
  • (9)YOLO-Pose:使用对象关键点相似性损失增强多人姿态估计的增强版YOLO
  • (二)pulsar安装在独立的docker中,python测试
  • (附源码)ssm基于web技术的医务志愿者管理系统 毕业设计 100910
  • (转)Google的Objective-C编码规范
  • (转)setTimeout 和 setInterval 的区别
  • (转)Sql Server 保留几位小数的两种做法
  • .helper勒索病毒的最新威胁:如何恢复您的数据?
  • .NET Framework Client Profile - a Subset of the .NET Framework Redistribution
  • .NET 反射 Reflect
  • .net6Api后台+uniapp导出Excel
  • .net通用权限框架B/S (三)--MODEL层(2)
  • .sh
  • /usr/bin/python: can't decompress data; zlib not available 的异常处理
  • :中兴通讯为何成功
  • @param注解什么意思_9000字,通俗易懂的讲解下Java注解
  • [ Linux ] git工具的基本使用(仓库的构建,提交)
  • [ linux ] linux 命令英文全称及解释
  • []我的函数库
  • [Bada开发]初步入口函数介绍
  • [C#] 基于 yield 语句的迭代器逻辑懒执行
  • [Docker]五.Docker中Dockerfile详解
  • [dts]Device Tree机制
  • [HXPCTF 2021]includer‘s revenge