2022全新版-Java分布式架构设计与开发实战

156 阅读2分钟

链接: pan.baidu.com/s/1d6YONkCi… 提取码: iamh

作者-\/ 307570512

Java分布式架构开发实战 - Redis集成到Spring

在工作中,我们用到分布式缓存的时候,第一选择就是Redis,今天介绍一下SpringBoot如何集成Redis的,分别使用Jedis和Spring-data-redis两种方式。【有课:itspcool】

一、使用Jedis方式集成 1、增加依赖

<!-- spring-boot-starter-web不是必须的,这里是为了测试-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <optional>true</optional>
</dependency>
<dependency>
    <groupId>redis.clients</groupId>
    <artifactId>jedis</artifactId>
</dependency>
<dependency>
<!-- fastjson不是必须的,这里是为了测试-->
    <groupId>com.alibaba</groupId>
    <artifactId>fastjson</artifactId>
    <version>1.2.73</version>
</dependency>

2、配置项

redis.host=localhost
redis.maxTotal=5
redis.maxIdle=5
redis.testOnBorrow=true
#以下方式也可以,SpringBoot同样能将其解析注入到JedisPoolConfig中
#redis.max-total=3
#redis.max-idle=3
#redis.test-on-borrow=true
3、配置连接池
/**
 * @author 公-众-号:程序员阿牛
 * 由于Jedis实例本身不非线程安全的,因此我们用JedisPool
 */
@Configuration
public class CommonConfig {
    @Bean
    @ConfigurationProperties("redis")
    public JedisPoolConfig jedisPoolConfig() {
        return new JedisPoolConfig();
    }

    @Bean(destroyMethod = "close")
    public JedisPool jedisPool(@Value("${redis.host}") String host) {
        return new JedisPool(jedisPoolConfig(), host);
    }
}
4、测试
/**
 * @author 公-众-号:程序员阿牛
 */
@RestController
public class JedisController {
    @Autowired
    private JedisPool jedisPool;

    @RequestMapping("getUser")
    public String getUserFromRedis(){
        UserInfo userInfo = new UserInfo();
        userInfo.setUserId("A0001");
        userInfo.setUserName("张三丰");
        userInfo.setAddress("武当山");
        jedisPool.getResource().set("userInfo", JSON.toJSONString(userInfo));
        UserInfo userInfo1 = JSON.parseObject(jedisPool.getResource().get("userInfo"),UserInfo.class);
        return userInfo1.toString();
    }
}

Java分布式架构设计

编写单一用途的无状态函数 作为软件工程师,我们在设计函数时应该尽量着眼于单一职责原则。单单处理某一项任务的函数更容易测试、运行更稳定,而且带来的错误和意外的副作用比较少。以一种松散编排的方式将函数和服务组合起来,我们照样能构建易于理解、易于管理的复杂后端系统。拥有明确定义的接口的细粒度函数也更有可能在无服务器架构里面被重复使用。

为Lambda等计算服务编写的代码应该以无状态方式来构建。它不得假设本地资源或进程会在当前的会话之后保存下去。无状态性功能很强大,因为它让平台得以迅速扩展,以处理数量不断变化的入站事件或请求。

设计基于推送的、事件驱动的管道 可以构建满足任何用途的无服务器架构。系统可以一开始就构建成无服务器,也可以逐步重新设计现有的整体单一式应用程序,以便充分发挥这种架构的优势。最灵活、最强大的无服务器设计是事件驱动型的。

构建事件驱动的、基于推送的系统常常有望降低成本和复杂性(我们不需要运行额外代码来轮询变更),可能让整个用户体验更流畅。不言而喻,虽然事件驱动的、基于推送的模式是个美好的目标,但它们并非在所有情况下都是适当的或可以实现的。有时候,我们不得不实施一个Lambda函数来轮询事件源或按时间表运行。