[Spring Boot 实践] 快速搭建 Redis 缓存中间件

306 阅读3分钟

前言

Hi~ 我是来自西部大嫖客杰西。 这篇文章主要是讲述如何使用 Spring Boot 快速搭建 Redis

说句题外话,这阵子可能会不断地发出一些 Spring Boot 整合各种组建的文章。其实整合的过程其实也是一个困难话,记录下来有利于以后自己能够快速的搭建起来(若不亲手去搭建,其实你可能会意识这是一件很简单的事)。

Redis

简单地介绍一下 Redis。从 Redis 的官网介绍,Redis 是一个高性能/先进/key-value 结构的内存缓存数据库。Redis 的存储数据类型比较丰富,可以是 strings (字符串)/list (列表)/sets (哈希表)/ordered sets (具有顺序的哈希表)。

有一点值得注意的是,Redis 对其所有数据类型的动作都是原子性的(或许你们会想起 64 位计算机环境下,Java 的 double float 数据类型的自增不是原子性的)。而 Spring Boot 提供了对 Redis 良好的配置方式,提供了对存储的底层和高层的抽象,使用户更加易操作。

搭建步骤

  1. 初始项目
  2. 导入依赖
  3. 安装 Redis
  4. application.yml 添加 Redis 配置
  5. 编写封装 Redis 封装类
  6. 编写 controller 层

初始项目

初始化方法我一般用以下两种

  1. 通过 start.spring.io 自定义项目,然后下载/导入。
  2. 通过 IDEA 来新建 Spring Boot 项目。

然后项目目录基本以下

+- java
    +- com.jc.jpa-demo
        +- domain
        +- repository
        +- controller
+- resources
    +- application.yml  

导入依赖

	<!-- web -->
	<dependency>
	        <groupId>org.springframework.boot</groupId>
	        <artifactId>spring-boot-starter-web</artifactId>
	 </dependency>
        <!-- redis -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>
        <!-- lettuce pool -->
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-pool2</artifactId>
        </dependency>

安装 Redis

因为我当前的开发环境为 window,所以会提供一下 window 版本的 Redis 的下载地址

Redis 下载后解压,然后直接点击 redis-server.exe 启动即可。

application.yml 添加 Redis 配置

application.yml 添加以下内容

spring:
  redis:
    database: 0  # Redis数据库索引(默认为0)
    host: localhost # Redis服务器地址
    port: 6379  # Redis服务器连接端口
    password:   # Redis服务器连接密码(默认为空)
    lettuce:
      pool:
       max-active: 8  # 连接池最大连接数(使用负值表示没有限制) 默认 8
       max-wait: -1   # 连接池最大阻塞等待时间(使用负值表示没有限制) 默认 -1
       max-idle: 8    # 连接池中的最大空闲连接 默认 8
       min-idle: 0    # 连接池中的最小空闲连接 默认 0

编写封装 Redis 封装类

编写 Redis 的接口

public interface RedisService {

    void set(String key, String value);

    String get(String key);

    boolean isExpire(String key, long expire);

    void remove(String key);

    Long increment(String key, long delta);
}

编写实现类

/**
 * redis 实现类
 */
@Service
public class RedisServiceImpl implements RedisService {

    @Autowired
    private RedisTemplate redisTemplate;

    @Autowired
    private StringRedisTemplate stringRedisTemplate;

    @Override
    public void set(String key, String value) {
        stringRedisTemplate.opsForValue().set(key, value);
    }

    @Override
    public String get(String key) {
        return stringRedisTemplate.opsForValue().get(key);
    }

    @Override
    public boolean isExpire(String key, long expire) {
        return redisTemplate.expire(key, expire, TimeUnit.SECONDS);
    }

    @Override
    public void remove(String key) {
        stringRedisTemplate.delete(key);
    }

    @Override
    public Long increment(String key, long delta) {
        return stringRedisTemplate.opsForValue().increment(key, delta);
    }
}

编写 service 层

编写 UserService 接口

public interface UserService {

    public String login(String username, String password);

    public String getLoginInfo(String username);
}

编写 UserService 实现

@Service
public class UserServiceImpl implements UserService {

    @Autowired
    private RedisService redisService;

    /** 登录 */
    @Override
    public String login(String username, String password) {

        if (username.equals("admin")) {
            redisService.set(username, password);
            return "success";
        }else {
            return "fail";
        }
    }

    /** 检测 */
    @Override
    public String getLoginInfo(String username) {
        String result = redisService.get(username);
        return result == null ? "没登录" : result;
    }
}

UserServiceImpl 做了以下几个简单的登录业务逻辑:

  1. 通过 login 方法进行登录,如果账号名是 admin,便使用 Redis 继续缓存;反之则不缓存。
  2. 通过 getUserInfo 方法获取用户信息,如果缓存里面有用户信息,就登录成功。

编写 controller 层

编写 controller

@RestController
@RequestMapping("user")
public class UserContorller {

    @Autowired
    private UserService userService;

    @PostMapping("login")
    public String login(@RequestParam String username, @RequestParam String password) {
        return userService.login(username, password);
    }

    @PostMapping("getLoginInfo")
    public String getLoginInfo(@RequestParam String username) {
        return userService.getLoginInfo(username);
    }
}

启动测试

登录

关键字
URL http://localhost:8080/user/login
请求方式 POST
参数(两组) ① username=admin password=admin
② username=zhangsan/ password=zhangsan
结果(两组) ① success
② fail

获取用户信息

关键字
URL http://localhost:8080/user/getLoginInfo
请求方式 POST
参数(两组) ① username=admin
② username=zhangsan
结果(两组) ① admin
② 没登录