SpringBoot淺析Redis訪問(wèn)操作使用
連接操作redis
Spring Boot中操作redis還是需要使用相關(guān)的啟動(dòng)器
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency>
按照之前的邏輯 我們還是要分析一下這個(gè)啟動(dòng)器的自動(dòng)配置類(lèi)RedisAutoConfiguration做了什么
@AutoConfiguration
@ConditionalOnClass({RedisOperations.class})
// 將spring.redis開(kāi)頭的配置和redis進(jìn)行綁定
@EnableConfigurationProperties({RedisProperties.class})
// 引入了兩個(gè)redis連接客戶端,Lettuce(啟動(dòng)器默認(rèn)使用)和Jedis的連接配置類(lèi)
@Import({LettuceConnectionConfiguration.class, JedisConnectionConfiguration.class})
public class RedisAutoConfiguration {
public RedisAutoConfiguration() {
}
// 注入redisTemplate類(lèi),認(rèn)定key-value都是Object類(lèi)型
@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類(lèi),認(rèn)定key-value都是String類(lèi)型
@Bean
@ConditionalOnMissingBean
@ConditionalOnSingleCandidate(RedisConnectionFactory.class)
public StringRedisTemplate stringRedisTemplate(RedisConnectionFactory redisConnectionFactory) {
return new StringRedisTemplate(redisConnectionFactory);
}
}分析完之后,我們就可以通過(guò)一個(gè)簡(jiǎn)單的demo,來(lái)了解Spring Boot是如何連接操作redis的
首先,我們先設(shè)置一下redis客戶端的防火墻,要打開(kāi)6379端口
firewall-cmd --list-port # 查看所有的開(kāi)放的端口號(hào)
firewall-cmd --zone=public --add-port=6379/tcp --permanent #將6379端口加入防火墻
systemctl stop firewalld.service #停止firewall
systemctl start firewalld.service #打開(kāi)firewall
如果不使用Lettuce連接redis,使用Jedis,我們還需要導(dǎo)入相關(guān)依賴
<dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> </dependency>
然后在配置文件中配置相關(guān)連接參數(shù)
spring:
redis:
host: 192.168.153.128
port: 6379
client-type: jedis
jedis:
pool:
max-active: 10
# username: 用戶名
# password: 密碼
最后測(cè)試一下對(duì)redis的set和get操作
我們創(chuàng)建一個(gè)攔截器,將每次請(qǐng)求的訪問(wèn)路徑當(dāng)作key,訪問(wèn)次數(shù)當(dāng)作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 {
// 獲取請(qǐng)求路徑,把它當(dāng)作key,每請(qǐng)求一次,這個(gè)key對(duì)應(yīng)的value就自增1
final String requestURI = request.getRequestURI();
stringRedisTemplate.opsForValue().increment(requestURI);
return true;
}
}將這個(gè)攔截器通過(guò)之前的配置類(lèi)注冊(cè)到容器中
我們還考慮了一下filter和interceptor的區(qū)別
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的功能類(lèi)似,這兩者的區(qū)別在哪?
* filter:它是servlet定義的原生組件,脫離了spring也可以使用
* interceptor:它是spring定義的接口,可以使用spring的自動(dòng)裝配等功能
*/
@Autowired
private RedisInterceptor redisInterceptor;
@Override
public void addInterceptors(InterceptorRegistry registry) {
// addPathPatterns:設(shè)置要攔截的請(qǐng)求,如果是/**,那么會(huì)攔截包括靜態(tài)資源在內(nèi)的所有請(qǐng)求
// excludePathPatterns:設(shè)置不被攔截的請(qǐng)求,這里我們放行登錄頁(yè)請(qǐng)求和靜態(tài)資源
registry.addInterceptor(new LoginInterceptor())
.addPathPatterns("/**")
.excludePathPatterns("/", "/login", "/css/**", "/images/**", "/js/**", "/fonts/**");
// 這里不能使用new來(lái)實(shí)例化,因?yàn)镽edisInterceptor中使用了@Autowired注解,自己new的對(duì)象沒(méi)被spring管理,所以它不會(huì)自動(dòng)進(jìn)行依賴注入,所以這里應(yīng)該從容器中拿
registry.addInterceptor(redisInterceptor)
.addPathPatterns("/**")
.excludePathPatterns("/", "/login", "/css/**", "/images/**", "/js/**", "/fonts/**");
}最后,在首頁(yè)相關(guān)的接口中獲取訪問(wèn)次數(shù),并打印出來(lái)
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頁(yè)面
* @return 跳轉(zhuǎn)主頁(yè)面
*/
@GetMapping("/main.html")
public String mainPage(HttpSession session,Model model){
final ValueOperations opsForValue = stringRedisTemplate.opsForValue();
final Object visitTimes = opsForValue.get("/main.html");
log.info("訪問(wèn)首頁(yè)次數(shù)為:{}", visitTimes);
return "main";
}
}訪問(wèn)幾次首頁(yè)之后,后端打印結(jié)果如下

