当前位置:

首页 > 编程开发 > SpringBoot怎么使用RedisTemplate操作Redis数据类型

SpringBoot怎么使用RedisTemplate操作Redis数据类型

Spring封装了RedisTemplate来操作Redis,它支持所有的Redis原生的API。在RedisTemplate中定义了对5种数据结构的操作方法。opsForValue():操作字符串。opsForList():操作列表。opsForHash():操作哈希。opsForSet():操作集合。opsForZSet():操作有序集合。下面通过实例来理解和应用这些方法。这里需要特别注意的是,运行上述方法后要对数据进行清空操作,否则多次运行会导致数据重复操作。(1)使用Maven添加依赖文件在pom

Spring 封装了 RedisTemplate 来操作 Redis,它支持所有的 Redis 原生的 API。在 RedisTemplate 中定义了对5种数据结构的操作方法。

  • opsForValue():操作字符串。

  • opsForList():操作列表。

  • opsForHash():操作哈希。

  • opsForSet():操作集合。

  • opsForZSet():操作有序集合。

下面通过实例来理解和应用这些方法。这里需要特别注意的是,运行上述方法后要对数据进行清空操作,否则多次运行会导致数据重复操作。

(1)使用Maven添加依赖文件

在pom.xml配置信息文件中,添加Redis依赖:

我的SpringBoot版本:


    org.springframework.boot
    spring-boot-starter-parent
    2.3.4.RELEASE
     

添加Redis依赖:



    org.springframework.boot
    spring-boot-starter-data-redis
    2.3.3.RELEASE

(2)Redis的配置

在 application.yml 配置文件中配置Redis信息:

#Spring配置
spring:
  #缓存管理器
  cache:
    type: redis
  #Redis配置
  redis:
    database: 0 #Redis数据库索引(默认为0)
    host: 127.0.0.1 #Redis服务器地址
    port: 6379 #Redis服务器连接端口
    password:  #Redis服务器连接密码(默认为空)
    jedis:
      pool:
        max-active: 8 #连接池最大连接数(使用负值表示没有限制)
        max-wait: -1s #连接池最大阻塞等待时间(使用负值表示没有限制)
        max-idle: 8  #连接池中的最大空闲连接
        min-idle: 0 #连接池中的最小空闲连接
    lettuce:
      shutdown-timeout: 100ms #关闭超时时间,默认值100ms

(3)Redis配置类(config层)

创建com.pjb.config包中,并创建RedisConfig类(Redis配置类),并继承CachingConfigurerSupport类。

package com.pjb.config;
 
import com.fasterxml.jackson.annotation.JsonAutoDetect;
import com.fasterxml.jackson.annotation.PropertyAccessor;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.cache.CacheManager;
import org.springframework.cache.annotation.CachingConfigurerSupport;
import org.springframework.cache.interceptor.KeyGenerator;
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 java.lang.reflect.Method;
 
/**
 * Redis配置类
 * @author pan_junbiao
 **/
@Configuration
public class RedisConfig extends CachingConfigurerSupport
{
    /**
     * 缓存对象集合中,缓存是以key-value形式保存的,
     * 当不指定缓存的key时,SpringBoot会使用keyGenerator生成Key。
     */
    @Bean
    public KeyGenerator keyGenerator()
    {
        return new KeyGenerator()
        {
            @Override
            public Object generate(Object target, Method method, Object... params) {
                StringBuilder sb = new StringBuilder();
                //类名+方法名
                sb.append(target.getClass().getName());
                sb.append(method.getName());
                for (Object obj : params) {
                    sb.append(obj.toString());
                }
                return sb.toString();
            }
        };
    }
 
    /**
     * 缓存管理器
     */
    @SuppressWarnings("rawtypes")
    @Bean
    public CacheManager cacheManager(RedisConnectionFactory connectionFactory)
    {
        RedisCacheManager cacheManager = RedisCacheManager.create(connectionFactory);
        //设置缓存过期时间
 
        return cacheManager;
    }
 
    /**
     * 实例化RedisTemplate对象
     */
    @Bean
    public RedisTemplate redisTemplate(RedisConnectionFactory factory)
    {
        StringRedisTemplate template = new StringRedisTemplate(factory);
        Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
        ObjectMapper om = new ObjectMapper();
        om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
        om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
        jackson2JsonRedisSerializer.setObjectMapper(om);
        template.setValueSerializer(jackson2JsonRedisSerializer);
        template.afterPropertiesSet();
        return template;
    }
}

1、字符串(String)

字符串(String)是 Redis 最基本的数据类型。String 的一个“Key”对应一个“Value”,即 Key-Value 键值对。String 是二进制安全的,可以存储任何数据(比如图片或序列化的对象)。值最大能存储512MB的数据。一般用于一些复杂的计数功能的缓存。RedisTemplate 提供以下操作 String 的方法。

1.1 void set(K key, V value);V get(Object key)

具体用法见以下代码:

/**
 * Redis操作字符串(String)
 * @author pan_junbiao
 **/
@SpringBootTest
public class StringTest
{
    @Autowired
    private RedisTemplate redisTemplate;
    
    @Test
    public void string1()
    {
        redisTemplate.opsForValue().set("userName","pan_junbiao的博客");
        redisTemplate.opsForValue().set("blogUrl","https://blog.csdn.net/pan_junbiao");
        redisTemplate.opsForValue().set("blogRemark","您好,欢迎访问 pan_junbiao的博客");
        System.out.println("用户名称:" + redisTemplate.opsForValue().get("userName"));
        System.out.println("博客地址:" + redisTemplate.opsForValue().get("blogUrl"));
        System.out.println("博客信息:" + redisTemplate.opsForValue().get("blogRemark"));
    }
}

