在Spring Boot微服务使用Jedis操作Redis Set集合(无序集合)

本文介绍了在SpringBoot2.6.3环境下,如何配置Jedis连接Redis6.2.5,并进行RedisSet集合的增、查、删、超时设置等操作。通过配置Jedis连接池,然后在控制器中注入并使用JedisPool来执行各种Redis命令。

记录:410

场景:在Spring Boot微服务使用Jedis操作Redis Set集合(无序集合)。

版本:JDK 1.8,Spring Boot 2.6.3,redis-6.2.5,jedis-3.7.1。

1.微服务中配置Redis信息

1.1在application.yml中Jedis配置信息

hub:
  example:
    redis:
      jedis:
        host: 192.168.19.203
        port: 28001
        password: 12345678
        timeout: 60000

1.2使用ConfigurationProperties加载Jedis配置

Spring Boot微服务在启动时,自动注解机制会读取application.yml的Jedis相关注入到JedisConnectProperties 对象。

在Spring环境中,注入JedisConnectProperties对象,就能获取到Redis相关配置信息。也就是Jedis客户端必须的参数。

定义JedisConnectProperties 类,扫描yml中的hub.example.redis.jedis配置。

@Component
@ConfigurationProperties(prefix="hub.example.redis.jedis")
public class JedisConnectProperties {
  private String host;
  private int port;
  private int timeout;
  private String password;
  public String getHost() {
      return host;
  }
  public void setHost(String host) {
      this.host = host;
  }
  public int getPort() {
      return port;
  }
  public void setPort(int port) {
      this.port = port;
  }
  public int getTimeout() {
      return timeout;
  }
  public void setTimeout(int timeout) {
      this.timeout = timeout;
  }
  public String getPassword() {
      return password;
  }
  public void setPassword(String password) {
      this.password = password;
  }
}

1.3在pom.xml添加依赖

在Spring Boot中默认集成jedis,使用时无需加版本号,本例版本3.7.1是Spring Boot 2.6.3对应的版本。

<dependency>
  <groupId>redis.clients</groupId>
  <artifactId>jedis</artifactId>
  <version>3.7.1</version>
</dependency>

2.微服务中配置Jedis

2.1配置Jedis

@Configuration
public class JedisConfig {
  @Autowired
  private JedisConnectProperties jedisProperties;
  @Bean("jedisPoolConfig")
  public JedisPoolConfig jedisPoolConfig() {
    JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
    jedisPoolConfig.setMaxTotal(30);
    jedisPoolConfig.setMaxIdle(30);
    jedisPoolConfig.setMinIdle(1);
    jedisPoolConfig.setNumTestsPerEvictionRun(-1);
    jedisPoolConfig.setTestOnBorrow(true);
    jedisPoolConfig.setTestOnReturn(false);
    jedisPoolConfig.setBlockWhenExhausted(false);
    return jedisPoolConfig;
  }
  @Bean("jedisPool")
  public JedisPool jedisPool(JedisPoolConfig jedisPoolConfig) {
    JedisPool jedisPool = new JedisPool(jedisPoolConfig,
        jedisProperties.getHost(),
        jedisProperties.getPort(),
        jedisProperties.getTimeout(),
        jedisProperties.getPassword());
    return jedisPool;
  }
}

2.2解析

在配置Jedis后,在Spring环境中可以使用@Autowired自动注入jedisPool,从Jedis资源池中获取Jedis就可以操作Redis了。

3.使用Jedis操作Redis Set集合(无序集合)

3.1简要说明

使用Jedis操作Redis Set集合(无序集合),常用操作:增、查、删、设置超时等。

3.2操作示例

