>  기사  >  데이터 베이스  >  SpringBoot가 RedisTemplate을 사용하여 Redis 데이터 유형을 작동하는 방법

SpringBoot가 RedisTemplate을 사용하여 Redis 데이터 유형을 작동하는 방법

王林
王林앞으로
2023-06-04 09:43:38658검색

Spring은 RedisTemplate을 캡슐화하여 모든 Redis 기본 API를 지원하는 Redis를 작동합니다. RedisTemplate에는 5가지 데이터 구조에 대한 연산 방법이 정의되어 있습니다.

  • opsForValue(): 문자열을 작동합니다.

  • opsForList(): 작업 목록입니다.

  • opsForHash(): 해시를 작동합니다.

  • opsForSet(): 작업 집합입니다.

  • opsForZSet(): 주문된 세트를 작동합니다.

예제를 통해 이러한 방법을 이해하고 적용해 봅시다. 여러 번 실행할 경우 데이터 삭제를 실패하면 데이터 작업이 반복될 수 있으므로 반드시 위의 방법을 실행한 후 데이터를 삭제해야 한다는 점에 유의하시기 바랍니다.

(1) Maven을 사용하여 종속성 파일 추가

pom.xml 구성 정보 파일에 Redis 종속성을 추가합니다.

My SpringBoot 버전:

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.3.4.RELEASE</version>
    <relativePath/> <!-- lookup parent from repository -->
</parent>

Redis 종속성 추가:

<!-- Redis启动器 -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
    <version>2.3.3.RELEASE</version>
</dependency>

(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 구성 클래스(구성 계층)

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<String, String> 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)

String(String)은 Redis의 가장 기본적인 데이터 유형입니다. 각 키(Key)는 문자열의 해당 값(Value)에 해당합니다. 즉, 키-값 키-값 쌍이 있습니다. 문자열은 바이너리 안전하며 모든 데이터(예: 이미지 또는 직렬화된 개체)를 저장할 수 있습니다. 최대값은 512MB의 데이터를 저장할 수 있습니다. 일반적으로 일부 복잡한 계산 기능을 캐싱하는 데 사용됩니다. RedisTemplate은 문자열 작업을 위해 다음과 같은 메서드를 제공합니다.

1.1 void set(K 키, V 값); 긴 타임아웃, TimeUnit 단위)

다음 코드 설정은 3s에 유효하지 않습니다. 쿼리는 3초 이내에 결과를 가지며, 쿼리는 3초 후에 null을 반환합니다. 구체적인 사용법은 다음 코드를 참조하세요.

