SpringBoot整合Redis

哈喽,大家好,我是花臂,今天给大家讲一下springboot整合redis的各种用法。

redis存储对象的两种方式

json存储对象

创建springboot工程加入依赖

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
            <version>2.1.3.RELEASE</version>
        </dependency>
        <dependency>
@Data
public class User{
 private Integer id;
 private String name;
 private Integer age;
@RestController
public class RedisUtilsController {

 @Autowired
 private StringRedisTemplate stringRedisTemplate;

 @RequestMapping("addUser")
 public String addUser(User user) throws JsonProcessingException {
  //将对象转json
  //转json:objectMapper.writeValueAsString
  //转对象:objectMapper.readValue
  ObjectMapper objectMapper = new ObjectMapper();
  String user_json = objectMapper.writeValueAsString(user);
  stringRedisTemplate.opsForValue().set("user", user_json);
  return "存储成功";
 }

 @RequestMapping("getUser")
 public User getUser() throws IOException {
  String user = stringRedisTemplate.opsForValue().get("user");
  ObjectMapper objectMapper = new ObjectMapper();
  User user1 = objectMapper.readValue(user, User.class);
  System.out.println(user1);
  System.out.println(user);
  return user1;

 }



二进制存储对象

@Component
public class RedisTemplateUtils {

 //如果要存储二进制的话,只需要在RedisTemplate后面加上两个类型就可以了自动帮我们完成这个事情,
 //注意:这里不能使用@Autowired,因为如果使用@Autowired的话,类型就是RedisTemplate,但是这里是RedisTemplate<String,Object>,类型不匹配,所以启动会报错找不到
 //所以这里使用@Resource按照名称来装配bean
 @Resource
 private RedisTemplate<String, Object> redisTemplate;

 //存值
 public void setValue(String key, Object value) {
  redisTemplate.opsForValue().set(key, value);

 }

 //取值
 public Object getValue(String key) {
  return redisTemplate.opsForValue().get(key);

 }

二进制存储对象的方式是通过序列化和反序列化来完成的,所以需要实现Serializable接口

@Data
public class User implements Serializable {
 private Integer id;
 private String name;
 private Integer age;
@RestController
public class RedisUtilsController {

 @Autowired
 private RedisTemplateUtils redisTemplateUtils;

 @RequestMapping("addUser")
 public String addUser(User user) throws JsonProcessingException {
  redisTemplateUtils.setValue("user", user);
  return "存储成功";
 }

 @RequestMapping("getUser")
 public User getUser() throws IOException {
  User user = (User) redisTemplateUtils.getValue("user");
  System.out.println(user);
  return user1;

 }



redis缓存数据库数据

说到redis缓存数据库数据该如何来写呢?可能很多人会说第一次先查询数据库然后放到redis里面,然后第二次进来判断进入redis读数据。这种方式是比较繁琐的,所以我们不用这种方式,有更简单的方式,只需要两个注解就搞定,ok,废话不多说,直接上代码。

!建表

CREATE TABLE `user` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) COLLATE utf8_bin DEFAULT NULL,
  `age` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8 COLLATE=utf8_bin;

INSERT INTO `user` VALUES ('1', 'zmq', '20');
INSERT INTO `user` VALUES ('2', 'gls', '23');

!maven依赖

       <!--原依赖不变,加入如下依赖-->
       <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.32</version>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>2.1.0</version>
        </dependency>

!mapper

public interface UserMapper {

 @Select("SELECT * FROM `user`")
 public List<User> USER_LIST();
}

!user

public class User implements Serializable {
 private Integer id;
 private String name;
 private Integer age;

!controller

@RestController
public class RedisUtilsController {

 @RequestMapping("getMysqlUser")
 //设置这个注解之后,第一次会从数据库查询,然后把数据保存到redis中,然后第二次的时候从redis中查询
 //cacheNames:表示key的前缀
 //特别注意:这里的key里面的值必须加上一个单引号,不然会报错
 @Cacheable(cacheNames = "user", key = "'user_all'")
 public List<User> getMysqlUser() {
  List<User> users = userMapper.USER_LIST();
  System.out.println(users);
  return users;

 }

!启动类

@SpringBootApplication
@MapperScan("com.zmq.mapper")
//这个注解是spring的一个注解,当你使用@EnableCaching注解时,会触发一个post processor,这会扫描每一个spring bean,查看是否已经存在注解对应的缓存。如果找到了,就会自动创建一个代理拦截方法调用,使用缓存的bean执行处理。
@EnableCaching
public class Application {
 public static void main(String[] args) {
  SpringApplication.run(Application.class,args);

 }
}

测试

可以看出,注解方式存储,存的也是二进制。


ok,本次教程就到这儿,有什么疑问欢迎下方评论区留言!

评论区



© [2020] · Powered by Typecho · Theme by Morecho
鄂ICP备20005123号