SpringBoot淺析Redis訪問操作使用
連接操作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>
然后在配置文件中配置相關連接參數(shù)
spring:
redis:
host: 192.168.153.128
port: 6379
client-type: jedis
jedis:
pool:
max-active: 10
# username: 用戶名
# password: 密碼
最后測試一下對redis的set和get操作
我們創(chuàng)建一個攔截器,將每次請求的訪問路徑當作key,訪問次數(shù)當作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的區(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的自動裝配等功能
*/
@Autowired
private RedisInterceptor redisInterceptor;
@Override
public void addInterceptors(InterceptorRegistry registry) {
// addPathPatterns:設置要攔截的請求,如果是/**,那么會攔截包括靜態(tài)資源在內的所有請求
// excludePathPatterns:設置不被攔截的請求,這里我們放行登錄頁請求和靜態(tài)資源
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/**");
}最后,在首頁相關的接口中獲取訪問次數(shù),并打印出來
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("訪問首頁次數(shù)為:{}", visitTimes);
return "main";
}
}訪問幾次首頁之后,后端打印結果如下

redis客戶端查詢結果如下

注意:如果出現(xiàn)報錯如下報錯
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訪問操作內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Spring Security+Spring Data Jpa如何進行安全管理
這篇文章主要介紹了Spring Security+Spring Data Jpa如何進行安全管理,幫助大家更好的理解和學習Spring Security框架,感興趣的朋友可以了解下2020-09-09
SpringBoot配置嵌入式Servlet容器和使用外置Servlet容器的教程圖解
這篇文章主要介紹了SpringBoot配置嵌入式Servlet容器和使用外置Servlet容器的教程,本文通過圖文并茂的形式給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-07-07
Java Mail郵件發(fā)送如何實現(xiàn)簡單封裝
這篇文章主要介紹了Java Mail郵件發(fā)送如何實現(xiàn)簡單封裝,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2020-11-11

