1. 程式人生 > 其它 >redis分別存取rstring/list/set/zset/hash等資料型別

redis分別存取rstring/list/set/zset/hash等資料型別

技術標籤:javaSpringBootjavaredis

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