SpringBoot整合Redis(十九)下

本文涉及的产品
云原生内存数据库 Tair,内存型 2GB
云数据库 Redis 版,社区版 2GB
推荐场景:
搭建游戏排行榜
云数据库 Redis 版,经济版 1GB 1个月
简介: 三. 整合Redis的业务应用三.一 POJO 实体类三.二 UserMapper 接口和配置三.三 UserService接口和其实现类三.四 缓存测试验证 RedisDBTests

三. 整合Redis的业务应用

添加的时候,放置到缓存里面, 删除的时候,清空缓存,更新的时候,会更新缓存信息。

查询的时候,从缓存里面查询,包括单个id查询和 全部查询。


三.一 POJO 实体类

在 springboot 数据库里面,有一个 user 表。

只有有简单的属性信息

@Data
public class User implements Serializable {
    /**
     * @param id id编号
     * @param name 姓名
     * @param sex 性别
     * @param age 年龄
     * @param description 描述
     */
    private Integer id;
    private String name;
    private String sex;
    private Integer age;
    private String description;
}

三.二 UserMapper 接口和配置

UserMapper.java

public interface UserMapper {
    void addUser(@Param("user") User user);
    void updateUser(@Param("user") User user);
    void deleteById(@Param("id") int id);
    User findById(@Param("id") int id);
    List<User> findAll();
}

UserMapper.xml

<?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="top.yueshushu.learn.mapper.UserMapper">
    <insert id="addUser" useGeneratedKeys="true" keyProperty="user.id">
        insert into user(name,sex,age,description) values(
            #{user.name},#{user.sex},#{user.age},#{user.description}
        )
    </insert>
    <update id="updateUser">
        update user set name=#{user.name,jdbcType=VARCHAR} where id=#{user.id}
    </update>
    <delete id="deleteById">
        delete from user where id=#{id}
    </delete>
    <select id="findById" resultType="top.yueshushu.learn.pojo.User">
        select * from user where id=#{id}
    </select>
    <select id="findAll" resultType="top.yueshushu.learn.pojo.User">
        select * from user
    </select>
</mapper>

三.三 UserService接口和其实现类

UserService.java

public interface UserService {
    void addUser(User user);
    void updateUser(User user);
    void deleteUser(int id);
    User findById(int id);
    List<User> findAll();
}

UserServiceImpl.java

@Service
@Log4j2
public class UserServiceImpl implements UserService {
    @Autowired
    private UserMapper userMapper;
    @Autowired
    private RedisUtil redisUtil;
    private static final String KEY_PRE="user_";
    @Override
    public void addUser(User user) {
        userMapper.addUser(user);
        log.info("将用户编号为{}放置到缓存里面",user.getId());
        //放置单个缓存
        redisUtil.set(KEY_PRE+user.getId(),user);
        //更新全部的缓存信息
        resetAllCache();
    }
    @Override
    public void updateUser(User user) {
        userMapper.updateUser(user);
        log.info("将用户编号为{}更新到缓存里面",user.getId());
        //设置新的缓存
        redisUtil.set(KEY_PRE+user.getId(),user);
        //更新全部的缓存信息
        resetAllCache();
    }
    @Override
    public void deleteUser(int id) {
        userMapper.deleteById(id);
        log.info("将用户编号为{}从缓存中移除",id);
        redisUtil.delByKey(KEY_PRE+id);
        //更新全部的缓存信息
        resetAllCache();
    }
    @Override
    public User findById(int id) {
        log.info("先从缓存中查询用户编号为{} 是否存在",id);
        User user=redisUtil.get(KEY_PRE+id);
        if(user!=null){
            log.info(">>>>>>>>>>使用的是缓存中的数据");
            return user;
        }
        log.info(">>>>>>>>>>>从数据库中查询,并放置到缓存中");
        user= userMapper.findById(id);
        redisUtil.set(KEY_PRE+id,user);
        return user;
    }
    @Override
    public List<User> findAll() {
        log.info("先从缓存中查询用户列表是否存在");
        List<User> userList= (List<User>) redisUtil.range(KEY_PRE+"ALL");
        if(!CollectionUtils.isEmpty(userList)){
            log.info(">>>>>>>>>>使用的是缓存中的数据");
            return userList;
        }
        log.info(">>>>>>>>>>>从数据库中查询,并放置到缓存中");
        userList= userMapper.findAll();
        redisUtil.leftPushAll(KEY_PRE+"ALL",userList);
        return userList;
    }
    //重新全部的缓存信息
    private void resetAllCache() {
        //先删除
        redisUtil.delByKey(KEY_PRE+"ALL");
        //再重新赋值值
       List<User> userList= userMapper.findAll();
        redisUtil.leftPushAll(KEY_PRE+"ALL",userList);
    }
}