执行结果:

SpringBoot怎么使用RedisTemplate操作Redis数据类型

1.2 void set(K key, V value, long timeout, TimeUnit unit)

以下代码设置3s失效。3s之内查询有结果,3s之后查询返回为null。具体用法见以下代码:

@Autowired
private RedisTemplate redisTemplate;
 
@Test
public void string2()
{
    //设置的是3s失效,3s之内查询有结果,3s之后返回null
    redisTemplate.opsForValue().set("blogRemark","您好,欢迎访问 pan_junbiao的博客",3, TimeUnit.SECONDS);
    try
    {
        Object s1 = redisTemplate.opsForValue().get("blogRemark");
        System.out.println("博客信息:" + s1);
        Thread.currentThread().sleep(2000);
 
        Object s2 = redisTemplate.opsForValue().get("blogRemark");
        System.out.println("博客信息:" + s2);
        Thread.currentThread().sleep(5000);
 
        Object s3 = redisTemplate.opsForValue().get("blogRemark");
        System.out.println("博客信息:" + s3);
    }
    catch (InterruptedException ie)
    {
        ie.printStackTrace();
    }
}

执行结果:

SpringBoot怎么使用RedisTemplate操作Redis数据类型

1.3 V getAndSet(K key, V value)

设置键的字符串,并返回其旧值。具体用法见以下代码:

@Autowired
private RedisTemplate redisTemplate;
 
@Test
public void string3()
{
    //设置键的字符串并返回其旧值
    redisTemplate.opsForValue().set("blogRemark","pan_junbiao的博客");
    Object oldVaule = redisTemplate.opsForValue().getAndSet("blogRemark","您好,欢迎访问 pan_junbiao的博客");
    Object newVaule = redisTemplate.opsForValue().get("blogRemark");
    System.out.println("旧值:" + oldVaule);
    System.out.println("新值:" + newVaule);
}

执行结果:

SpringBoot怎么使用RedisTemplate操作Redis数据类型

1.4 Integer append(K key, V value)

如果key已经存在,并且是一个字符串,则该命令将该值追加到字符串的末尾。如果key不存在,则它将被创建并设置为空字符串,因此 append 在这种特殊情况下类似于 set。具体用法见以下代码:

@Autowired
private RedisTemplate redisTemplate;
 
@Test
public void string4()
{
    //设置value的序列化规则,否则会报错
    redisTemplate.setValueSerializer(new StringRedisSerializer());
 
    redisTemplate.opsForValue().append("blogRemark","您好,欢迎访问 ");
    System.out.println(redisTemplate.opsForValue().get("blogRemark"));
    redisTemplate.opsForValue().append("blogRemark","pan_junbiao的博客");
    System.out.println(redisTemplate.opsForValue().get("blogRemark"));
}

执行结果:

SpringBoot怎么使用RedisTemplate操作Redis数据类型

注意:这里一定要注意反序列化配置,否则会报错。

1.5 Long size(K key)

返回key所对应的value值的长度,见以下代码:

@Autowired
private RedisTemplate redisTemplate;
 
@Test
public void string5()
{
    redisTemplate.opsForValue().set("userName","pan_junbiao的博客");
    System.out.println("Value值:" + redisTemplate.opsForValue().get("userName"));
    System.out.println("Value值的长度:" + redisTemplate.opsForValue().size("userName"));
}

执行结果:

SpringBoot怎么使用RedisTemplate操作Redis数据类型

2、列表(List)

Redis列表是简单的字符串列表,按照插入顺序排序。可以添加一个元素到列表的头部(左边)或尾部(右边)。

使用list数据结果,可以做简单的消息队列的功能。还可以利用 Irange 命令,做基于Reids的分页功能,性能极佳。

2.1 Long leftPushAll(K key, V... values);Long rightPushAll(K key, V... values)

leftPushAll方法:表示把一个数组插入列表中。

rightPushAll方法:表示向列表的最右边批量添加元素。具体用法见以下代码:

/**
 * Redis操作列表(List)
 * @author pan_junbiao
 **/
@SpringBootTest
public class ListTest
{
    @Autowired
    private RedisTemplate redisTemplate;
 
    @Test
    public void list1()
    {
        String[] user1 = new String[]{"1","pan_junbiao的博客","您好,欢迎访问 pan_junbiao的博客"};
        String[] user2 = new String[]{"2","pan_junbiao的博客","https://blog.csdn.net/pan_junbiao"};
        String[] user3 = new String[]{"3","pan_junbiao的博客","您好,欢迎访问 pan_junbiao的博客"};
 
        redisTemplate.opsForList().rightPushAll("user1",user1);
        redisTemplate.opsForList().rightPushAll("user2",user2);
        redisTemplate.opsForList().rightPushAll("user3",user3);
 
        System.out.println(redisTemplate.opsForList().range("user1",0,-1));
        System.out.println(redisTemplate.opsForList().range("user2",0,-1));
        System.out.println(redisTemplate.opsForList().range("user3",0,-1));
    }
}

执行结果:

SpringBoot怎么使用RedisTemplate操作Redis数据类型

2.2 Long leftPush(K key, V value);Long rightPush(K key, V value)

leftPush方法:将所有指定的值插入在键的列表的头部。如果键不存在,则在执行推送操作之前将其创建为空列表(从左边插入)。

rightPush方法:将所有指定的值插入在键的列表的尾部。如果键不存在,则在执行推送操作之前将其创建为空列表(从右边插入)。具体用法见以下代码:

