SpringBoot整合Redis(十九)下

本文涉及的产品
云数据库 Tair(兼容Redis),内存型 2GB
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
简介: 三. 整合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
相关文章
|
4天前
|
NoSQL Java API
springboot项目Redis统计在线用户
通过本文的介绍,您可以在Spring Boot项目中使用Redis实现在线用户统计。通过合理配置Redis和实现用户登录、注销及统计逻辑,您可以高效地管理在线用户。希望本文的详细解释和代码示例能帮助您在实际项目中成功应用这一技术。
10 3
|
6天前
|
消息中间件 NoSQL Java
Spring Boot整合Redis
通过Spring Boot整合Redis,可以显著提升应用的性能和响应速度。在本文中,我们详细介绍了如何配置和使用Redis,包括基本的CRUD操作和具有过期时间的值设置方法。希望本文能帮助你在实际项目中高效地整合和使用Redis。
21 1
|
1月前
|
NoSQL Java Redis
redis的基本命令,并用netty操作redis(不使用springboot或者spring框架)就单纯的用netty搞。
这篇文章介绍了Redis的基本命令,并展示了如何使用Netty框架直接与Redis服务器进行通信,包括设置Netty客户端、编写处理程序以及初始化Channel的完整示例代码。
42 1
redis的基本命令,并用netty操作redis(不使用springboot或者spring框架)就单纯的用netty搞。
|
1月前
|
缓存 NoSQL Java
springboot的缓存和redis缓存,入门级别教程
本文介绍了Spring Boot中的缓存机制,包括使用默认的JVM缓存和集成Redis缓存,以及如何配置和使用缓存来提高应用程序性能。
93 1
springboot的缓存和redis缓存,入门级别教程
|
25天前
|
缓存 NoSQL Java
Spring Boot与Redis:整合与实战
【10月更文挑战第15天】本文介绍了如何在Spring Boot项目中整合Redis,通过一个电商商品推荐系统的案例,详细展示了从添加依赖、配置连接信息到创建配置类的具体步骤。实战部分演示了如何利用Redis缓存提高系统响应速度,减少数据库访问压力,从而提升用户体验。
63 2
|
1月前
|
JSON NoSQL Java
springBoot:jwt&redis&文件操作&常见请求错误代码&参数注解 (九)
该文档涵盖JWT(JSON Web Token)的组成、依赖、工具类创建及拦截器配置,并介绍了Redis的依赖配置与文件操作相关功能,包括文件上传、下载、删除及批量删除的方法。同时,文档还列举了常见的HTTP请求错误代码及其含义,并详细解释了@RequestParam与@PathVariable等参数注解的区别与用法。
|
12天前
|
JavaScript NoSQL Java
CC-ADMIN后台简介一个基于 Spring Boot 2.1.3 、SpringBootMybatis plus、JWT、Shiro、Redis、Vue quasar 的前后端分离的后台管理系统
CC-ADMIN后台简介一个基于 Spring Boot 2.1.3 、SpringBootMybatis plus、JWT、Shiro、Redis、Vue quasar 的前后端分离的后台管理系统
28 0
|
1月前
|
NoSQL Java Redis
shiro学习四:使用springboot整合shiro,正常的企业级后端开发shiro认证鉴权流程。使用redis做token的过滤。md5做密码的加密。
这篇文章介绍了如何使用Spring Boot整合Apache Shiro框架进行后端开发,包括认证和授权流程,并使用Redis存储Token以及MD5加密用户密码。
24 0
shiro学习四:使用springboot整合shiro,正常的企业级后端开发shiro认证鉴权流程。使用redis做token的过滤。md5做密码的加密。
|
1月前
|
缓存 NoSQL Java
Springboot自定义注解+aop实现redis自动清除缓存功能
通过上述步骤,我们不仅实现了一个高度灵活的缓存管理机制,还保证了代码的整洁与可维护性。自定义注解与AOP的结合,让缓存清除逻辑与业务逻辑分离,便于未来的扩展和修改。这种设计模式非常适合需要频繁更新缓存的应用场景,大大提高了开发效率和系统的响应速度。
53 2
|
1月前
|
存储 NoSQL Java
Spring Boot项目中使用Redis实现接口幂等性的方案
通过上述方法,可以有效地在Spring Boot项目中利用Redis实现接口幂等性,既保证了接口操作的安全性,又提高了系统的可靠性。
35 0