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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值