SpringBoot整合Redis

安装Redis

网上安装Redis的教程很多,这里就不在赘述了,可参考:Redis安装

创建一个SpringBoot项目

这里用IDEA编辑器在这里插入图片描述在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在pom.xml文件中引入Redis依赖

<!-- spring boot redis Redis弹簧启动 -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<!-- Redis连接池 -->
<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-pool2</artifactId>
</dependency>

Spring Boot框架中已经集成了redis,在1.x.x的版本中默认使用jedis客户端,而在2.x.x版本中默认使用的lettuce客户端。

两种客户端的区别如下:

  • Jedis和Lettuce都是Redis Client
  • Jedis 是直连模式,在多个线程间共享一个 Jedis 实例时是线程不安全的,
  • 如果想要在多线程环境下使用 Jedis,需要使用连接池,
  • 每个线程都去拿自己的 Jedis 实例,当连接数量增多时,物理连接成本就较高了。
  • Lettuce的连接是基于Netty的,连接实例可以在多个线程间共享,
  • 所以,一个多线程的应用可以使用同一个连接实例,而不用担心并发线程的数量。
  • 当然这个也是可伸缩的设计,一个连接实例不够的情况也可以按需增加连接实例。
  • 通过异步的方式可以让我们更好的利用系统资源,而不用浪费线程等待网络或磁盘I/O。
  • Lettuce 是基于 netty 的,netty 是一个多线程、事件驱动的 I/O 框架,
  • 所以 Lettuce 可以帮助我们充分利用异步的优势。

我的项目是使用的是Spring Boot 2.3.4.RELEASE,所以采用lettuce来进行配置。

添加配置

1、修改application.properties文件名为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

2、.添加一个Redis配置类,使用@EnableCaching注解来开启缓存。
RedisConfig.java

package com.example.lzmvlog.config;

import org.springframework.cache.annotation.CachingConfigurerSupport;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.cache.interceptor.KeyGenerator;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.stereotype.Component;

import java.lang.reflect.Method;

@Configuration
@EnableCaching
public class RedisConfig extends CachingConfigurerSupport {
    @Bean
    public KeyGenerator keyGenerator() {
        return new KeyGenerator() {
            @Override
            public Object generate(Object target, Method method, Object... params) {
                StringBuilder sb = new StringBuilder();
                sb.append(target.getClass().getName());
                sb.append(method.getName());
                for (Object obj : params) {
                    sb.append(obj.toString());
                }
                return sb.toString();
            }
        };
    }
}

编写业务逻辑

1、编写一个简单的用户实体类,包含用户名和密码。
User.java

public class User implements Serializable {

    private static final long serialVersionUID = 1L;
    
    private String username;
    private String password;
    
    public User(String username, String password) {
        this.username = username;
        this.password = password;
    }
    
    public String getUsername() {
        return username;
    }
    public void setUsername(String username) {
        this.username = username;
    }
    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }
    
    @Override
    public String toString() {
        return "{username:" + getUsername() + ", password:" +getPassword() + "}";
    }
}

2、编写一个业务控制器,分别编写测试字符串和对象的存取接口,另外还通过@Cacheable(value=“user-key”)注解给方法开启缓存,这样就可以缓存方法返回的结果,只有当缓存不存在的时候采用执行方法返回新的用户对象。
RedisControll.java

package com.example.lzmvlog.controller;

import com.example.lzmvlog.entity.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.data.redis.core.ValueOperations;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.sql.SQLOutput;
import java.util.concurrent.TimeUnit;

@RestController
@RequestMapping("/re")
public class RedisController {
    @Autowired
    private StringRedisTemplate stringRedisTemplate;

    @Autowired
    private RedisTemplate redisTemplate;

    @GetMapping("/testString")
    public String testString(String name){
        stringRedisTemplate.opsForValue().set("l_name", name);
        String l_name = stringRedisTemplate.opsForValue().get("l_name");
        return "the value of key 'l_name' is :" + l_name;
    }

    @GetMapping("/testObject")
    public String testObject(){
        StringBuilder result = new StringBuilder();
        User user = new User();
        user.setUsername("kebi");
        user.setPassword("123456");

        ValueOperations<String, User> operations = redisTemplate.opsForValue();
        operations.set("sys.user", user);
        operations.set("sys.user.timeout", user, 1, TimeUnit.SECONDS);  // 设置一秒后过时
        result.append("过期前:").append("\n");
        result.append("sys.user=" + operations.get("sys.user") ).append("\n");
        result.append("sys.user.timeout=" + operations.get("sys.user.timeout"));

        try {
            Thread.sleep(1000);
        }catch (InterruptedException e) {
            e.printStackTrace();
        }

        result.append("\n").append("过期后:").append("\n");
        result.append("sys.user=" + operations.get("sys.user")).append("\n");
        result.append("sys.user.timeout=" + operations.get("sys.user.timeout"));

        return result.toString();
    }

