SpringBoot浅析Redis访问操作使用

作者:Decade0712 时间:2022-09-26 02:09:18 

连接操作redis

Spring Boot中操作redis还是需要使用相关的启动器

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

按照之前的逻辑 我们还是要分析一下这个启动器的自动配置类RedisAutoConfiguration做了什么

@AutoConfiguration
@ConditionalOnClass({RedisOperations.class})
// 将spring.redis开头的配置和redis进行绑定
@EnableConfigurationProperties({RedisProperties.class})
// 引入了两个redis连接客户端,Lettuce(启动器默认使用)和Jedis的连接配置类
@Import({LettuceConnectionConfiguration.class, JedisConnectionConfiguration.class})
public class RedisAutoConfiguration {
   public RedisAutoConfiguration() {
   }
// 注入redisTemplate类,认定key-value都是Object类型
   @Bean
   @ConditionalOnMissingBean(
       name = {"redisTemplate"}
   )
   @ConditionalOnSingleCandidate(RedisConnectionFactory.class)
   public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
       RedisTemplate<Object, Object> template = new RedisTemplate();
       template.setConnectionFactory(redisConnectionFactory);
       return template;
   }
// 注入StringRedisTemplate类,认定key-value都是String类型
   @Bean
   @ConditionalOnMissingBean
   @ConditionalOnSingleCandidate(RedisConnectionFactory.class)
   public StringRedisTemplate stringRedisTemplate(RedisConnectionFactory redisConnectionFactory) {
       return new StringRedisTemplate(redisConnectionFactory);
   }
}

分析完之后,我们就可以通过一个简单的demo,来了解Spring Boot是如何连接操作redis的

首先,我们先设置一下redis客户端的防火墙,要打开6379端口

firewall-cmd --list-port # 查看所有的开放的端口号

firewall-cmd --zone=public --add-port=6379/tcp --permanent #将6379端口加入防火墙

systemctl stop firewalld.service #停止firewall

systemctl start firewalld.service #打开firewall

如果不使用Lettuce连接redis,使用Jedis,我们还需要导入相关依赖

<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
</dependency>

然后在配置文件中配置相关连接参数

spring:
    redis:
      host: 192.168.153.128
      port: 6379
      client-type: jedis
      jedis:
        pool:
          max-active: 10
#     username: 用户名
#     password: 密码

最后测试一下对redis的set和get操作

我们创建一个 * ,将每次请求的访问路径当作key,访问次数当作value放入redis中

package com.decade.interceptor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@Component
public class RedisInterceptor implements HandlerInterceptor {
   @Autowired
   private StringRedisTemplate stringRedisTemplate;
   @Override
   public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
       // 获取请求路径,把它当作key,每请求一次,这个key对应的value就自增1
       final String requestURI = request.getRequestURI();
       stringRedisTemplate.opsForValue().increment(requestURI);
       return true;
   }
}

将这个 * 通过之前的配置类注册到容器中

我们还考虑了一下filter和interceptor的区别