@Autowired
private RedisTemplate redisTemplate;
 
@Test
public void list2()
{
    redisTemplate.opsForList().rightPush("userInfo",1);
    redisTemplate.opsForList().rightPush("userInfo","pan_junbiao的博客");
    redisTemplate.opsForList().rightPush("userInfo","https://blog.csdn.net/pan_junbiao");
    redisTemplate.opsForList().rightPush("userInfo","您好,欢迎访问 pan_junbiao的博客");
 
    System.out.println("用户编号:" + redisTemplate.opsForList().index("userInfo",0));
    System.out.println("用户名称:" + redisTemplate.opsForList().index("userInfo",1));
    System.out.println("博客地址:" + redisTemplate.opsForList().index("userInfo",2));
    System.out.println("博客信息:" + redisTemplate.opsForList().index("userInfo",3));
}

执行结果:

SpringBoot怎么使用RedisTemplate操作Redis数据类型

2.3 Long size(K key)

返回存储在键中的列表的长度。如果键不存在,则将其解释为空列表,并返回0。如果key存在的值不是列表,则返回错误。具体用法见以下代码:

@Autowired
private RedisTemplate redisTemplate;
 
@Test
public void list3()
{
    String[] user = new String[]{"1","pan_junbiao的博客","您好,欢迎访问 pan_junbiao的博客"};
    redisTemplate.opsForList().leftPushAll("user",user);
    System.out.println("列表的长度:" + redisTemplate.opsForList().size("user"));
}

执行结果:

SpringBoot怎么使用RedisTemplate操作Redis数据类型

2.4 void set(K key, long index, V value)

在列表中 index 的位置设置 value。具体用法见以下代码:

@Autowired
private RedisTemplate redisTemplate;
 
@Test
public void list4()
{
    String[] user = new String[]{"1","pan_junbiao的博客","https://blog.csdn.net/pan_junbiao"};
    redisTemplate.opsForList().rightPushAll("user",user);
    System.out.println(redisTemplate.opsForList().range("user",0,-1));
 
    redisTemplate.opsForList().set("user",2,"您好,欢迎访问 pan_junbiao的博客");
    System.out.println(redisTemplate.opsForList().range("user",0,-1));
}

执行结果:

SpringBoot怎么使用RedisTemplate操作Redis数据类型

2.5 V index(K key, long index)

根据下标获取列表中的值(下标从0开始)。具体用法见以下代码:

@Autowired
private RedisTemplate redisTemplate;
 
@Test
public void list2()
{
    redisTemplate.opsForList().rightPush("userInfo",1);
    redisTemplate.opsForList().rightPush("userInfo","pan_junbiao的博客");
    redisTemplate.opsForList().rightPush("userInfo","https://blog.csdn.net/pan_junbiao");
    redisTemplate.opsForList().rightPush("userInfo","您好,欢迎访问 pan_junbiao的博客");
 
    System.out.println("用户编号:" + redisTemplate.opsForList().index("userInfo",0));
    System.out.println("用户名称:" + redisTemplate.opsForList().index("userInfo",1));
    System.out.println("博客地址:" + redisTemplate.opsForList().index("userInfo",2));
    System.out.println("博客信息:" + redisTemplate.opsForList().index("userInfo",3));
}

执行结果:

SpringBoot怎么使用RedisTemplate操作Redis数据类型

2.6 Long remove(K key, long count, Object value)

从存储在键中的列表,删除给定“count”值的元素的第1个计数事件。其中,参数count的含义如下:

  • count=0:删除等于value的所有元素。

  • count>0:删除等于从头到尾移动的值的元素。

  • count<0:删除等于从尾到头移动的值的元素。

以下代码用于删除列表中第一次出现的值:

@Autowired
private RedisTemplate redisTemplate;
 
@Test
public void list5()
{
    String[] user = new String[]{"1","pan_junbiao的博客","您好,欢迎访问 pan_junbiao的博客"};
    redisTemplate.opsForList().rightPushAll("user",user);
    System.out.println(redisTemplate.opsForList().range("user",0,-1));
 
    //将删除列表中第一次出现的pan_junbiao的博客
    redisTemplate.opsForList().remove("user",1,"pan_junbiao的博客");
    System.out.println(redisTemplate.opsForList().range("user",0,-1));
}

执行结果:

SpringBoot怎么使用RedisTemplate操作Redis数据类型

2.7 V leftPop(K key);V rightPop(K key)

leftPop方法:弹出最左边的元素,弹出之后该值在列表中将不复存在。

rightPop方法:弹出最右边的元素,弹出之后该值在列表中将不复存在。具体用法见以下代码:

@Autowired
private RedisTemplate redisTemplate;
 
@Test
public void list6()
{
    String[] user = new String[]{"1","pan_junbiao的博客","您好,欢迎访问 pan_junbiao的博客"};
    redisTemplate.opsForList().rightPushAll("user",user);
    System.out.println(redisTemplate.opsForList().range("user",0,-1));
    //弹出最右边的元素,弹出之后该值在列表中将不复存在
    System.out.println(redisTemplate.opsForList().rightPop("user"));
    System.out.println(redisTemplate.opsForList().range("user",0,-1));
}

执行结果:

SpringBoot怎么使用RedisTemplate操作Redis数据类型

3、哈希(Hash)

Redis 中的 hash(哈希)是一个 string 类型的 field 和 value 的映射表,hash 特别适合用于存储对象。value 中存放的是结构化的对象。利用这样数据结果,可以方便地操作其中的某个字段。比如在“单点登录”时,可以用这种数据结构存储用户信息。以 CookieId 作为 key,设置30分钟为缓存过期时间,能很好地模拟出类似 Session 的效果。

