検索
ホームページデータベースRedisSpringBoot が RedisTemplate を使用して Redis データ型を操作する方法

Spring は、すべての Redis ネイティブ API をサポートする Redis を操作するために RedisTemplate をカプセル化します。 RedisTemplateには5つのデータ構造の操作メソッドが定義されています。

  • opsForValue(): 操作文字列。

  • opsForList(): 操作リスト。

  • opsForHash(): ハッシュを操作します。

  • opsForSet(): 操作セット。

  • opsForZSet(): 順序付きセットを操作します。

例を通してこれらの方法を理解して適用してみましょう。複数回実行する場合、データのクリアに失敗するとデータ操作が繰り返される可能性があるため、上記のメソッドを実行した後は必ずデータをクリアしてください。

(1) Maven を使用して依存関係ファイルを追加します

pom.xml 構成情報ファイルに、Redis 依存関係を追加します:

My SpringBoot version:

<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 構成クラス (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<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) に対応します。つまり、Key-Value キーと値のペアが存在します。 String はバイナリ セーフであり、あらゆるデータ (画像やシリアル化されたオブジェクトなど) を保存できます。最大値では512MBのデータを保存できます。通常、いくつかの複雑なカウント関数をキャッシュするために使用されます。 RedisTemplate は、文字列を操作するための次のメソッドを提供します。

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 キー、V 値、ロングタイムアウト、TimeUnit 単位)

次のコード設定は 3 秒間無効です。クエリは 3 秒以内に結果を返し、3 秒後に 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 整数の追加(K キー、V 値)

キーがすでに存在し、文字列型である場合、このコマンドは新しい値を元の文字列の末尾に追加します。キーが存在しない場合は、キーが作成されて空の文字列に設定されます。これは、この特殊な場合の追加操作は設定操作と似ていることを意味します。具体的な使用法については、次のコードを参照してください:

@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)

キーに対応する値の長さを返します。次のコードを参照してください:
@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. リスト (リスト)

SpringBoot が RedisTemplate を使用して Redis データ型を操作する方法Redis リストは、挿入順に並べ替えられた文字列の単純なリストです。要素はリストの先頭 (左) または末尾 (右) に追加できます。

リスト データの結果を使用して、単純なメッセージ キュー関数を実行できます。 Irange コマンドを使用して、Redis に基づいた高パフォーマンスのページネーションを実装することもできます。

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

実行結果:

#2.2 Long leftPush(K キー, V 値); Long rightPush (K キー、V 値)

SpringBoot が RedisTemplate を使用して Redis データ型を操作する方法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”值的元素。其中,参数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 中国語 Web サイトの他の関連記事を参照してください。

声明
この記事は亿速云で複製されています。侵害がある場合は、admin@php.cn までご連絡ください。
es和redis区别es和redis区别Jul 06, 2019 pm 01:45 PM

Redis是现在最热门的key-value数据库,Redis的最大特点是key-value存储所带来的简单和高性能;相较于MongoDB和Redis,晚一年发布的ES可能知名度要低一些,ES的特点是搜索,ES是围绕搜索设计的。

一起来聊聊Redis有什么优势和特点一起来聊聊Redis有什么优势和特点May 16, 2022 pm 06:04 PM

本篇文章给大家带来了关于redis的相关知识,其中主要介绍了关于redis的一些优势和特点,Redis 是一个开源的使用ANSI C语言编写、遵守 BSD 协议、支持网络、可基于内存、分布式存储数据库,下面一起来看一下,希望对大家有帮助。

实例详解Redis Cluster集群收缩主从节点实例详解Redis Cluster集群收缩主从节点Apr 21, 2022 pm 06:23 PM

本篇文章给大家带来了关于redis的相关知识,其中主要介绍了Redis Cluster集群收缩主从节点的相关问题,包括了Cluster集群收缩概念、将6390主节点从集群中收缩、验证数据迁移过程是否导致数据异常等,希望对大家有帮助。

Redis实现排行榜及相同积分按时间排序功能的实现Redis实现排行榜及相同积分按时间排序功能的实现Aug 22, 2022 pm 05:51 PM

本篇文章给大家带来了关于redis的相关知识,其中主要介绍了Redis实现排行榜及相同积分按时间排序,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,希望对大家有帮助。

详细解析Redis中命令的原子性详细解析Redis中命令的原子性Jun 01, 2022 am 11:58 AM

本篇文章给大家带来了关于redis的相关知识,其中主要介绍了关于原子操作中命令原子性的相关问题,包括了处理并发的方案、编程模型、多IO线程以及单命令的相关内容,下面一起看一下,希望对大家有帮助。

实例详解Redis实现排行榜及相同积分按时间排序功能的实现实例详解Redis实现排行榜及相同积分按时间排序功能的实现Aug 26, 2022 pm 02:09 PM

本篇文章给大家带来了关于redis的相关知识,其中主要介绍了Redis实现排行榜及相同积分按时间排序,本文通过实例代码给大家介绍的非常详细,下面一起来看一下,希望对大家有帮助。

一文搞懂redis的bitmap一文搞懂redis的bitmapApr 27, 2022 pm 07:48 PM

本篇文章给大家带来了关于redis的相关知识,其中主要介绍了bitmap问题,Redis 为我们提供了位图这一数据结构,位图数据结构其实并不是一个全新的玩意,我们可以简单的认为就是个数组,只是里面的内容只能为0或1而已,希望对大家有帮助。

一起聊聊Redis实现秒杀的问题一起聊聊Redis实现秒杀的问题May 27, 2022 am 11:40 AM

本篇文章给大家带来了关于redis的相关知识,其中主要介绍了关于实现秒杀的相关内容,包括了秒杀逻辑、存在的链接超时、超卖和库存遗留的问题,下面一起来看一下,希望对大家有帮助。

See all articles

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

WebStorm Mac版

WebStorm Mac版

便利なJavaScript開発ツール

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

SublimeText3 Linux 新バージョン

SublimeText3 Linux 新バージョン

SublimeText3 Linux 最新バージョン

Safe Exam Browser

Safe Exam Browser

Safe Exam Browser は、オンライン試験を安全に受験するための安全なブラウザ環境です。このソフトウェアは、あらゆるコンピュータを安全なワークステーションに変えます。あらゆるユーティリティへのアクセスを制御し、学生が無許可のリソースを使用するのを防ぎます。