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)配置類RedisAutoConfiguration
做了什么
@AutoConfiguration @ConditionalOnClass({RedisOperations.class}) // 將spring.redis開(kāi)頭的配置和redis進(jìn)行綁定 @EnableConfigurationProperties({RedisProperties.class}) // 引入了兩個(gè)redis連接客戶端,Lettuce(啟動(dòng)器默認(rèn)使用)和Jedis的連接配置類 @Import({LettuceConnectionConfiguration.class, JedisConnectionConfiguration.class}) public class RedisAutoConfiguration { public RedisAutoConfiguration() { } // 注入redisTemplate類,認(rèn)定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類,認(rèn)定key-value都是String類型 @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ò)之前的配置類注冊(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的功能類似,這兩者的區(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)文章
Spring Security+Spring Data Jpa如何進(jìn)行安全管理
這篇文章主要介紹了Spring Security+Spring Data Jpa如何進(jìn)行安全管理,幫助大家更好的理解和學(xué)習(xí)Spring Security框架,感興趣的朋友可以了解下2020-09-09SpringBoot配置嵌入式Servlet容器和使用外置Servlet容器的教程圖解
這篇文章主要介紹了SpringBoot配置嵌入式Servlet容器和使用外置Servlet容器的教程,本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-07-07java微信公眾號(hào)支付開(kāi)發(fā)之現(xiàn)金紅包
這篇文章主要為大家詳細(xì)介紹了java微信公眾號(hào)支付開(kāi)發(fā)之現(xiàn)金紅包,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-04-04Java Mail郵件發(fā)送如何實(shí)現(xiàn)簡(jiǎn)單封裝
這篇文章主要介紹了Java Mail郵件發(fā)送如何實(shí)現(xiàn)簡(jiǎn)單封裝,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-11-11Springboot-注解-操作日志的實(shí)現(xiàn)方式
這篇文章主要介紹了Springboot-注解-操作日志的實(shí)現(xiàn)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-03-03全面詳解Maven打包及其相關(guān)插件和高級(jí)特性
這篇文章主要為大家介紹了Maven打包及其相關(guān)插件和高級(jí)特性的全面詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-05-05