3.1 void putAll(H key, Map m);Map entries(H key)

putAll方法:用 m 中提供的多个散列字段设置到 key 对应的散列表中。

entries方法:根据密钥获取整个散列存储。具体用法见以下代码:

/**
 * Redis操作哈希(Hash)
 * @author pan_junbiao
 **/
@SpringBootTest
public class HashTest
{
    @Autowired
    private RedisTemplate redisTemplate;
 
    @Test
    public void hash2()
    {
        Map userMap = new HashMap<>();
        userMap.put("userName","pan_junbiao的博客");
        userMap.put("blogRemark","您好,欢迎访问 pan_junbiao的博客");
        redisTemplate.opsForHash().putAll("userHash",userMap);
        System.out.println(redisTemplate.opsForHash().entries("userHash"));
    }
}

执行结果:

SpringBoot怎么使用RedisTemplate操作Redis数据类型

3.2 void put(H key, HK hashKey, HV value);HV get(H key, Object hashKey)

put方法:设置 hashKey 的值。

get方法:从键中的散列获取给定 hashKey 的值。具体用法见以下代码:

@Autowired
private RedisTemplate redisTemplate;
 
@Test
public void hash3()
{
    redisTemplate.opsForHash().put("userHash","userName","pan_junbiao的博客");
    redisTemplate.opsForHash().put("userHash","blogUrl","https://blog.csdn.net/pan_junbiao");
    redisTemplate.opsForHash().put("userHash","blogRemark","您好,欢迎访问 pan_junbiao的博客");
    System.out.println("用户名称:" + redisTemplate.opsForHash().get("userHash","userName"));
    System.out.println("博客地址:" + redisTemplate.opsForHash().get("userHash","blogUrl"));
    System.out.println("博客信息:" + redisTemplate.opsForHash().get("userHash","blogRemark"));
}

执行结果:

SpringBoot怎么使用RedisTemplate操作Redis数据类型

3.3 List values(H key);Set keys(H key)

values方法:根据密钥获取整个散列存储的值。

keys方法:根据密钥获取整个散列存储的键。具体用法见以下代码:

@Autowired
private RedisTemplate redisTemplate;
 
@Test
public void hash4()
{
    redisTemplate.opsForHash().put("userHash","userName","pan_junbiao的博客");
    redisTemplate.opsForHash().put("userHash","blogRemark","您好,欢迎访问 pan_junbiao的博客");
    System.out.println("散列存储的值:" + redisTemplate.opsForHash().values("userHash"));
    System.out.println("散列存储的键:" + redisTemplate.opsForHash().keys("userHash"));
}

执行结果:

SpringBoot怎么使用RedisTemplate操作Redis数据类型

3.4 Boolean hasKey(H key, Object hashKey);Long size(H key)

hasKey方法:确定 hashKey 是否存在。

size方法:获取 key 所对应的散列表的大小个数。具体用法见以下代码:

@Autowired
private RedisTemplate redisTemplate;
 
@Test
public void hash5()
{
    redisTemplate.opsForHash().put("userHash","userName","pan_junbiao的博客");
    redisTemplate.opsForHash().put("userHash","blogUrl","https://blog.csdn.net/pan_junbiao");
    redisTemplate.opsForHash().put("userHash","blogRemark","您好,欢迎访问 pan_junbiao的博客");
    System.out.println(redisTemplate.opsForHash().hasKey("userHash","userName"));
    System.out.println(redisTemplate.opsForHash().hasKey("userHash","age"));
    System.out.println(redisTemplate.opsForHash().size("userHash"));
}

执行结果:

SpringBoot怎么使用RedisTemplate操作Redis数据类型

3.5 Long delete(H key, Object... hashKeys)

删除给定的 hashKeys。具体用法见以下代码:

@Autowired
private RedisTemplate redisTemplate;
 
@Test
public void hash6()
{
    redisTemplate.opsForHash().put("userHash","userName","pan_junbiao的博客");
    redisTemplate.opsForHash().put("userHash","blogRemark","您好,欢迎访问 pan_junbiao的博客");
    System.out.println(redisTemplate.opsForHash().delete("userHash","blogRemark"));
    System.out.println(redisTemplate.opsForHash().entries("userHash"));
}

执行结果:

SpringBoot怎么使用RedisTemplate操作Redis数据类型

4、集合(Set)

set 是存放不重复值的集合。利用 set 可以做全局去重复的功能。还可以进行交集、并集、差集等操作,也可用来实现计算共同喜好、全部的喜好、自己独有的喜好等功能。

Redis 的 set 是 string 类型的无序集合,通过散列表实现。

4.1 Long add(K key, V... values);Set members(K key)

add方法:在无序集合中添加元素,返回添加个数;如果存在重复的则不进行添加。

members方法:返回集合中的所有成员。具体用法见以下代码:

/**
 * Redis操作集合(Set)
 * @author pan_junbiao
 **/
@SpringBootTest
public class SetTest
{
    @Autowired
    private RedisTemplate redisTemplate;
 
    @Test
    public void set1()
    {
        String[] citys = new String[]{"北京","上海","广州","深圳"};
        System.out.println(redisTemplate.opsForSet().add("citySet",citys));
        System.out.println(redisTemplate.opsForSet().add("citySet","香港","澳门","台湾"));
        //返回集合中的所有元素
        System.out.println(redisTemplate.opsForSet().members("citySet"));
    }
}

执行结果:

SpringBoot怎么使用RedisTemplate操作Redis数据类型

4.2 Long remove(K key, Object... values)