redis客戶端查詢結(jié)果如下

注意:如果出現(xiàn)報(bào)錯(cuò)如下報(bào)錯(cuò)
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...
這就說(shuō)明,redis處于保護(hù)模式,這是默認(rèn)開(kāi)啟的,報(bào)錯(cuò)信息中會(huì)提供好幾種解決方式
因?yàn)椴┲魈摂M機(jī)上的redis只有自己使用,所以選擇了比較省事的一種,那就是關(guān)掉保護(hù)模式
在redis.conf中搜索protected-mode,將后面的值設(shè)置為no即可

到此這篇關(guān)于SpringBoot淺析Redis訪問(wèn)操作使用的文章就介紹到這了,更多相關(guān)SpringBoot Redis訪問(wèn)操作內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Springboot中使用Redisson+AOP+自定義注解實(shí)現(xiàn)訪問(wèn)限流與黑名單攔截
- Springboot使用Redis中ZSetOperations實(shí)現(xiàn)博客訪問(wèn)量
- SpringBoot整合Redis實(shí)現(xiàn)訪問(wèn)量統(tǒng)計(jì)的示例代碼
- Docker 部署 SpringBoot 項(xiàng)目整合 Redis 鏡像做訪問(wèn)計(jì)數(shù)示例代碼
- SpringBoot遠(yuǎn)程訪問(wèn)redis服務(wù)器問(wèn)題剖析
- springboot實(shí)現(xiàn)訪問(wèn)多個(gè)redis庫(kù)
相關(guān)文章
nacos在liunx系統(tǒng)中啟動(dòng)成功瀏覽器卻訪問(wèn)不了的解決方法
在linux下搭建nacos,現(xiàn)在想要啟動(dòng),訪問(wèn)nacos頁(yè)面,訪問(wèn)不了,所以本文小編將給大家介紹nacos在liunx系統(tǒng)中啟動(dòng)成功,瀏覽器卻訪問(wèn)不了?全面的解決辦法,需要的朋友可以參考下2023-09-09
詳解Java設(shè)計(jì)模式編程中的訪問(wèn)者模式
這篇文章主要介紹了Java設(shè)計(jì)模式編程中的訪問(wèn)者模式,訪問(wèn)者模式的合理利用可以避免項(xiàng)目中出現(xiàn)大量重復(fù)的代碼,需要的朋友可以參考下2016-02-02
java中rss解析器(rome.jar和jdom.jar)示例
這篇文章主要介紹了java中rss解析器(rome.jar和jdom.jar)示例,需要的朋友可以參考下2014-03-03
Java詳解HashMap實(shí)現(xiàn)原理和源碼分析
這篇文章主要介紹了Java關(guān)于HashMap的實(shí)現(xiàn)原理并進(jìn)行源碼分析,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-09-09
Java如何使用httpclient檢測(cè)url狀態(tài)及鏈接是否能打開(kāi)
這篇文章主要介紹了Java如何使用httpclient檢測(cè)url狀態(tài)及鏈接是否能打開(kāi),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-09-09
Idea 同一窗口導(dǎo)入多個(gè)項(xiàng)目的實(shí)現(xiàn)步驟
本文主要介紹了Idea 同一窗口導(dǎo)入多個(gè)項(xiàng)目的實(shí)現(xiàn)步驟,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-07-07
Spring Security UserDetails實(shí)現(xiàn)原理詳解
這篇文章主要介紹了Spring Security UserDetails實(shí)現(xiàn)原理詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-09-09

