SpringBoot整合Redis
阿新 • • 發佈:2020-01-22
SpringBoot整合Redis
1.新增redis的起步依賴
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <!-- 配置使用redis啟動器 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency>
2 配置redis的連線資訊
#Redis
spring.redis.host=127.0.0.1
spring.redis.port=6379
3 配置RedisConnectionFactory
/** * Created by 54110 on 2019-08-01. */ @Configuration @ConditionalOnClass(RedisOperations.class) @EnableConfigurationProperties(RedisProperties.class) public class RedisConfig { @Bean @ConditionalOnMissingBean(name = "redisTemplate") public RedisTemplate<Object,Object> redisTemplate( RedisConnectionFactory redisConnectionFactory) { RedisTemplate<Object,Object> template = new RedisTemplate<>(); //使用fastjson序列化 Jackson2JsonRedisSerializer fastJsonRedisSerializer = new Jackson2JsonRedisSerializer (Object.class); // value值的序列化採用fastJsonRedisSerializer template.setValueSerializer(fastJsonRedisSerializer); template.setHashValueSerializer(fastJsonRedisSerializer); // key的序列化採用StringRedisSerializer template.setKeySerializer(new StringRedisSerializer()); template.setHashKeySerializer(new StringRedisSerializer()); template.setConnectionFactory(redisConnectionFactory); return template; } @Bean @ConditionalOnMissingBean(StringRedisTemplate.class) public StringRedisTemplate stringRedisTemplate( RedisConnectionFactory redisConnectionFactory) { StringRedisTemplate template = new StringRedisTemplate(); template.setConnectionFactory(redisConnectionFactory); return template; }
4 配置RedisUtils
package com.lx; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.data.redis.core.ZSetOperations; import org.springframework.stereotype.Component; import org.springframework.util.CollectionUtils; import java.util.List; import java.util.Map; import java.util.Set; import java.util.concurrent.TimeUnit; /** * Created by 54110 on 2019-08-01. */ @Component public class RedisUtils { @Autowired private RedisTemplate redisTemplate; public void setRedisTemplate(RedisTemplate<String,Object> redisTemplate) { this.redisTemplate = redisTemplate; } //=============================common============================ /** * 指定快取失效時間 * @param key 鍵 * @param time 時間(秒) * @return */ public boolean expire(String key,long time){ try { if(time>0){ redisTemplate.expire(key,time,TimeUnit.SECONDS); } return true; } catch (Exception e) { e.printStackTrace(); return false; } } /** * 根據key 獲取過期時間 * @param key 鍵 不能為null * @return 時間(秒) 返回0代表為永久有效 */ public long getExpire(String key){ return redisTemplate.getExpire(key,TimeUnit.SECONDS); } /** * 判斷key是否存在 * @param key 鍵 * @return true 存在 false不存在 */ public boolean hasKey(String key){ try { return redisTemplate.hasKey(key); } catch (Exception e) { e.printStackTrace(); return false; } } /** * 刪除快取 * @param key 可以傳一個值 或多個 */ @SuppressWarnings("unchecked") public void del(String ... key){ if(key!=null&&key.length>0){ if(key.length==1){ redisTemplate.delete(key[0]); }else{ redisTemplate.delete(CollectionUtils.arrayToList(key)); } } } //============================String============================= /** * 普通快取獲取 * @param key 鍵 * @return 值 */ public Object get(String key){ return key==null?null:redisTemplate.opsForValue().get(key); } /** * 普通快取放入 * @param key 鍵 * @param value 值 * @return true成功 false失敗 */ public boolean set(String key,Object value) { try { redisTemplate.opsForValue().set(key,value); return true; } catch (Exception e) { e.printStackTrace(); return false; } } /** * 普通快取放入並設定時間 * @param key 鍵 * @param value 值 * @param time 時間(秒) time要大於0 如果time小於等於0 將設定無限期 * @return true成功 false 失敗 */ public boolean set(String key,Object value,long time){ try { if(time>0){ redisTemplate.opsForValue().set(key,value,TimeUnit.SECONDS); }else{ set(key,value); } return true; } catch (Exception e) { e.printStackTrace(); return false; } } /** * 遞增 * @param key 鍵 * @param by 要增加幾(大於0) * @return */ public long incr(String key,long delta){ if(delta<0){ throw new RuntimeException("遞增因子必須大於0"); } return redisTemplate.opsForValue().increment(key,delta); } /** * 遞減 * @param key 鍵 * @param by 要減少幾(小於0) * @return */ public long decr(String key,long delta){ if(delta<0){ throw new RuntimeException("遞減因子必須大於0"); } return redisTemplate.opsForValue().increment(key,-delta); } //================================Map================================= /** * HashGet * @param key 鍵 不能為null * @param item 項 不能為null * @return 值 */ public Object hget(String key,String item){ return redisTemplate.opsForHash().get(key,item); } /** * 獲取hashKey對應的所有鍵值 * @param key 鍵 * @return 對應的多個鍵值 */ public Map<Object,Object> hmget(String key){ return redisTemplate.opsForHash().entries(key); } /** * HashSet * @param key 鍵 * @param map 對應多個鍵值 * @return true 成功 false 失敗 */ public boolean hmset(String key,Map<String,Object> map){ try { redisTemplate.opsForHash().putAll(key,map); return true; } catch (Exception e) { e.printStackTrace(); return false; } } /** * HashSet 並設定時間 * @param key 鍵 * @param map 對應多個鍵值 * @param time 時間(秒) * @return true成功 false失敗 */ public boolean hmset(String key,Object> map,long time){ try { redisTemplate.opsForHash().putAll(key,map); if(time>0){ expire(key,time); } return true; } catch (Exception e) { e.printStackTrace(); return false; } } /** * 向一張hash表中放入資料,如果不存在將建立 * @param key 鍵 * @param item 項 * @param value 值 * @return true 成功 false失敗 */ public boolean hset(String key,String item,Object value) { try { redisTemplate.opsForHash().put(key,item,value); return true; } catch (Exception e) { e.printStackTrace(); return false; } } /** * 向一張hash表中放入資料,如果不存在將建立 * @param key 鍵 * @param item 項 * @param value 值 * @param time 時間(秒) 注意:如果已存在的hash表有時間,這裡將會替換原有的時間 * @return true 成功 false失敗 */ public boolean hset(String key,long time) { try { redisTemplate.opsForHash().put(key,value); if(time>0){ expire(key,time); } return true; } catch (Exception e) { e.printStackTrace(); return false; } } /** * 刪除hash表中的值 * @param key 鍵 不能為null * @param item 項 可以使多個 不能為null */ public void hdel(String key,Object... item){ redisTemplate.opsForHash().delete(key,item); } /** * 判斷hash表中是否有該項的值 * @param key 鍵 不能為null * @param item 項 不能為null * @return true 存在 false不存在 */ public boolean hHasKey(String key,String item){ return redisTemplate.opsForHash().hasKey(key,item); } /** * hash遞增 如果不存在,就會建立一個 並把新增後的值返回 * @param key 鍵 * @param item 項 * @param by 要增加幾(大於0) * @return */ public double hincr(String key,double by){ return redisTemplate.opsForHash().increment(key,by); } /** * hash遞減 * @param key 鍵 * @param item 項 * @param by 要減少記(小於0) * @return */ public double hdecr(String key,-by); } //============================set============================= /** * 根據key獲取Set中的所有值 * @param key 鍵 * @return */ public Set<Object> sGet(String key){ try { return redisTemplate.opsForSet().members(key); } catch (Exception e) { e.printStackTrace(); return null; } } /** * 根據value從一個set中查詢,是否存在 * @param key 鍵 * @param value 值 * @return true 存在 false不存在 */ public boolean sHasKey(String key,Object value){ try { return redisTemplate.opsForSet().isMember(key,value); } catch (Exception e) { e.printStackTrace(); return false; } } /** * 將資料放入set快取 * @param key 鍵 * @param values 值 可以是多個 * @return 成功個數 */ public long sSet(String key,Object...values) { try { return redisTemplate.opsForSet().add(key,values); } catch (Exception e) { e.printStackTrace(); return 0; } } /** * 將set資料放入快取 * @param key 鍵 * @param time 時間(秒) * @param values 值 可以是多個 * @return 成功個數 */ public long sSetAndTime(String key,long time,Object...values) { try { Long count = redisTemplate.opsForSet().add(key,values); if(time>0) expire(key,time); return count; } catch (Exception e) { e.printStackTrace(); return 0; } } /** * 獲取set快取的長度 * @param key 鍵 * @return */ public long sGetSetSize(String key){ try { return redisTemplate.opsForSet().size(key); } catch (Exception e) { e.printStackTrace(); return 0; } } /** * 移除值為value的 * @param key 鍵 * @param values 值 可以是多個 * @return 移除的個數 */ public long setRemove(String key,Object ...values) { try { Long count = redisTemplate.opsForSet().remove(key,values); return count; } catch (Exception e) { e.printStackTrace(); return 0; } } //===============================list================================= /** * 獲取list快取的內容 * @param key 鍵 * @param start 開始 * @param end 結束 0 到 -1代表所有值 * @return */ public List<Object> lGet(String key,long start,long end){ try { return redisTemplate.opsForList().range(key,start,end); } catch (Exception e) { e.printStackTrace(); return null; } } /** * 獲取list快取的長度 * @param key 鍵 * @return */ public long lGetListSize(String key){ try { return redisTemplate.opsForList().size(key); } catch (Exception e) { e.printStackTrace(); return 0; } } /** * 通過索引 獲取list中的值 * @param key 鍵 * @param index 索引 index>=0時, 0 表頭,1 第二個元素,依次類推;index<0時,-1,表尾,-2倒數第二個元素,依次類推 * @return */ public Object lGetIndex(String key,long index){ try { return redisTemplate.opsForList().index(key,index); } catch (Exception e) { e.printStackTrace(); return null; } } /** * 將list放入快取 * @param key 鍵 * @param value 值 * @param time 時間(秒) * @return */ public boolean lSet(String key,Object value) { try { redisTemplate.opsForList().rightPush(key,value); return true; } catch (Exception e) { e.printStackTrace(); return false; } } /** * 將list放入快取 * @param key 鍵 * @param value 值 * @param time 時間(秒) * @return */ public boolean lSet(String key,long time) { try { redisTemplate.opsForList().rightPush(key,value); if (time > 0) expire(key,time); return true; } catch (Exception e) { e.printStackTrace(); return false; } } /** * 將list放入快取 * @param key 鍵 * @param value 值 * @param time 時間(秒) * @return */ public boolean lSet(String key,List<Object> value) { try { redisTemplate.opsForList().rightPushAll(key,List<Object> value,long time) { try { redisTemplate.opsForList().rightPushAll(key,time); return true; } catch (Exception e) { e.printStackTrace(); return false; } } /** * 根據索引修改list中的某條資料 * @param key 鍵 * @param index 索引 * @param value 值 * @return */ public boolean lUpdateIndex(String key,long index,Object value) { try { redisTemplate.opsForList().set(key,index,value); return true; } catch (Exception e) { e.printStackTrace(); return false; } } /** * 移除N個值為value * @param key 鍵 * @param count 移除多少個 * @param value 值 * @return 移除的個數 */ public long lRemove(String key,long count,Object value) { try { Long remove = redisTemplate.opsForList().remove(key,count,value); return remove; } catch (Exception e) { e.printStackTrace(); return 0; } } //=========================Zset 有序不重複集合==================================== /** * 新增一個元素,zset與set最大的區別就是每個元素都有一個score,因此有個排序的輔助功能; zadd * * @param key * @param value * @param score */ public boolean ZSet(String key,String value,double score) { try { redisTemplate.opsForZSet().add(key,score); return true; } catch (Exception e) { e.printStackTrace(); return false; } } /** * 刪除元素 zrem * * @param key * @param value */ public boolean ZRemove(String key,String value) { try { redisTemplate.opsForZSet().remove(key,value); return true; }catch (Exception e){ e.printStackTrace(); return false; } } /** * score的增加or減少 zincrby * * @param key * @param value * @param score */ public Double ZIncrScore(String key,double score) { return redisTemplate.opsForZSet().incrementScore(key,score); } /** * 查詢value對應的score zscore * * @param key * @param value * @return */ public Double ZScore(String key,String value) { return redisTemplate.opsForZSet().score(key,value); } /** * 判斷value在zset中的排名 zrank * * @param key * @param value * @return */ public Long ZRank(String key,String value) { return redisTemplate.opsForZSet().rank(key,value); } /** * 查詢集合中指定順序的值, 0 -1 表示獲取全部的集合內容 zrange * * 返回有序的集合,score小的在前面 * * @param key * @param start * @param end * @return */ public Set<String> ZRange(String key,int start,int end) { return redisTemplate.opsForZSet().range(key,end); } /** * 查詢集合中指定順序的值和score,0,-1 表示獲取全部的集合內容 * * @param key * @param start * @param end * @return */ public Set<ZSetOperations.TypedTuple<String>> ZRangeWithScore(String key,int end) { return redisTemplate.opsForZSet().rangeWithScores(key,end); } /** * 查詢集合中指定順序的值 zrevrange * * 返回有序的集合中,score大的在前面 * * @param key * @param start * @param end * @return */ public Set<String> ZRevRange(String key,int end) { return redisTemplate.opsForZSet().reverseRange(key,end); } /** * 根據score的值,來獲取滿足條件的集合 zrangebyscore * * @param key * @param min * @param max * @return */ public Set<String> ZSortRange(String key,int min,int max) { return redisTemplate.opsForZSet().rangeByScore(key,min,max); } }
5 注入RedisTemplate測試redis操作
package com.lx;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.test.context.junit4.SpringRunner;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Set;
/**
* Created by 54110 on 2019-08-01.
*/
@RunWith(SpringRunner.class)
@SpringBootTest
public class redistTest {
@Autowired
private RedisTemplate<String,String> redisTemplate;
@Autowired
private RedisUtils redisUtils;
@Test
public void testString (){
redisTemplate.opsForValue().set("username","zhangsan");
String username = redisTemplate.opsForValue().get("username");
System.out.println(username);
}
//hash 測試
@Test
public void testHash(){
boolean hset = redisUtils.hset("user","name","張三");
if (hset){
Object user = redisUtils.hasKey("user");
Map<Object,Object> user1 = redisUtils.hmget("user");
System.out.println(user1);
}
}
//測試List
@Test
public void testList(){
List list = new ArrayList<>();
list.add("aaaa");
list.add("bbbb");
list.add("cccc");
list.add("dddd");
list.add("eeee");
boolean list1 = redisUtils.lSet("list",list);
if (list1){
List<Object> list2 = redisUtils.lGet("list",-1);
for (Object string:
list2) {
System.out.println(string);
}
}
}
//測試Set
@Test
public void testSet(){
long set = redisUtils.sSet("set",123,456);
boolean set2 = redisUtils.hasKey("set");
if (set2){
Set<Object> set1 = redisUtils.sGet("set");
for (Object val:
set1) {
System.out.println(val);
}
}
}
//測試ZSet
@Test
public void testZset(){
redisUtils.ZSet("person","cccc",12);
redisUtils.ZSet("person","dddd",13);
redisUtils.ZSet("person","aaaa",10);
redisUtils.ZSet("person","bbbb",11);
//scope從小到大排列
Set<String> person = redisUtils.ZRange("person",-1);
for (Object val:
person) {
System.out.println(val);
}
//scope從大到小排列
Set<String> person1 = redisUtils.ZRevRange("person",-1);
for (Object val:
person1) {
System.out.println(val);
}
}
}