    @GetMapping("/getUser")
    @Cacheable(value = "user-key")
    public User getUser(){
        User user = new User();
        user.setUsername("kebi");
        user.setPassword("123456");
        System.out.println("缓存不存在,返回一个新对象");
        return user;
    }
}

测试

1、启动项目,调用testString接口,
URL:http://localhost:8081/re/testString?name=kebi
注:这里我改了服务的端口号,默认是8080
在这里插入图片描述
2、调用testObject接口,如果能出现如下图所示结果就说明成功了。
在这里插入图片描述
3、调用getUser接口,此时因为是第一次调用此方法,所以没有key值为“user-key”的缓存,所以会执行方法并将返回结果进行缓存。在执行getUser方法的时候控制台输出了我们添加的提示信息如下。

缓存不存在,返回一个新对象

然后再次调用getUser接口,发现getUser没有再次被执行,控制台也没有输出上一步的提示信息,那是因为在方法调用之前,应用从key值为“user-key”的缓存中获取成功,所以并不需要继续执行getUser方法的内容了。

参考资料

官方网站
菜鸟教程

相关导航

SpringBoot整合SSM教程
通俗易懂的正则表达式入门及应用
javaScript中操作数组的高阶方法filter、map、reduce及for循环三种遍历形式

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
文件(E)编辑(E) 视图(M) 导航(N) 代码(C) 重构(R) 构建(B) 运行(山) 工具(I) Git(G) 窗口W) 帮助(H) 瑞 吉外卖[D:\瑞吉外卖] - applicationyml [untitled] 吊截图工具 里▼人L临Application▼>在CC▼■|Git(G);kV入+0。 吊新建(N) 模式M)▼C 3延迟(D) ▼X取消(Q) 瑞吉外卖〉 untitled ) src ) main ) resources ) 6 application.yml 项目 朵王云交-Cotoller.java X C SetmealContoller.java ShopingCarContollerjava xe UserConrtollerjava xm pom.xml (ntited)使用’模式'按钮选择截图模式,或单击新建’按钮。 java spring: 截图工具正在移动.. 口com D itheima application: 在将来的更新中,截图工具将移到新的家。尝试改进的功 v D common #设置开发当前应用的名称 使用截图和草图(&S)(或尝试快捷方式Windows徽标键 9 BaseCantext name: reggie_ _take_ out Shift + S)像往常一样进行截图。 P CustomException 。GlobalExceptionHandler datasource: #设置数据源以及连接配置 试用”截图和草图” 。JacksonObjectMapper druid: MyMetaObjecthandler driver- cLass-name: com . mysqL. cj. jdbc . Driver b config 1 urL: jdbc:mysqL://locaLhost:3306/ ruiji?serverTimezone=Asia/ Shanghai&useUnicode=true&characterEncoding=utf MybatisPlusConfig username: root RedisConfig 3 password: jqL1*9700 O WebMvcConfig 4 redis: v D controller C AddresBookController 5 host: 192. 168.200.129 #ip CategoryController 6 port: 6379 #端口 CommonController 9 DishController 17 password: root@123456 #密码 没设密码的话不用写 ◎EmployeeController 8 database: 0 #连接数 ◎OrderController 9 OrderDetailController 9 SetmealController 0 mybatis -pLus: 9 ShoppingCartController 21 configuration: 9 UserController 2 #在映射实体或者属性时,将数据库中表名和字段名中的下划线去掉,按照驼峰命名法映射 ,. entity map-underscore-to- camel-case: true #设置为truel时t:可以用驼峰命名法->->->数据库 表名为xaddress_ book ,那么实 9 AddressBook 4 Log- impL: org. apache . ibatis . Logging. stdout. Stdout ImpL #控制台打印sqL日志 Category 25 gLobaL-config: Dish 。DishFlavor 26 db-config: Employee 7 id-type: ASSIGN_ ID #配置 主键生成策略 OrderDetail Document1/1 ) spring: 》 redis: , password: ) root@ 123456 a Arderc pGit>运行三TODO0问题CProfiler之Dependencies2终端八端点人构建.Spring a事件日志 构建大014三小tceth二中11八幼之的 17.00.cnirutr。,入六坡量110 构建车25 18:28 0n果 O回后x中 2023/3/10
03-13

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值