移除集合中一个或多个成员。具体用法见以下代码:

@Autowired
private RedisTemplate redisTemplate;
 
@Test
public void set2()
{
    String[] citys = new String[]{"北京","上海","广州","深圳"};
    System.out.println(redisTemplate.opsForSet().add("citySet",citys));
    System.out.println(redisTemplate.opsForSet().remove("citySet",citys));
}

执行结果:

SpringBoot怎么使用RedisTemplate操作Redis数据类型

4.3 V pop(K key)

移除并返回集合中的一个随机元素。具体用法见以下代码:

@Autowired
private RedisTemplate redisTemplate;
 
@Test
public void set3()
{
    String[] citys = new String[]{"北京","上海","广州","深圳"};
    System.out.println(redisTemplate.opsForSet().add("citySet",citys));
    System.out.println(redisTemplate.opsForSet().pop("citySet"));
    System.out.println(redisTemplate.opsForSet().members("citySet"));
}

执行结果:

SpringBoot怎么使用RedisTemplate操作Redis数据类型

4.4 Boolean move(K key, V value, K destKey)

将 member 元素移动。具体用法见以下代码:

@Autowired
private RedisTemplate redisTemplate;
 
@Test
public void set4()
{
    String[] citys = new String[]{"北京","上海","广州","深圳"};
    System.out.println(redisTemplate.opsForSet().add("citySet",citys));
    System.out.println(redisTemplate.opsForSet().move("citySet","深圳","citySet2"));
    System.out.println(redisTemplate.opsForSet().members("citySet"));
    System.out.println(redisTemplate.opsForSet().members("citySet2"));
}

执行结果:

SpringBoot怎么使用RedisTemplate操作Redis数据类型

4.5 Cursor scan(K key, ScanOptions options)

用于遍历 Set。具体用法见以下代码:

@Autowired
private RedisTemplate redisTemplate;
 
@Test
public void set5()
{
    String[] citys = new String[]{"北京","上海","广州","深圳"};
    System.out.println(redisTemplate.opsForSet().add("citySet",citys));
    Cursor cursor = redisTemplate.opsForSet().scan("citySet", ScanOptions.NONE);
    while(cursor.hasNext())
    {
        System.out.println(cursor.next());
    }
}

执行结果:

SpringBoot怎么使用RedisTemplate操作Redis数据类型

4.6 交集、并集、差集

  • Set intersect(K key1, K key2)方法、Long intersectAndStore(K key1, K key2, K destKey)方法:交集。

  • Set union(K key1, K key2)方法、Long unionAndStore(K key1, K key2, K destKey)方法:并集。

  • Set difference(K key1, K key2)方法、Long differenceAndStore(K key1, K key2, K destKey)方法:差集。

具体用法见以下代码:

@Autowired
private RedisTemplate redisTemplate;
 
@Test
public void set6()
{
    String[] city1 = new String[]{"北京", "上海", "广州", "深圳", "昆明"};
    String[] city2 = new String[]{"北京", "深圳", "昆明", "成都"};
    System.out.println(redisTemplate.opsForSet().add("citySet1", city1));
    System.out.println(redisTemplate.opsForSet().add("citySet2", city2));
 
    //返回集合中的所有元素
    System.out.println("城市集合1:" + redisTemplate.opsForSet().members("citySet1"));
    System.out.println("城市集合2:" + redisTemplate.opsForSet().members("citySet2"));
 
    //求交集、并集、差集(方式一)
    System.out.println("求交集、并集、差集(方式一):");
    System.out.println("交集:" + redisTemplate.opsForSet().intersect("citySet1","citySet2"));
    System.out.println("并集:" + redisTemplate.opsForSet().union("citySet1","citySet2"));
    System.out.println("差集:" + redisTemplate.opsForSet().difference("citySet1","citySet2"));
 
    //求交集、并集、差集(方式二)
    redisTemplate.opsForSet().intersectAndStore("citySet1","citySet2", "intersectCity");
    redisTemplate.opsForSet().unionAndStore("citySet1","citySet2", "unionCity");
    redisTemplate.opsForSet().differenceAndStore("citySet1","citySet2", "differenceCity");
    System.out.println("求交集、并集、差集(方式二):");
    System.out.println("交集:" + redisTemplate.opsForSet().members("intersectCity"));
    System.out.println("并集:" + redisTemplate.opsForSet().members("unionCity"));
    System.out.println("差集:" + redisTemplate.opsForSet().members("differenceCity"));
}

执行结果:

SpringBoot怎么使用RedisTemplate操作Redis数据类型

5、有序集合(Sorted Set)

zset(Sorted Set 有序集合)也是 string 类型元素的集合,且不允许重复的成员。每个元素都会关联一个 double 类型的分数。可以通过分数将该集合中的成员从小到大进行排序。

zset 的成员是唯一的,但权重参数分数(score)却可以重复。集合中的元素能够按 score 进行排列。它可以用来做排行榜应用、取TOP/N、延时任务、范围查找等。

5.1 Long add(K key, Set> tuples)

增加一个有序集合。具体用法见以下代码:

import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.redis.core.DefaultTypedTuple;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.ZSetOperations;
 
import java.util.HashSet;
import java.util.Set;
/**
 * Redis操作有序集合(Sorted Set)
 * @author pan_junbiao
 **/
@SpringBootTest
public class SortedSetTest
{
    @Autowired
    private RedisTemplate redisTemplate;
 