@RestController
@RequestMapping("/hub/example/loadJedis")
@Slf4j
public class LoadJedisController {
  // 注入JedisPool资源池
  @Autowired
  private JedisPool jedisPool;
  /**
   * 在Spring Boot微服务使用Jedis操作Redis Set集合(无序集合)
   */
  @GetMapping("/jedis05-01")
  public Object loadData05_01() {
    log.info("Jedis操作开始...");
    // 1.获取Jedis对象
    Jedis jedis = jedisPool.getResource();
    // 2.增
    // 2.1写入一条数据
    jedis.sadd("CityInfo:suzhou05:01", "苏州");
    // 2.1写入批量数据
    jedis.sadd("CityInfo:suzhou05:01"
            , "苏州-姑苏", "苏州-相城",
            "苏州-工业园区", "苏州-昆山");
    jedis.sadd("CityInfo:hangzhou05:01"
            , "杭州-西湖", "杭州-上城");
    // 3.查
    // 3.1查出指定key的值
    Set<String> result01 = jedis.smembers("CityInfo:suzhou05:01");
    // 3.2逐个取出
    String result02 = jedis.spop("CityInfo:suzhou05:01");
    // 3.3取出指定个数的值
    Set<String> result03 = jedis.spop("CityInfo:suzhou05:01", 3);
    // 3.3聚合两个队列
    Set<String> result04 = jedis.sunion("CityInfo:suzhou05:01"
            , "CityInfo:hangzhou05:01");
    // 4.删
    jedis.del("CityInfo:hangzhou05:01");
    // 5.设置超时,单位秒
    jedis.expire("CityInfo:suzhou05:01", 600L);
    // 6.释放Jedis对象
    jedis.close();
    log.info("Jedis操作结束...");
    return "执行成功";
  }
}

3.3测试验证

使用Postman测试。

请求RUL:http://127.0.0.1:18205/hub-205-redis/hub/example/loadJedis/jedis05-01

以上,感谢。

2023年4月15日

