redis分別存取rstring/list/set/zset/hash等資料型別
1、redisTemplate的基本配置
spring:
## redis 配置
redis:
host: 192.168.28.200
port: 6379
2、redisTemplate配置類
使用redisTemplate需要首先在spring容器中初始化該配置類,配置主要是對key和value序列化的方式進行設定,這裡的key和value分別採用string,object的資料型別,key使用string序列化方式,value使用json序列化方式,這樣可以基本滿足絕大部分的使用場景。配置類如下:
@Configuration
public class RedisTemplateConfig {
@Bean
@Primary
public RedisTemplate<String,Object> redisCacheTemplate(LettuceConnectionFactory redisConnectionFactory){
RedisTemplate<String,Object> template = new RedisTemplate<>();
template.setConnectionFactory(redisConnectionFactory) ;
FastJsonRedisSerializer fastJsonRedisSerializer = new FastJsonRedisSerializer(Object.class);
// key 的序列化方式為 string 序列化方式
template.setKeySerializer(new StringRedisSerializer());
template.setHashKeySerializer(new StringRedisSerializer());
template.setValueSerializer (fastJsonRedisSerializer);
template.setHashValueSerializer(fastJsonRedisSerializer);
template.setDefaultSerializer(fastJsonRedisSerializer);
template.afterPropertiesSet();
return template;
}
}
再使用時通過@Autowired 注入redisTemplate 即可;
@Autowired
private RedisTemplate<String,Object> redisTemplate;
3、不同資料型別的儲存與獲取
1)string
Redis最基本的資料型別,是一個單獨的字串,設定key value即可。使用redisTemplate.opsForValue() 使用set(key,value) get(key)即可。
redisTemplate.opsForValue().set(RedisConstantKey.MY_REDIS_VALUE.key,"xxxxx");
Object o = redisTemplate.opsForValue().get(RedisConstantKey.MY_REDIS_VALUE.key);
if(Objects.nonNull(o)){
System.out.println(o.toString());
}
2)list 列表
類似Java中的list列表,可以完成對一個數組資料的儲存,獲取時也可以根據索引獲取
比如我們的key為程式語言language,value為 {“java”,“c++”,“python”,“js”}等一些列具體的程式語言,類似這樣的資料結構就非常適合用list來儲存
public void setRedisList(){
List<Object> language = Lists.newArrayList("A","B","C","D");
redisTemplate.opsForList().leftPushAll(RedisConstantKey.MY_REDIS_LIST.key,language);
}
public void getRedisList(){
List<Object> languageList = redisTemplate.opsForList().range(RedisConstantKey.MY_REDIS_LIST.key, 0, -1);
// 可以直接轉換成string
if(CollectionUtils.isNotEmpty(languageList)){
List<String> languageStrs = languageList.stream().map(String::valueOf).collect(Collectors.toList());
System.out.println("遍歷輸出到表中!");
languageStrs.forEach(System.out::println);
}
}
遍歷輸出到表中!
A
B
C
D
使用opsForList這個api操作list,入庫的時候可以leftPush 也可以rightPush,取出的時候使用range(),後面的索引0 為從最左邊開始的索引,-1 為最右邊開始的索引,0,-1 代表取出列表中的所有資料。
3)set
set集合是不能有重複資料的,這和Java中的Set資料結構也是一致的,如果後面插入了和前面相同的資料,則會自動去重。我們來看下redisTemplate的操作示例,這裡使用的是redisTemplate.opsForSet(), 取出資料時,可以直接使用members()取出所有的資料 ,通過輸出列印,我們發現存入的兩個aa 輸出時只有一個了,已經被自動去重了。
/**
* 無序集合,不可重複
*/
public void setRedisSet(){
redisTemplate.opsForSet().add(RedisConstantKey.MY_REDIS_SET.key,"AA");
redisTemplate.opsForSet().add(RedisConstantKey.MY_REDIS_SET.key,"BB");
redisTemplate.opsForSet().add(RedisConstantKey.MY_REDIS_SET.key,"CC");
// 這裡加入一個重複的值,set集合自動去重
redisTemplate.opsForSet().add(RedisConstantKey.MY_REDIS_SET.key,"AA");
}
public void getRedisSet(){
Set<Object> members = redisTemplate.opsForSet().members(RedisConstantKey.MY_REDIS_SET.key);
Iterator<Object> it = members.iterator();
while (it.hasNext()){
System.out.println(it.next());
}
}
result:
BB
CC
AA
4)zset 有序集合
有時候我們需要儲存一個有序的集合,使用redis的有序集合來儲存是非常合適的。redisTemplate.opsForZset()api 就是專門用來操作有序集合的.
public void setRedisZset(){
redisTemplate.opsForZSet().add(RedisConstantKey.MY_REDIS_ZSET.key,"AA",100);
redisTemplate.opsForZSet().add(RedisConstantKey.MY_REDIS_ZSET.key,"BB",80);
redisTemplate.opsForZSet().add(RedisConstantKey.MY_REDIS_ZSET.key,"CC",98);
redisTemplate.opsForZSet().add(RedisConstantKey.MY_REDIS_ZSET.key,"DD",99);
redisTemplate.opsForZSet().add(RedisConstantKey.MY_REDIS_ZSET.key,"EE",87);
redisTemplate.opsForZSet().add(RedisConstantKey.MY_REDIS_ZSET.key,"FF",76);
redisTemplate.opsForZSet().add(RedisConstantKey.MY_REDIS_ZSET.key,"GG",63);
}
public void getRedisZset(){
Set<Object> range1 = redisTemplate.opsForZSet().rangeByScore(RedisConstantKey.MY_REDIS_ZSET.key, 90, 100);
range1.forEach((v) -> System.out.println("90以上的value值: "+v));
System.out.println("=====================================================");
Set<Object> range2 = redisTemplate.opsForZSet().rangeByScore(RedisConstantKey.MY_REDIS_ZSET.key, 80, 100);
range2.forEach((v) -> System.out.println("80以上的value值: "+v));
System.out.println("=====================================================");
Set<Object> range3 = redisTemplate.opsForZSet().rangeByScore(RedisConstantKey.MY_REDIS_ZSET.key, 0, 100);
range3.forEach((v) -> System.out.println("60以上的value值: "+v));
System.out.println("value排名後三位:::");
Set<Object> rank = redisTemplate.opsForZSet().range(RedisConstantKey.MY_REDIS_ZSET.key, 0, 2);
rank.forEach(System.out::println);
System.out.println("value排名前三位:::");
Set<Object> rank2 = redisTemplate.opsForZSet().reverseRange(RedisConstantKey.MY_REDIS_ZSET.key, 0, 2);
rank2.forEach(System.out::println);
}
result:
90以上的value值: CC
90以上的value值: DD
90以上的value值: AA
=====================================================
80以上的value值: BB
80以上的value值: EE
80以上的value值: CC
80以上的value值: DD
80以上的value值: AA
=====================================================
60以上的value值: GG
60以上的value值: FF
60以上的value值: BB
60以上的value值: EE
60以上的value值: CC
60以上的value值: DD
60以上的value值: AA
value排名後三位:::
GG
FF
BB
value排名前三位:::
AA
DD
CC
5)hash
hash 是一個string 型別的 field 和 value的對映表,hash特別適合於儲存物件。使用redisTemplate.opsForHash()這個api分別存入多個欄位。取出的時候可以使用entries()取出所有的欄位,也可以根據需要取出該key下面的特定field的value,直接使用get()api即可
public void setRedisHash(){
Map<String,String> nameAgeMap = new HashMap<>();
nameAgeMap.put("name","aa");
nameAgeMap.put("address","bb");
nameAgeMap.put("age","cc");
redisTemplate.opsForHash().putAll(RedisConstantKey.MY_REDIS_HASH.key,nameAgeMap);
}
public void getRedisHash(){
Map<Object,Object> nameAgeMap = redisTemplate.opsForHash().entries(RedisConstantKey.MY_REDIS_HASH.key);
nameAgeMap.forEach((k,v)->{
System.out.println("k==="+k+"v==="+v);
});
Object o = redisTemplate.opsForHash().get(RedisConstantKey.MY_REDIS_HASH.key,"name");
System.out.println("name是:"+o);
}
result:
k===:address v===: bb
k===:name v===: aa
k===:age v===: cc
name是:aa