    @Test
    public void Zset1() 
    {
        ZSetOperations.TypedTuple objectTypedTuple1 = new DefaultTypedTuple<>("pan_junbiao的博客_01",9.6);
        ZSetOperations.TypedTuple objectTypedTuple2 = new DefaultTypedTuple<>("pan_junbiao的博客_02",1.5);
        ZSetOperations.TypedTuple objectTypedTuple3 = new DefaultTypedTuple<>("pan_junbiao的博客_03",7.4);
 
        Set> typles = new HashSet>();
        typles.add(objectTypedTuple1);
        typles.add(objectTypedTuple2);
        typles.add(objectTypedTuple3);
 
        System.out.println(redisTemplate.opsForZSet().add("typles",typles));
        System.out.println(redisTemplate.opsForZSet().range("typles",0,-1));
    }
}

执行结果:

SpringBoot怎么使用RedisTemplate操作Redis数据类型

5.2 Boolean add(K key, V value, double score)

新增一个有序集合,存在的话为false,不存在的话为true。具体用法见以下代码:

@Autowired
private RedisTemplate redisTemplate;
 
@Test
public void Zset2()
{
    System.out.println(redisTemplate.opsForZSet().add("zset2", "pan_junbiao的博客_01", 9.6));
    System.out.println(redisTemplate.opsForZSet().add("zset2", "pan_junbiao的博客_01", 9.6));
}

执行结果:

SpringBoot怎么使用RedisTemplate操作Redis数据类型

5.3 Long remove(K key, Object... values)

从有序集合中移除一个或者多个元素。具体用法见以下代码:

@Autowired
private RedisTemplate redisTemplate;
 
@Test
public void Zset3()
{
    System.out.println(redisTemplate.opsForZSet().add("zset3", "pan_junbiao的博客_01", 1.0));
    System.out.println(redisTemplate.opsForZSet().add("zset3", "pan_junbiao的博客_02", 1.0));
    System.out.println(redisTemplate.opsForZSet().range("zset3", 0, -1));
    System.out.println(redisTemplate.opsForZSet().remove("zset3", "pan_junbiao的博客_02"));
    System.out.println(redisTemplate.opsForZSet().range("zset3", 0, -1));
}

执行结果:

SpringBoot怎么使用RedisTemplate操作Redis数据类型

5.4 Long rank(K key, Object value)

返回有序集中指定成员的排名,其中有序集成员按分数值递增(从小到大)顺序排列。具体用法见以下代码:

@Autowired
private RedisTemplate redisTemplate;
 
@Test
public void Zset4()
{
    System.out.println(redisTemplate.opsForZSet().add("zset4", "pan_junbiao的博客_01",9.6));
    System.out.println(redisTemplate.opsForZSet().add("zset4", "pan_junbiao的博客_02",1.5));
    System.out.println(redisTemplate.opsForZSet().add("zset4", "pan_junbiao的博客_03",7.4));
    System.out.println(redisTemplate.opsForZSet().range("zset4", 0, -1));
    System.out.println(redisTemplate.opsForZSet().rank("zset4", "pan_junbiao的博客_02"));
}

执行结果:

SpringBoot怎么使用RedisTemplate操作Redis数据类型

注意:结果中的0表示第一(最小)。

5.5 Set range(K key, long start, long end);Set rangeByScore(K key, double score1, double score2)

range方法:通过索引区间返回有序集合成指定区间内的成员,其中有序集成员按分数值递增(从小到大)顺序排列。

rangeByScore方法:通过分数区间返回有序集合成指定区间内的成员,其中有序集成员按分数值递增(从小到大)顺序排列。

具体用法见以下代码:

@Autowired
private RedisTemplate redisTemplate;
 
@Test
public void Zset5()
{
    ZSetOperations.TypedTuple objectTypedTuple1 = new DefaultTypedTuple<>("pan_junbiao的博客_01",9.6);
    ZSetOperations.TypedTuple objectTypedTuple2 = new DefaultTypedTuple<>("pan_junbiao的博客_02",1.5);
    ZSetOperations.TypedTuple objectTypedTuple3 = new DefaultTypedTuple<>("pan_junbiao的博客_03",7.4);
 
    Set> typles = new HashSet>();
    typles.add(objectTypedTuple1);
    typles.add(objectTypedTuple2);
    typles.add(objectTypedTuple3);
 
    System.out.println(redisTemplate.opsForZSet().add("zset5",typles));
    System.out.println(redisTemplate.opsForZSet().range("zset5",0,-1));
    System.out.println(redisTemplate.opsForZSet().rangeByScore("zset5", 0, 8));
}

执行结果:

SpringBoot怎么使用RedisTemplate操作Redis数据类型

5.6 Long count(K key, double score1, double score2);Long size(K key)

count方法:通过分数返回有序集合指定区间内的成员个数。

size方法:获取有序集合的成员数。

具体用法见以下代码:

@Autowired
private RedisTemplate redisTemplate;
 
@Test
public void Zset6()
{
    ZSetOperations.TypedTuple objectTypedTuple1 = new DefaultTypedTuple<>("pan_junbiao的博客_01",9.6);
    ZSetOperations.TypedTuple objectTypedTuple2 = new DefaultTypedTuple<>("pan_junbiao的博客_02",1.5);
    ZSetOperations.TypedTuple objectTypedTuple3 = new DefaultTypedTuple<>("pan_junbiao的博客_03",7.4);
 
    Set> typles = new HashSet>();
    typles.add(objectTypedTuple1);
    typles.add(objectTypedTuple2);
    typles.add(objectTypedTuple3);
 
    redisTemplate.opsForZSet().add("zset6", typles);
    System.out.println("分数在0至8区间内的成员个数:" + redisTemplate.opsForZSet().count("zset6", 0, 8));
    System.out.println("有序集合的成员数:" + redisTemplate.opsForZSet().size("zset6"));
}