/**
 * 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.3 V getAndSet(K key, V value)

키의 문자열을 설정하고 이전 값을 반환합니다. 구체적인 사용법은 다음 코드를 참조하세요.

@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.4 정수 추가(K 키, V 값)

키가 이미 존재하고 문자열 유형인 경우 이 명령은 새 키를 추가합니다. 원래 값 문자열의 끝. 키가 존재하지 않으면 키가 생성되어 빈 문자열로 설정됩니다. 즉, 이 특별한 경우의 추가 작업은 설정 작업과 유사합니다. 구체적인 사용법은 다음 코드를 참조하세요.

@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.5 긴 크기(K 키)

키에 해당하는 값의 길이를 반환합니다. 다음 코드를 참조하세요. SpringBoot가 RedisTemplate을 사용하여 Redis 데이터 유형을 작동하는 방법

@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"));
}

실행 결과:

2. list는 삽입 순서로 정렬된 간단한 문자열 목록입니다. 요소는 목록의 머리(왼쪽) 또는 꼬리(오른쪽)에 추가될 수 있습니다.

목록 데이터 결과를 이용하여 간단한 메시지 큐 기능을 수행할 수 있습니다. Irange 명령을 사용하여 Redis 기반의 고성능 페이지 매김을 구현할 수도 있습니다.

2.1 Long leftPushAll(K 키, V... 값); Long rightPushAll(K 키, V... 값)leftPushAll 메서드: 목록에 배열을 삽입함을 나타냅니다.

rightPushAll 방법: 목록의 가장 오른쪽 부분에 요소를 일괄 추가하는 것을 의미합니다. 구체적인 사용법은 다음 코드를 참조하세요. SpringBoot가 RedisTemplate을 사용하여 Redis 데이터 유형을 작동하는 방법

@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"));
}

실행 결과:

2.2 Long leftPush(K 키, V 값)

leftPush 메서드: 지정된 값을 모두 삽입합니다. 키 목록의 선두에 있습니다. push 작업을 수행하기 전에 해당 키가 존재하지 않으면 빈 목록을 생성하여 왼쪽에 삽입합니다.

rightPush 메서드: 키 목록 끝에 지정된 모든 값을 삽입합니다. push 작업을 수행하기 전 키가 존재하지 않으면 빈 리스트를 생성하고 오른쪽에 요소를 삽입합니다. 구체적인 사용법은 다음 코드를 참조하세요.

/**
 * 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.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”值的元素。其中,参数count的含义如下:

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

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

  • count

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

@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 extends HK, ? extends HV> 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<String,Object> 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<Object> 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<String> objectTypedTuple1 = new DefaultTypedTuple<>("pan_junbiao的博客_01",9.6);
        ZSetOperations.TypedTuple<String> objectTypedTuple2 = new DefaultTypedTuple<>("pan_junbiao的博客_02",1.5);
        ZSetOperations.TypedTuple<String> objectTypedTuple3 = new DefaultTypedTuple<>("pan_junbiao的博客_03",7.4);
 
        Set<ZSetOperations.TypedTuple<String>> typles = new HashSet<ZSetOperations.TypedTuple<String>>();
        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<String> objectTypedTuple1 = new DefaultTypedTuple<>("pan_junbiao的博客_01",9.6);
    ZSetOperations.TypedTuple<String> objectTypedTuple2 = new DefaultTypedTuple<>("pan_junbiao的博客_02",1.5);
    ZSetOperations.TypedTuple<String> objectTypedTuple3 = new DefaultTypedTuple<>("pan_junbiao的博客_03",7.4);
 
    Set<ZSetOperations.TypedTuple<String>> typles = new HashSet<ZSetOperations.TypedTuple<String>>();
    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<String> objectTypedTuple1 = new DefaultTypedTuple<>("pan_junbiao的博客_01",9.6);
    ZSetOperations.TypedTuple<String> objectTypedTuple2 = new DefaultTypedTuple<>("pan_junbiao的博客_02",1.5);
    ZSetOperations.TypedTuple<String> objectTypedTuple3 = new DefaultTypedTuple<>("pan_junbiao的博客_03",7.4);
 
    Set<ZSetOperations.TypedTuple<String>> typles = new HashSet<ZSetOperations.TypedTuple<String>>();
    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<String> objectTypedTuple1 = new DefaultTypedTuple<>("pan_junbiao的博客_01",9.6);
    ZSetOperations.TypedTuple<String> objectTypedTuple2 = new DefaultTypedTuple<>("pan_junbiao的博客_02",1.5);
    ZSetOperations.TypedTuple<String> objectTypedTuple3 = new DefaultTypedTuple<>("pan_junbiao的博客_03",7.4);
 
    Set<ZSetOperations.TypedTuple<String>> tuples = new HashSet<ZSetOperations.TypedTuple<String>>();
    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<String> objectTypedTuple1 = new DefaultTypedTuple<>("pan_junbiao的博客_01",9.6);
    ZSetOperations.TypedTuple<String> objectTypedTuple2 = new DefaultTypedTuple<>("pan_junbiao的博客_02",1.5);
    ZSetOperations.TypedTuple<String> objectTypedTuple3 = new DefaultTypedTuple<>("pan_junbiao的博客_03",7.4);
 
    Set<ZSetOperations.TypedTuple<String>> tuples = new HashSet<ZSetOperations.TypedTuple<String>>();
    tuples.add(objectTypedTuple1);
    tuples.add(objectTypedTuple2);
    tuples.add(objectTypedTuple3);
 
    System.out.println(redisTemplate.opsForZSet().add("zset9", tuples));
    Cursor<ZSetOperations.TypedTuple<Object>> cursor = redisTemplate.opsForZSet().scan("zset9", ScanOptions.NONE);
    while (cursor.hasNext())
    {
        ZSetOperations.TypedTuple<Object> item = cursor.next();
        System.out.println(item.getValue() + " 的分数值:" + item.getScore());
    }
}

执行结果:

SpringBoot가 RedisTemplate을 사용하여 Redis 데이터 유형을 작동하는 방법

위 내용은 SpringBoot가 RedisTemplate을 사용하여 Redis 데이터 유형을 작동하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 yisu.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제