<think>我们正在讨论RedisSet集合Java中的操作。根据用户的问题,用户想了解在Java中如何实现RedisSet集合存储。我们可以结合站内引用中给出的代码示例来讲解。引用[1]和引用[2]都展示了使用Java操作RedisSet的方法,其中引用[1]使用SpringDataRedisRedisTemplate,引用[2]使用Jedis。因此,我们可以介绍两种常用的JavaRedis客户端操作Set集合的方法。1.使用Jedis(直接连接Redis服务器)2.使用SpringDataRedisRedisTemplate(通常在Spring应用中使用)我们将分别给出两种方式的代码示例。注意:用户问题集中在“存储”操作,所以我们将重点放在添加元素到Set集合,同时也展示一些基本操作,但以存储为主。步骤:1.引入依赖2.连接Redis3.操作Set集合我们分别介绍两种方式。方式一:使用Jedis步骤1:添加Jedis依赖(以Maven为例)```xml<dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId><version>3.7.0</version><!--请使用最新版本--></dependency>```步骤2:Java代码示例```javaimportredis.clients.jedis.Jedis;importjava.util.Set;publicclassJedisSetExample{publicstaticvoidmain(String[]args){//连接到Redis服务器,默认本地6379端口Jedisjedis=newJedis("localhost",6379);//如果Redis服务器设置了密码,需要认证//jedis.auth("password");Stringkey="fruits";//存储数据到Setjedis.sadd(key,"apple","banana","orange");//获取Set中的所有成员Set<String>members=jedis.smembers(key);System.out.println("Setmembers:"+members);//添加一个新成员jedis.sadd(key,"grape");//再次获取members=jedis.smembers(key);System.out.println("Afteraddinggrape:"+members);//关闭连接jedis.close();}}```方式二:使用SpringDataRedisRedisTemplate步骤1:添加SpringDataRedis依赖```xml<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId><version>2.5.5</version><!--请使用合适的版本--></dependency>```步骤2:配置Redis连接(在SpringBoot的application.properties中)```propertiesspring.redis.host=localhostspring.redis.port=6379spring.redis.password=#如果有密码的话```步骤3:在代码中使用RedisTemplate```javaimportorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.data.redis.core.RedisTemplate;importorg.springframework.stereotype.Component;importjava.util.Arrays;importjava.util.Set;@ComponentpublicclassRedisSetExample{@AutowiredprivateRedisTemplate<String,Object>redisTemplate;publicvoidoperateOnSet(){Stringkey="fruits";//存储数据到SetredisTemplate.opsForSet().add(key,"apple","banana","orange");//获取Set中的所有成员Set<Object>members=redisTemplate.opsForSet().members(key);System.out.println("Setmembers:"+members);//添加一个新成员redisTemplate.opsForSet().add(key,"grape");//再次获取members=redisTemplate.opsForSet().members(key);System.out.println("Afteraddinggrape:"+members);}}```注意:在SpringBoot中,我们通常使用依赖注入的方式获取RedisTemplate。如果非Spring环境,需要手动配置RedisTemplate。两种方式各有优劣:-Jedis:轻量级,直接使用,适用于简单的独立应用。-RedisTemplate:功能丰富,与Spring框架集成,支持事务、序列化配置等,适用于Spring应用。用户可以根据自己的项目情况选择。问题:用户如果对RedisTemplate的配置有疑问,我们可以进一步讲解如何配置RedisTemplate。但当前问题主要关注Set的存储操作,因此我们提供了基础操作。根据用户之前的引用,他们还提到了差集操作。这里补充一下使用RedisTemplate进行差集操作的方法(但非用户本次主要问题,作为扩展):```java//计算多个集合的差集Set<Object>difference=redisTemplate.opsForSet().difference(Arrays.asList(setKey1,setKey2,setKey3));```同样,Jedis中可以使用sdiff方法。我们最后回答用户的问题:在Java中实现RedisSet集合存储,主要通过上述两种方式,使用sadd命令(在Jedis中是sadd方法,在RedisTemplate中是opsForSet().add方法)来实现。生成相关问题:1.如何在Java中配置Redis连接?2.除了Set集合Redis还支持哪些数据结构?在Java中如何操作?3.使用RedisTemplate时,如何选择序列化方式?4.如何实现RedisSet集合的交集和并集操作?我们将上述内容整理后回答用户。</think> ### Java操作 Redis Set 集合存储的方法详解 RedisSet 集合是一个无序且元素唯一的键值存储结构,常用于去重、交集/并集计算等场景。在 Java 中主要通过以下两种方式实现: --- #### 一、使用 Jedis 客户端(原生操作) ```java import redis.clients.jedis.Jedis; import java.util.Set; public class RedisSetDemo { public static void main(String[] args) { // 1. 创建Redis连接 Jedis jedis = new Jedis("localhost", 6379); // 2. 存储数据到Set jedis.sadd("fruits", "apple", "banana", "orange"); // 添加元素 // 3. 获取Set集合数据 Set<String> allFruits = jedis.smembers("fruits"); System.out.println("所有水果: " + allFruits); // 输出: [apple, banana, orange] // 4. 常用操作示例 jedis.sadd("tropical", "banana", "mango"); Set<String> diff = jedis.sdiff("fruits", "tropical"); // 差集计算 System.out.println("独有水果: " + diff); // 输出: [apple, orange] // 5. 关闭连接 jedis.close(); } } ``` **关键方法说明**: - `sadd(key, values)`:添加元素到集合 - `smembers(key)`:获取集合所有元素 - `sdiff(key1, key2)`:返回差集(key1有但key2无的元素) - `sismember(key, value)`:检查元素是否存在 --- #### 二、使用 Spring Data Redis(企业级推荐) ```java @SpringBootTest public class RedisSetTests { @Autowired private RedisTemplate<String, Object> redisTemplate; public void setOperations() { // 1. 初始化Set集合 String key = "products"; redisTemplate.opsForSet().add(key, "phone", "laptop", "tablet"); // 2. 获取全部元素 Set<Object> products = redisTemplate.opsForSet().members(key); // 3. 计算并存储差集 String key2 = "electronics"; redisTemplate.opsForSet().add(key2, "laptop", "camera"); Set<Object> diffProducts = redisTemplate.opsForSet().difference(key, key2); System.out.println("独有商品: " + diffProducts); // 输出: [phone, tablet] // 4. 存储差集结果(SDIFFSTORE等效操作) String destKey = "unique_products"; redisTemplate.opsForSet().differenceAndStore(key, Arrays.asList(key2), destKey); } } ``` **核心接口**: - `opsForSet()`: 返回Set操作接口 - `difference()`: 内存级差集计算 - `differenceAndStore()`: 计算差集并存储结果(等价于SDIFFSTORE命令) --- ### 配置准备 1. **Jedis依赖**: ```xml <dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> <version>4.4.1</version> </dependency> ``` 2. **Spring Data Redis依赖**: ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> ``` --- ### 使用场景建议 1. **去重场景**:存储用户ID、IP地址等唯一值 2. **关系运算**:标签系统(如共同兴趣计算) 3. **随机抽样**:通过`SRANDMEMBER`抽取随机元素 4. **实时过滤**:利用`SISMEMBER`快速验证存在性 > ⚠️ **注意**:Set 最大存储 $2^{32}-1$ 个元素,超大数据集建议分片存储或使用 HyperLogLog 进行基数统计[^1]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值