执行结果:

SpringBoot怎么使用RedisTemplate操作Redis数据类型

5.7 Double score(K key, Object o)

获取指定成员的score值。具体用法见以下代码:

@Test
public void Zset7()
{
    redisTemplate.opsForZSet().add("zset7", "pan_junbiao的博客_01", 9.6);
    redisTemplate.opsForZSet().add("zset7", "pan_junbiao的博客_02", 1.5);
    redisTemplate.opsForZSet().add("zset7", "pan_junbiao的博客_03", 7.4);
 
    System.out.println("pan_junbiao的博客_01的分数:" + redisTemplate.opsForZSet().score("zset7", "pan_junbiao的博客_01"));
    System.out.println("pan_junbiao的博客_02的分数:" + redisTemplate.opsForZSet().score("zset7", "pan_junbiao的博客_02"));
    System.out.println("pan_junbiao的博客_03的分数:" + redisTemplate.opsForZSet().score("zset7", "pan_junbiao的博客_03"));
}

执行结果:

SpringBoot怎么使用RedisTemplate操作Redis数据类型

5.8 Long removeRange(K key, long start, long end)

移除指定索引位置的成员,有序集合成员按照分数值递增(从小到大)顺序排列。具体用法见以下代码:

@Autowired
private RedisTemplate redisTemplate;
 
@Test
public void Zset8()
{
    ZSetOperations.TypedTuple objectTypedTuple1 = new DefaultTypedTuple<>("pan_junbiao的博客_01",9.6);
    ZSetOperations.TypedTuple objectTypedTuple2 = new DefaultTypedTuple<>("pan_junbiao的博客_02",1.5);
    ZSetOperations.TypedTuple objectTypedTuple3 = new DefaultTypedTuple<>("pan_junbiao的博客_03",7.4);
 
    Set> tuples = new HashSet>();
    tuples.add(objectTypedTuple1);
    tuples.add(objectTypedTuple2);
    tuples.add(objectTypedTuple3);
 
    System.out.println(redisTemplate.opsForZSet().add("zset8", tuples));
    System.out.println(redisTemplate.opsForZSet().range("zset8", 0, -1));
    System.out.println(redisTemplate.opsForZSet().removeRange("zset8", 1, 5));
    System.out.println(redisTemplate.opsForZSet().range("zset8", 0, -1));
}

执行结果:

SpringBoot怎么使用RedisTemplate操作Redis数据类型

5.9 Cursor> scan(K key, ScanOptions options)

遍历 zset。具体用法见以下代码:

@Autowired
private RedisTemplate redisTemplate;
 
@Test
public void Zset9()
{
    ZSetOperations.TypedTuple objectTypedTuple1 = new DefaultTypedTuple<>("pan_junbiao的博客_01",9.6);
    ZSetOperations.TypedTuple objectTypedTuple2 = new DefaultTypedTuple<>("pan_junbiao的博客_02",1.5);
    ZSetOperations.TypedTuple objectTypedTuple3 = new DefaultTypedTuple<>("pan_junbiao的博客_03",7.4);
 
    Set> tuples = new HashSet>();
    tuples.add(objectTypedTuple1);
    tuples.add(objectTypedTuple2);
    tuples.add(objectTypedTuple3);
 
    System.out.println(redisTemplate.opsForZSet().add("zset9", tuples));
    Cursor> cursor = redisTemplate.opsForZSet().scan("zset9", ScanOptions.NONE);
    while (cursor.hasNext())
    {
        ZSetOperations.TypedTuple item = cursor.next();
        System.out.println(item.getValue() + " 的分数值:" + item.getScore());
    }
}

执行结果:

SpringBoot怎么使用RedisTemplate操作Redis数据类型

本文内容来源于互联网,如有侵权请联系删除。
作者最新文章
编程开发
相关文章 更多
C++动态数组初始化怎么写?常用语句与代码示例
C++动态数组初始化怎么写?常用语句与代码示例

深入解析C++中动态数组的初始化机制,涵盖new操作符的不同用法、基本类型与类对象的初始化差异,以及为何在现代C++开发中应优先使用std::vector。

using namespace 使用中遇到的问题怎么解决
using namespace 使用中遇到的问题怎么解决

命名空间的基本概念与常见引入问题在C++等编程语言中,命名空间(namespace)是一种将代码标识符(如变量、函数、类名)封装在特定名称下的机制,其主要目的是避免命名冲突,尤其是在大型项目或使用多个第三方库时。使用“using namespace”指令可以将指定命名空间中的所有名称引入当前作用域,

c语言函数递归 实操经验总结:这些技巧很实用
c语言函数递归 实操经验总结:这些技巧很实用

理解递归的基本原理在C语言中,递归是一种函数调用自身的编程技术。要掌握它,首先需要理解其核心思想:将一个复杂的大问题,分解为一个或几个与原问题相似但规模更小的子问题,直到子问题足够简单,可以直接求解。这个过程通常包含两个关键部分:递归出口和递归体。递归出口定义了问题何时不再继续分解,即最简单、可直接

c语言函数递归 怎么选?常见方案对比分析
c语言函数递归 怎么选?常见方案对比分析

递归函数的基本概念与适用场景在C语言编程中,递归是一种函数调用自身的编程技巧。它并非适用于所有问题,但在处理某些具有自相似结构的问题时,能提供极其清晰和优雅的解决方案。递归的核心思想是将一个大规模问题分解为一个或多个同类型但规模更小的子问题,直到子问题简单到可以直接求解。典型的适用场景包括树形结构的

