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";
}
}
访问几次首页之后,后端打印结果如下
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即可
来源:https://blog.csdn.net/Decade0712/article/details/127479029
猜你喜欢
- 一般使用过UCWEB-Android版的人都应该对其特殊的menu有一定的印象,把menu做成Tab-Menu(支持分页的Menu),可以容
- java生成json时产生栈溢出错误环境java + hibernate +html本来,java中使用json事件很正常的事,但小心有的地
- BroadcastReceiver(广播 * )是Android中的四大组件之一。下面就具体介绍一下Broadcast Receiver组件
- 工厂方法模式,往往是设计模式初学者入门的模式,的确,有人称之为最为典型最具启发效果的模式。android中用到了太多的工厂类,其中有用工厂方
- IDEA快速创建getter和setter方法找到generate我的是Mac,右击鼠标就可以打开,相信windows也不难。选择gette
- 目录Mybatis简介Mybatis开发步骤:Mybatis的映射文件概述Mybatis的增删改查操作MyBatis的核心配置文件概述MyB
- 在前一期中,我们做了悬浮头部的两个tab切换和下拉刷新效果,后来项目中要求改成三个tab,当时就能估量了一下,如果从之前的改,也不是不可以,
- 前言异步调用几乎是处理高并发,解决性能问题常用的手段,如何开启异步调用?SpringBoot中提供了非常简单的方式,就是一个注解@Async
- 目录推荐教程正文创建-服务端-生成代码创建客户端,生成客户端代码先下载soapUI工具推荐教程idea2021以下最新安装j ihuo 教程
- 本文实例为大家分享了springboot实现基于aop的切面日志的具体代码,供大家参考,具体内容如下通过aop的切面方式实现日志通切面拦截所
- 引言 批量下载思路,首先前端发送下载请求,携带必要参数,
- String类原生的字符串处理方法short s=1;s=s+1;与short s=1;s+=1;的区别一、“+&
- 水平的ListView-HorizontalListView的使用Android中ListView默认的是竖直方向的滑动,由于项目的需求,需
- 本文介绍了JAVA利用HttpClient进行HTTPS接口调用的方法,分享给大家,具体如下:1.为了避免需要证书,所以用一个类继承Defa
- 第一步:配置管理器中新建解决方案配置第二步:定义条件编译符号:第三步:在代码中使用自定义的条件编译#if CustomDebugConsol
- Quick Start在SpringBoot中使用log4j2日志框架,只需三步:引入依赖配置log文件获取Logger实例并输出日志引入依
- 虽然GUI技术没有很大的市场,甚至很多初学者放弃学习GUI,但是学习GUI编程的过程对于提高编程兴趣,深入理解Java编程有很大的作用。效果
- 呼吸按钮是我最早接触到为view添加动画效果的需求,刚刚参加安卓开发工作,要求设计一个好看的语音按钮效果,就有了这个成果,但是后来又改方案了
- IDEA创建一个传统JAVA WEB项目(不使用maven构建)方法一File --> NEW --> Project --&g
- 本文实例讲述了JAVA获取任意http网页源代码。分享给大家供大家参考,具体如下:JAVA获取任意http网页源代码可实现如下功能:1. 获