SpringBoot注解方式整合Redis缓存,向缓存中添加或者更新数据

1 创建项目,导入依赖

创建SpringBoot项目,创建好后导入后续能够用到的依赖

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--mybatis-plus-->
<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-boot-starter</artifactId>
    <version>3.3.1</version>
</dependency>
<!--mysql-->
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>5.1.46</version>
</dependency>
<!--redis-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<!--lombok神器-->
<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
</dependency>

2 配置相关连接mysql、redis

server.port=8888

# redis连接配置
spring.redis.host=192.168.56.101
spring.redis.port=6379
spring.redis.database= 0
spring.redis.timeout=1800000
# 制定缓存类型为redis
spring.cache.type=redis

# mysql连接配置
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/test01?characterEncoding=utf-8&useSSL=false
spring.datasource.username=root
spring.datasource.password=123456

# binding mapper文件 不配置mapper的位置,项目无法找到对应的类,会报错
mybatis-plus.mapper-locations=classpath:com/example/demotest/mapper/xml/*.xml

3 启动类添加注解

这里的注解都很重要,不要写错或者忘记,会导致项目运行报错

@SpringBootApplication
@EnableCaching // 开启缓存,不开启数据将无法存入redis
@ComponentScan(basePackages = {"com.example"}) //扫描@Service、@Controller、@Repository等组件
@MapperScan(basePackages = "com.example.demotest.mapper") //指定mapper位置
public class DemotestApplication {
    public static void main(String[] args) {
        SpringApplication.run(DemotestApplication.class, args);
    }
}

4 编写pojo、dao、service、controller层组件

4.1 pojo层

为了测试简单,就用了一个实体类User

@Data
@AllArgsConstructor
@NoArgsConstructor
public class User implements Serializable {
    private String name;
    private Integer age;
}

4.2 dao层

因为该示例使用的mybatis-plus,所以直接继承BaseMapper

@Repository
public interface UserMapper extends BaseMapper<User> {

}

对应的mapper文件不能少,否则会报错

注意命名空间namespace路径不要写错

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.demotest.mapper.UserMapper">
</mapper>

4.3 service层

该示例只演示一种添加缓存和更新缓存的方法,其他方式请自行了解…
service接口层

public interface UserService extends IService<User> {
    User findUserByName(String name); //用来添加缓存
    User updateUserByName(String name, Integer age); //用来更新缓存
}

service实现层

1 key的生成策略要一致,否则不会更新缓存,而是添加;
2 以下注解key的生成策略为 user:name [name为传入的实际值],对应redis中的String类型数据,类似key=user:zhangsan value=User[name=‘zhangsan’, age=20];
3 @CachePut的 返回值 要和 @Cacheable 的返回值 一样,如果@Cacheable 返回的是一个对象,@CachePut 返回也要是对象,否则会报类型转换异常,如上代码 返回的都是 User;
4 更新数据时,以同样的key生成策略向redis中插入数据,就会将原来的key中的value覆盖,达到更新效果

@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {

    @Autowired
    private UserMapper userMapper; // 可以不注入,直接使用baseMapper

    @Override
    @Cacheable(cacheNames = "user", key = "#name") 
    public User findUserByName(String name) {
        System.out.println(name); //该处只会打印一次,以后都会走缓存
        QueryWrapper<User> wrapper = new QueryWrapper<>();
        wrapper.eq("name", name);
        return userMapper.selectOne(wrapper);
    }

    @Override
    @CachePut(cacheNames = "user", key = "#name") //这里key的生成策略要与上边保持一致
    public User updateUserByName(String name, Integer age) {
    	//因为没有设置主键,也懒得改了,所以更新时需要先查询
    	System.out.println(name + "===>" + age); //每次更新都打印日志
        QueryWrapper<User> wrapper = new QueryWrapper<>();
        wrapper.eq("name", name);
        User user = userMapper.selectOne(wrapper);
        user.setAge(age);
        userMapper.update(user, wrapper);
        return userMapper.selectOne(wrapper);
    }
}

4.4 controller层

@RestController
public class UserController {

    @Autowired
    private UserService userService;

    @GetMapping("findUserByName/{name}")
    public User findUserByName(@PathVariable("name") String name){
        return userService.findUserByName(name);
    }

    @GetMapping("updateUserByName/{name}/{age}")
    public User updateUserByName(@PathVariable("name") String name,
                    @PathVariable("age") Integer age){
        return userService.updateUserByName(name, age);
    }
}

5 测试

第一次请求 http://localhost:8888/findUserByName/zs 【实现向mysql中插入zs这条数据,此时缓存中存在zs对应的数据】
第二次请求 http://localhost:8888/updateUserByName/zs/50 【将age改为50,此时缓存中zs的年龄也变为50】
以后每次请求 http://localhost:8888/findUserByName/zs 【都是从redis中拿数据】

可以按照以上步骤调试项目,然后自行测试!!!

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值