Objective-C 内存管理入门:从 alloc 到 dealloc 的生命周期详解
Objective-C 内存管理入门:从 alloc 到 dealloc 的生命周期详解

理解内存管理的基石在Objective-C的编程世界中,内存管理是开发者必须掌握的核心技能之一。它直接关系到应用的性能、稳定性与资源利用效率。与一些采用自动垃圾回收机制的语言不同,Objective-C在很长一段时间里,依赖一套基于引用计数的、需要开发者部分介入的管理规则。这套规则的核心思想是明确的

如何正确使用 dealloc 以避免 iOS 应用中的内存泄漏
如何正确使用 dealloc 以避免 iOS 应用中的内存泄漏

理解 dealloc 的角色与时机在 iOS 应用开发中,内存管理是保障应用性能与稳定性的基石。dealloc 方法是 Objective-C 中对象生命周期结束时的关键回调,它标志着对象即将被系统回收内存。正确理解其触发时机至关重要:当一个对象的引用计数降为零时,运行时系统会自动调用该对象的 de

深入理解 Objective-C 中的 dealloc 方法:内存管理核心机制
深入理解 Objective-C 中的 dealloc 方法:内存管理核心机制

内存管理的基石在Objective-C的世界里,内存管理是开发者必须掌握的核心技能之一。作为一门在手动引用计数(MRC)时代诞生的语言,Objective-C要求程序员对对象的生命周期有清晰的认识。dealloc方法正是这一生命周期中至关重要的终点站。它是一个实例方法,当对象的引用计数降为零时,系统

理解 native2ascii:Java 国际化开发中的字符编码工具
理解 native2ascii:Java 国际化开发中的字符编码工具

native2ascii 工具的基本定位在Ja va应用程序的国际化与本地化开发过程中,处理非拉丁字符集是一个常见且关键的环节。Ja va内部使用Unicode字符集来统一表示全球各种语言的文字,但其属性文件(.properties)在历史上要求使用ASCII编码,或者更准确地说,要求非ASCII字

如何使用 native2ascii 转换中文字符为 Unicode 转义序列
如何使用 native2ascii 转换中文字符为 Unicode 转义序列

理解 native2ascii 工具的基本用途在软件开发,特别是涉及国际化处理的场景中,开发者常常需要处理不同编码的文本资源。native2ascii 是 Ja va 开发工具包(JDK)中提供的一个命令行实用程序,其主要功能是将包含本地字符编码(非ASCII字符)的文件,转换为包含 Unicode

Java native2ascii 命令详解:解决属性文件乱码问题
Java native2ascii 命令详解:解决属性文件乱码问题

native2ascii 命令的由来与作用在Ja va开发中,处理国际化资源文件是一个常见需求。资源文件通常以.properties格式存储,用于支持多语言界面。然而,Ja va属性文件默认采用ISO-8859-1字符集编码,这导致了一个直接的问题:当文件中包含非拉丁字符(如中文、日文、韩文等)时,

查看更多
精品专题 更多
装机必备
装机必备

正软商城装机必备专区,精选办公、浏览器、安全防护、影音播放、压缩解压、设计创作和系统工具等电脑常用正版软件,帮助用户快速完成新电脑软件配置。

Windows
Windows

正软商城Windows软件专区,汇集适用于Windows电脑的办公、设计、安全防护、影音播放、开发工具和系统优化软件,提供软件介绍、系统要求、正版授权及购买下载服务。

macOS软件
macOS软件

正软商城macOS软件专区,精选适用于Mac电脑的办公、设计、影音、效率、开发和系统工具,提供软件功能介绍、macOS兼容版本、正版授权及购买下载服务。

Mac软件 更多
灵活计算器
灵活计算器
macOS/iOS/Android

灵活计算器是一款笔记式算数应用,支持实时计算、动态关联和云端同步功能。记录、整理和输出之间的过渡会更自然,适合长期写作、做笔记或持续沉淀个人内容。

赤友清理大师
赤友清理大师
macOS

赤友清理大师是一款为 Mac 设计的智能清理优化工具,可精准扫描垃圾、大文件、重复文件等,释放磁盘空间。做扫描整理、文字提取和表格转换时,它能把识别后的处理步骤接得更顺,资料录入这类场景会省下不少时间。

极度公式
极度公式
Windows/macOS/Linux

极度公式是一款跨平台专业LaTeX公式识别编辑软件,支持OCR公式识别和多平台编辑。和使用说明,避免使用,享受完整功能与稳定支持。做扫描整理、文字提取和表格转换时,它能把识别后的处理步骤接得更顺,资料录入这类场景会省下不少时间。

WINDOWS 更多
Windows 10
Windows 10
Windows

Windows 10 是一款微软推出的经典操作系统,拥有硬件兼容性与多任务处理能力。它更偏向把系统状态查看和常用调节动作放在一起,适合需要持续观察和微调设备状态的场景。

极度公式
极度公式
Windows/macOS/Linux

极度公式是一款跨平台专业LaTeX公式识别编辑软件,支持OCR公式识别和多平台编辑。和使用说明,避免使用,享受完整功能与稳定支持。做扫描整理、文字提取和表格转换时,它能把识别后的处理步骤接得更顺,资料录入这类场景会省下不少时间。

密码键盘
密码键盘
Windows/macOS/iOS/Android

密码键盘是一款兼具安全性与便捷性的高效密码管理器。日常使用里的持续防护和信息管理会更突出,适合把安全控制放进长期使用流程中的场景。

网站备案号:苏ICP备2026018738号-1 联系邮箱:bd@zhengruan.com 网站地图

Copyright ©2018-2026