SpringBoot浅析Redis访问操作使用

 更新时间:2022年11月15日 14:38:46   作者:Decade0712  
Redis是一个速度非常快的非关系数据库(Non-Relational Database),它可以存储键(Key)与多种不同类型的值(Value)之间的映射(Mapping),可以将存储在内存的键值对数据持久化到硬盘,可以使用复制特性来扩展读性能,还可以使用客户端分片来扩展写性能

连接操作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";
    }
}

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

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访问操作使用的文章就介绍到这了,更多相关SpringBoot Redis访问操作内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • jvm虚拟机类加载机制详解

    jvm虚拟机类加载机制详解

    本文主要介绍了 jvm虚拟机类加载机制详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-04-04
  • Java注释代码执行方法解析

    Java注释代码执行方法解析

    这篇文章主要介绍了Java注释代码执行方法解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-05-05
  • nacos在liunx系统中启动成功浏览器却访问不了的解决方法

    nacos在liunx系统中启动成功浏览器却访问不了的解决方法

    在linux下搭建nacos,现在想要启动,访问nacos页面,访问不了,所以本文小编将给大家介绍nacos在liunx系统中启动成功,浏览器却访问不了?全面的解决办法,需要的朋友可以参考下
    2023-09-09
  • 详解Java设计模式编程中的访问者模式

    详解Java设计模式编程中的访问者模式

    这篇文章主要介绍了Java设计模式编程中的访问者模式,访问者模式的合理利用可以避免项目中出现大量重复的代码,需要的朋友可以参考下
    2016-02-02
  • java中rss解析器(rome.jar和jdom.jar)示例

    java中rss解析器(rome.jar和jdom.jar)示例

    这篇文章主要介绍了java中rss解析器(rome.jar和jdom.jar)示例,需要的朋友可以参考下
    2014-03-03
  • Java详解HashMap实现原理和源码分析

    Java详解HashMap实现原理和源码分析

    这篇文章主要介绍了Java关于HashMap的实现原理并进行源码分析,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-09-09
  • Java如何使用httpclient检测url状态及链接是否能打开

    Java如何使用httpclient检测url状态及链接是否能打开

    这篇文章主要介绍了Java如何使用httpclient检测url状态及链接是否能打开,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-09-09
  • Idea 同一窗口导入多个项目的实现步骤

    Idea 同一窗口导入多个项目的实现步骤

    本文主要介绍了Idea 同一窗口导入多个项目的实现步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-07-07
  • Spring Security UserDetails实现原理详解

    Spring Security UserDetails实现原理详解

    这篇文章主要介绍了Spring Security UserDetails实现原理详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-09-09
  • Java编程语言特性和优势

    Java编程语言特性和优势

    这篇文章主要介绍了Java编程语言特性和优势,Java是一门面向对象编程语言,不仅吸收了C++语言的各种优点,还摒弃了C++里难以理解的多继承、指针等概念,同时也增加了垃圾回收机制,释放掉不被使用的内存空间,解决了管理内存空间的烦恼,下面来聊聊Java编程语言特性和优势吧
    2022-01-01

最新评论