添加,修改,删除的时候,都会更新一下缓存的信息。

三.四 缓存测试验证 RedisDBTests

package top.yueshushu.learn;
import lombok.extern.log4j.Log4j2;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import top.yueshushu.learn.pojo.User;
import top.yueshushu.learn.service.UserService;
import java.util.List;
/**
 * @ClassName:RedisDBTests
 * @Description RedisDBTests 测试使用
 * @Author yjl
 * @Date 2021/5/18 17:50
 * @Version 1.0
 **/
@SpringBootTest
@RunWith(SpringJUnit4ClassRunner.class)
@Log4j2
public class RedisDBTests {
    @Autowired
    private UserService userService;
    @Test
    public void insertTest(){
        //1. 构建对象
        User user=new User();
        user.setName("欢欢");
        user.setAge(22);
        user.setSex("女");
        user.setDescription("一个非常可爱的女孩纸");
        //2. 添加方法
        userService.addUser(user);
        log.info("添加成功,{}",user);
        findAllTest();
    }
    @Test
    public void updateTest(){
       User user=userService.findById(43);  //id随时更换
       user.setName("我换新的名字了");
       userService.updateUser(user);
       log.info("修改成功{}",user);
        findAllTest();
    }
    @Test
    public void deleteTest(){
        userService.deleteUser(43); //id随时更换
        log.info("删除成功了");
        findAllTest();
    }
    @Test
    public void findByIdTest(){
        User user=userService.findById(43); //id随时更换
        log.info(user);
    }
    @Test
    public void findAllTest(){
        log.info(">>>>>>>>目前数据库中存在的用户信息:");
        List<User> userList=userService.findAll();
        userList.forEach(n->log.info(n));
    }
}

目前数据库中有的信息:

1.png

三.四.一 查询全部进行测试 findAllTest

第一次查询

2.png

缓存里面没有,从数据库里面

在客户端进行观察

3.png

第二次查询

4.png使用的是缓存里面的数据信息。

三.四.二 添加测试 insertTest

5.png

三.四.三 查询Id和修改测试

目前是 43 还存在,直接查询Id findByIdTest

6.png

进行修改 updateTest

7.png

修改成功后,再进行查询 findByIdTest

8.png

三.四.四 删除进行测试 deleteTest

9.png

Redis 使用缓存的操作成功。

相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore &nbsp; &nbsp; ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库&nbsp;ECS 实例和一台目标数据库&nbsp;RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&amp;RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
7天前
|
存储 NoSQL Java
大事件后端项目34_登录优化----redis_SpringBoot集成redis
大事件后端项目34_登录优化----redis_SpringBoot集成redis
大事件后端项目34_登录优化----redis_SpringBoot集成redis
|
4天前
|
缓存 NoSQL Java
Spring Boot与Redis的缓存一致性问题
Spring Boot与Redis的缓存一致性问题
|
9天前
|
NoSQL Java Redis
java架构之路-(Redis专题)SpringBoot连接Redis超简单
java架构之路-(Redis专题)SpringBoot连接Redis超简单
|
2天前
|
SQL NoSQL 关系型数据库
若依修改02,若以提供了多种版本,RuoYi-Cloud和SpringBoot+Vue都是PC端的,如果想要适配手机端,用Uniapp+vue,导入Mysql和启动Redis
若依修改02,若以提供了多种版本,RuoYi-Cloud和SpringBoot+Vue都是PC端的,如果想要适配手机端,用Uniapp+vue,导入Mysql和启动Redis
|
6天前
|
缓存 NoSQL Java
Spring Boot整合Redis缓存的最佳实践
Spring Boot整合Redis缓存的最佳实践
|
9天前
|
缓存 NoSQL Java
Spring Boot与Redis集成的最佳实践
Spring Boot与Redis集成的最佳实践
|
9天前
|
缓存 NoSQL Java
Spring Boot与Redis的缓存一致性问题
Spring Boot与Redis的缓存一致性问题
|
9天前
|
NoSQL Java Redis
|
9天前
|
缓存 NoSQL Java
Spring Boot整合Redis缓存的最佳实践
Spring Boot整合Redis缓存的最佳实践
|
9天前
|
消息中间件 NoSQL Java
Spring Boot中使用Redis和Lua脚本实现延时队列
Spring Boot中使用Redis和Lua脚本实现延时队列