当前位置:

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

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

Redis Assistant
Redis Assistant

Redis Assistant 是一款为Redis设计的高效可视化管理与监控工具,提供多种操作模式,高效处理服务器数据。日常使用里的持续防护和信息管理会更突出,适合把安全控制放进长期使用流程中的场景。

立即下载
¥19
Windows/macOS/Linux 2026-08-22
正版软件 Windows macOS软件 Linux 数据库管理工具

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数据类型

    本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系bd@zhengruan.com
    作者最新文章
    编程开发
    相关文章 更多
    php72w redis,docker php7安装php-redis
    php72w redis,docker php7安装php-redis

    在Docker环境下为PHP安装Redis扩展:手动编译需下载源码、安装phpize、配置编译并安装,生成redis.so并在php.d目录新建redis.ini加载,重启PHP-FPM;也可直接yum安装php72w-pecl-redis,免手动编译。

    php 如何配置 redis,php 如何设置redis
    php 如何配置 redis,php 如何设置redis

    配置PHP的Redis扩展:先安装Redis服务,从GitHub下载phpredis源码,用phpize编译安装,修改php.ini添加extension=redis.so,重启php-fpm或Apache,通过phpinfo验证并连接Redis。

    c++如何将结构体序列化为Redis兼容的RESP协议格式【深度】
    c++如何将结构体序列化为Redis兼容的RESP协议格式【深度】

    C++结构体无法直接序列化为RESP协议,需手动将字段映射为*N数组嵌套$lenbulkstring形式。整数需转换为字符串并加:前缀,空字符串用$0\r\n,null用$-1\r\n。长度计算需精确到字节数,特别注意二进制安全,同时确保字段顺序与结构体定义一致。

    如何在Golang架构中部署Redict作为高能数据临时存储中转站
    如何在Golang架构中部署Redict作为高能数据临时存储中转站

    Redis作为跨服务临时状态枢纽,需按消息队列、缓存和原子状态三重角色设计。选型用List实现任务分发及延迟重试,Stream用于事件广播与位点回溯。go-redis/v8需配置MinIdleConns、MaxRetries及超时。数据写入应JSON序列化并带type标签、设合理TTL、将关键字段提至顶层。消费通过原子GET+DEL或processedkey

    TP8.0 高并发下库存超卖?Redis 原子递减结合数据库乐观锁控制
    TP8.0 高并发下库存超卖?Redis 原子递减结合数据库乐观锁控制

    在高并发秒杀场景下,利用Redis的减库存原子操作预扣减库存拦截超卖请求,再通过数据库乐观锁(版本号与库存校验)确保最终一致性,异常时回滚Redis库存并借助Lua脚本保证原子性,从而有效防止库存超卖。

    如何在 Go 中利用 go-redis 执行 Lua 脚本优化逻辑
    如何在 Go 中利用 go-redis 执行 Lua 脚本优化逻辑

    在Go中使用go-redis执行Lua脚本可借助原子性解决竞态问题,通过redis.Script封装脚本并自动处理SHA1缓存与重试。需注意KEYS必须为非空切片且所有键在Cluster模式下落在同一slot,ARGV以字符串传入并由tonumber转换。返回值需先检查错误再调用Val(),避免panic。

    TP6.0 基于 Redis SetNX 实现的简单互斥锁机制【并发】
    TP6.0 基于 Redis SetNX 实现的简单互斥锁机制【并发】

    先看一个典型场景:电商秒杀、库存扣减、定时任务重复调度——这些并发冲突在 TP6 应用里屡见不鲜。用 Redis 的 SETNX 做互斥锁,确实是轻量又直接的方案,但“能用”和“稳妥”之间,隔着三层硬功夫:原子加锁、身份校验、合理超时。这三条,差一条就翻车。 很多人第一次上手,直接写 SETNX 加

    TP6.0 如何处理高并发抢购?Redis 原子锁与队列削峰详解【秒杀】
    TP6.0 如何处理高并发抢购?Redis 原子锁与队列削峰详解【秒杀】

    高并发抢购中,Redis的DECR原子操作可安全扣库存;配合think-queue异步削峰,接口仅扣库存和推消息;分布式锁需用SETNXEX加唯一标识,释放时用Lua脚本校验;成功资格后须以数据库事务双写为准,失败时补回Redis库存。

    Golang 实现基于 Redis 的延时任务队列
    Golang 实现基于 Redis 的延时任务队列

    基于Redis的ZSET实现延时队列需解决并发重复消费、失败重试混乱、精度不足及内存爆炸等问题。通过Lua脚本保证取删原子性,使用毫秒级时间戳,对临时错误采用指数退避重试,永久错误记入独立哈希表,并限制最大延迟、定期清理过期任务、使用紧凑序列化格式。

    RedisInsight怎么修改Key的过期时间 Redis操作方法【步骤】
    RedisInsight怎么修改Key的过期时间 Redis操作方法【步骤】

    操作 Redis 的时候,改个 Key 的过期时间其实是个高频场景。特别是做运维排查或者临时调试那会儿,谁也不想反复切命令行窗口、背那些命令参数。好在 RedisInsight 这个图形工具把这事儿做得很顺手——三种方式任选,总有一种合你胃口。 在动手前,先确认一下 Key 当前的 TTL 状态是个

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

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

    Windows
    Windows

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

    PDF教程
    PDF教程

    正软商城PDF教程频道提供PDF编辑、转换、合并、拆分、压缩及格式处理方法,同时介绍常用PDF软件和工具的使用技巧。

    Mac软件 更多
    讯飞智作 网页版
    讯飞智作 网页版
    Windows/ macOS/ Linux

    讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

    火山引擎 网页版
    火山引擎 网页版
    Windows/ macOS/ Linux

    火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

    Aperty macOS版
    Aperty macOS版
    macOS

    Aperty 是 Skylum 推出的 AI 人像修图软件,支持自然肤质修饰、瑕疵处理、面部与身体调整、预设及批量同步。

    WINDOWS 更多
    讯飞智作 网页版
    讯飞智作 网页版
    Windows/ macOS/ Linux

    讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

    火山引擎 网页版
    火山引擎 网页版
    Windows/ macOS/ Linux

    火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

    PixTV 网页版
    PixTV 网页版
    Windows

    PixTV 是一款在浏览器中使用的 AI 视觉内容创作平台,提供图片、视频、音频、文字生成、AI 分镜、局部重绘、提示词反推和无限画布等工具,适合短剧、漫剧、广告及社交媒体内容制作。

    即将离开本站
    您即将前往第三方网站,请确认是否继续?
    为什么要购买正版软件?
    01 官方授权

    授权来源透明,订单与许可信息可随时查询。

    02 即时交付

    付款成功后自动发放激活信息,支持订单追踪。

    03 中文协助

    安装、激活、迁移与续费问题都有专人响应。

    04 长期可用

    提供升级提醒与授权管理,换机时也能轻松迁移。

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

    Copyright ©2018-2026