三. 整合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)); } }
目前数据库中有的信息:
三.四.一 查询全部进行测试 findAllTest
第一次查询
缓存里面没有,从数据库里面
在客户端进行观察
第二次查询
使用的是缓存里面的数据信息。
三.四.二 添加测试 insertTest
三.四.三 查询Id和修改测试
目前是 43 还存在,直接查询Id findByIdTest
进行修改 updateTest
修改成功后,再进行查询 findByIdTest
三.四.四 删除进行测试 deleteTest
Redis 使用缓存的操作成功。