業務需求 首頁 實現緩存分頁 前端
spring boot 整合redis (個人是2.0.3版本的)java
在pom 文件寫上依賴包便可 mysql
<dependency><!--依賴包--> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency> <dependency><!--設置reids配置須要的依賴包--> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-cache</artifactId> </dependency>
在application.yml裏面配置 相關的信息 以下圖linux
我是安裝在本地windows上 host 127.0.0.1 安裝在linux上需寫上其IP地址web
這個時候 就可使用redis 進行相關操做 redis
redis相關操做(我這裏懶得寫) 請參考https://blog.csdn.net/xiaochunping9987/article/details/37900361 這篇博客spring
可是使用 RedisTemplate 存List到redis 裏面 get 一次就會消失 最後發現緣由是沒有對reids 進行相關設置 致使 redis的事務不一致 致使key 取一次就消失sql
因此強烈建議 先進行redis 配置 在去使用redis 存數據數據庫
配置類以下windows
package com.wechat.config;
import com.fasterxml.jackson.annotation.JsonAutoDetect;
import com.fasterxml.jackson.annotation.PropertyAccessor;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.cache.RedisCacheManager;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;
/**
* @Auther: wxf
* @Date: 2018/7/10 15:20
*/
@Configuration
@EnableCaching//開啓註解
public class RedisConfig {
//緩存管理器 spring boot 2.0後 配置緩存管理器 和2.0之前 不同 根據本身的版本 配置
@Bean
public RedisCacheManager cacheManager(RedisConnectionFactory redisTemplate) {
return RedisCacheManager.create(redisTemplate);
}
// 如下兩種redisTemplate自由根據場景選擇
@Bean
public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory connectionFactory) {
RedisTemplate<Object, Object> template = new RedisTemplate<>();
template.setConnectionFactory(connectionFactory);
//使用Jackson2JsonRedisSerializer來序列化和反序列化redis的value值(默認使用JDK的序列化方式)
Jackson2JsonRedisSerializer serializer = new Jackson2JsonRedisSerializer(Object.class);
ObjectMapper mapper = new ObjectMapper();
mapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
mapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
serializer.setObjectMapper(mapper);
template.setValueSerializer(serializer);
//使用StringRedisSerializer來序列化和反序列化redis的key值
template.setKeySerializer(new StringRedisSerializer());
template.afterPropertiesSet();
//這裏設置redis事務一致
template.setEnableTransactionSupport(true);
return template;
}
@Bean
public StringRedisTemplate stringRedisTemplate(RedisConnectionFactory factory) {
StringRedisTemplate stringRedisTemplate = new StringRedisTemplate();
stringRedisTemplate.setConnectionFactory(factory);
stringRedisTemplate.setEnableTransactionSupport(true);
return stringRedisTemplate;
}
}
配置完後 就能夠進行 reids 相關操做
如今進行 redis的 list分頁的相關操做 最後兩個方法 是比較重要的
package com.wechat.service;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.data.redis.core.ValueOperations;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.List;
/**
* @Auther: wxf
* @Date: 2018/7/4 16:43
*/
@Service
public class RedisService {
@Autowired
StringRedisTemplate stringRedisTemplate;
@Resource(name="stringRedisTemplate")
ValueOperations<String, String> valOpsStr;
@Autowired
RedisTemplate<Object, Object> redisTemplate;
@Resource(name = "redisTemplate")
ValueOperations<Object, Object> valOpsObj;
/**
* 根據指定key獲取String
* @param key
* @return
*/
public String getStr(String key){
String s = valOpsStr.get(key);
if(s==null){
return "暫無對應的值";
}else{
return s;
}
}
/**
* 設置Str緩存
* @param key
* @param val
*/
public void setStr(String key, String val){
valOpsStr.set(key,val);
}
/**
* 刪除指定key
* @param key
*/
public void del(String key){
stringRedisTemplate.delete(key);
}
/**
* 根據指定o獲取Object
* @param o
* @return
*/
public Object getObj(Object o) {
Object o1 = valOpsObj.get(o);
if(o1==null){
return o1;
}else{
return o1;
}
}
/**
* 設置obj緩存
* @param key
* @param value
*/
public void setObj(Object key, Object value){
valOpsObj.set(key, value);
}
/**
* 刪除Obj緩存
* @param o
*/
public void delObj(Object o){
redisTemplate.delete(o);
}
/** 添加對象到redis 裏面的list中
* redis中的 list 是雙向的 因此添加的時候須要注意
* rightPush 先進先出 leftPush 先進後出 這裏 須要注意
* @param key list 對應的key
* @param obj 須要存的對象
*/
public void addList(String key,Object obj){
redisTemplate.opsForList().rightPush(key,obj);
}
/**
* opsForList().range(key, start, end); 取範圍值 redis裏面的list下標從0開始
* 流程 拿到key 對應的list 取 0 到 5 和 mysql的limt 相似 注意下標便可
* 從redis list 裏面的獲取數據分頁
* @param key redis list 對應的key
* @param start 開始下標
* @param end 介紹下標
* @return 返回list給前端
*/
public List getListPage(String key, int start, int end){
return (List)redisTemplate.opsForList().range(key, start, end);
}
}
如今開始測試
package com.wechat.controller; import com.wechat.dao.UserMapper; import com.wechat.pojo.User; import com.wechat.service.RedisService; import com.wechat.service.UserService; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import java.util.List; /** * @Auther: wxf * @Date: 2018/6/28 10:21 */ @RestController @Slf4j public class TestContorller { @Autowired UserMapper userMapper; @Autowired UserService userService; @Autowired RedisService redisService; /** * 查詢全部用戶到redis中 * @return */ @RequestMapping("/test") public List<User> selectAll(){ Object user1 = redisService.getObj("user"); if(user1==null){ List<User> users = userMapper.selectAll(); redisService.setObj("user",users); log.info("沒有緩存走數據庫"); return users; }else{ List<User> listUser=(List)user1; log.info("有緩存"); return listUser; } } /** * 我這裏是把 user 信息存到object 中的 全部我要取出來用RedisTemplate 進行對 list的操做 * */ @RequestMapping("/add") public void addTest(){ List<User> user = (List)redisService.getObj("user"); for (User u: user) { //這裏循環user 把每一個對象存到 redis中list中 redisService.addList("list",u); } } /** * 這裏取key 對應的list 那0 到 1 下標的 對象 也就是2個對象 * @return */ @RequestMapping("/aaa") public List aaa(){ return redisService.getListPage("list",0,1); } }
第一次 進test請求 前端截圖以下
後臺 截圖
沒有緩存 直接走的數據庫讀數據
第二次請求 test
數據同樣的
後臺 不同
有緩存 如今 只想 add請求
add沒有返回值 因此 咱們直接進redis 看
redis 裏面已經多了 key 爲list 的list集合數據的數據
能夠看到 只有兩條數據了
實現 動態的分頁 第一次返回給前端總條數 讓前端把或者後端把頁碼分出來 而後根據前端傳過來的頁碼和一頁幾條 來動態取list的區間值 實現redis 分頁
總結 : spring boot 使用redis 很簡單 可是 須要進行redis的相關配置和設置 否則就會出現 存一次 取一次 redis中的key 消失問題
redis 沒有直接分頁的方法 如今根據區間值來分頁 或許還有更好的方法 知道的大佬 但願在下面留言 謝謝!!!!