package com.decade.config;
import com.decade.interceptor.LoginInterceptor;
import com.decade.interceptor.RedisInterceptor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@Configuration
public class MyConfig implements WebMvcConfigurer {
/**
    * filter和interceptor的功能类似,这两者的区别在哪?
    * filter:它是servlet定义的原生组件,脱离了spring也可以使用
    * interceptor:它是spring定义的接口,可以使用spring的自动装配等功能
    */
   @Autowired
   private RedisInterceptor redisInterceptor;
   @Override
   public void addInterceptors(InterceptorRegistry registry) {
       // addPathPatterns:设置要拦截的请求,如果是/**,那么会拦截包括静态资源在内的所有请求
       // excludePathPatterns:设置不被拦截的请求,这里我们放行登录页请求和静态资源
       registry.addInterceptor(new LoginInterceptor())
           .addPathPatterns("/**")
           .excludePathPatterns("/", "/login", "/css/**", "/images/**", "/js/**", "/fonts/**");
       // 这里不能使用new来实例化,因为RedisInterceptor中使用了@Autowired注解,自己new的对象没被spring管理,所以它不会自动进行依赖注入,所以这里应该从容器中拿
       registry.addInterceptor(redisInterceptor)
           .addPathPatterns("/**")
           .excludePathPatterns("/", "/login", "/css/**", "/images/**", "/js/**", "/fonts/**");
   }

最后,在首页相关的接口中获取访问次数,并打印出来

package com.decade.controller;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.data.redis.core.ValueOperations;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import javax.servlet.http.HttpSession;
@Controller
@Slf4j
public class IndexController {
   @Autowired
   private StringRedisTemplate stringRedisTemplate;
   /**
    * 去main页面
    * @return 跳转主页面
    */
   @GetMapping("/main.html")
   public String mainPage(HttpSession session,Model model){
       final ValueOperations opsForValue = stringRedisTemplate.opsForValue();
       final Object visitTimes = opsForValue.get("/main.html");
       log.info("访问首页次数为:{}", visitTimes);
       return "main";
   }
}

访问几次首页之后,后端打印结果如下

SpringBoot浅析Redis访问操作使用

redis客户端查询结果如下

SpringBoot浅析Redis访问操作使用

注意:如果出现报错如下报错

org.springframework.dao.InvalidDataAccessApiUsageException: 
DENIED Redis is running in protected mode because protected mode is enabled and no password is set for the default user...

这就说明,redis处于保护模式,这是默认开启的,报错信息中会提供好几种解决方式

因为博主虚拟机上的redis只有自己使用,所以选择了比较省事的一种,那就是关掉保护模式

在redis.conf中搜索protected-mode,将后面的值设置为no即可

SpringBoot浅析Redis访问操作使用

来源:https://blog.csdn.net/Decade0712/article/details/127479029

标签:SpringBoot,Redis,访问
0
投稿

猜你喜欢

  • Spring Boot项目如何同时支持HTTP和HTTPS协议的实现

    2023-11-19 19:57:05
  • Spring中集成Groovy的四种方式(小结)

    2023-07-11 16:36:53
  • Java实现蓝桥杯G将军的示例代码

    2022-05-01 08:44:58
  • C#使用Matrix执行缩放的方法

    2022-05-03 15:46:58
  • Flutter自定义圆盘取色器

    2023-07-05 23:55:43
  • 通过实例解析传统jar包引用方式

    2022-08-01 05:14:06
  • SpringMVC深入讲解文件的上传下载实现

    2022-04-21 09:01:51
  • SpringDataMongoDB多文档事务的实现

    2023-11-25 06:37:55
  • java获取和设置系统变量问题(环境变量)

    2023-11-19 07:34:07
  • 详解Java单元测试之JUnit篇

    2023-06-12 16:42:13
  • springboot使用之多个filter的执行顺序以及配置方式

    2023-11-09 09:30:59
  • SpringCloud微服务架构实战之微服务治理功能的实现

    2023-07-20 09:06:38
  • C#中实现Json序列化与反序列化的几种方式

    2021-11-06 01:31:07
  • java集合迭代器Iterator中的remove陷阱

    2022-06-17 16:11:54
  • Spring Boot 2.0.0 终于正式发布-重大修订版本

    2021-08-12 08:25:51
  • Android Flutter使用本地数据库编写备忘录应用

    2023-09-15 17:24:09
  • java 实现文件复制和格式更改的实例

    2023-10-21 08:07:49
  • Spring Boot假死诊断实战记录

    2022-02-11 17:03:38
  • IntelliJ Idea常用11款插件(提高开发效率)

    2022-08-31 14:08:23
  • Java矩阵连乘问题(动态规划)算法实例分析

    2022-05-04 21:50:54
  • asp之家 软件编程 m.aspxhome.com