Spring-data-redis: 事务与pipeline

本文介绍如何使用Spring Data Redis实现事务和Pipeline操作,包括配置文件设置、事务处理及Pipeline命令执行示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  1. 
    

    本文主要展示如何使用spring-data-redis编写事务和pipeline:

    1.配置文件:

    <beans xmlns="http://www.springframework.org/schema/beans" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd" default-autowire="byName">
      <bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig">
        <property name="maxActive" value="32"></property>
        <property name="maxIdle" value="6"></property>
        <property name="maxWait" value="15000"></property>
        <property name="minEvictableIdleTimeMillis" value="300000"></property>
        <property name="numTestsPerEvictionRun" value="3"></property>
        <property name="timeBetweenEvictionRunsMillis" value="60000"></property>
        <property name="whenExhaustedAction" value="1"></property>
      </bean>
      <bean id="jedisConnectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory" destroy-method="destroy">
        <property name="poolConfig" ref="jedisPoolConfig"></property>
        <property name="hostName" value="127.0.0.1"></property>
        <property name="port" value="6379"></property>
        <property name="password" value="0123456"></property>
        <property name="timeout" value="15000"></property>
        <property name="usePool" value="true"></property>
      </bean>
      <bean id="jedisTemplate" class="org.springframework.data.redis.core.RedisTemplate">
        <property name="connectionFactory" ref="jedisConnectionFactory"></property>
        <property name="keySerializer">
          <bean class="org.springframework.data.redis.serializer.StringRedisSerializer"/>
        </property>
      </bean>
    </beans>
      <bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig">
        <property name="maxActive" value="32"></property>
        <property name="maxIdle" value="6"></property>
        <property name="maxWait" value="15000"></property>
        <property name="minEvictableIdleTimeMillis" value="300000"></property>
        <property name="numTestsPerEvictionRun" value="3"></property>
        <property name="timeBetweenEvictionRunsMillis" value="60000"></property>
        <property name="whenExhaustedAction" value="1"></property>
      </bean>
      <bean id="jedisConnectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory" destroy-method="destroy">
        <property name="poolConfig" ref="jedisPoolConfig"></property>
        <property name="hostName" value="127.0.0.1"></property>
        <property name="port" value="6379"></property>
        <property name="password" value="0123456"></property>
        <property name="timeout" value="15000"></property>
        <property name="usePool" value="true"></property>
      </bean>
      <bean id="jedisTemplate" class="org.springframework.data.redis.core.RedisTemplate">
        <property name="connectionFactory" ref="jedisConnectionFactory"></property>
        <property name="keySerializer">
          <bean class="org.springframework.data.redis.serializer.StringRedisSerializer"/>
        </property>
      </bean>
    </beans>

    2. 程序实例:

    package com.sample.redis.sdr;
    public class RedisClientTest {
    
      //private JsonRedisSeriaziler seriaziler;
      
      private RedisTemplate redisTemplate;
    
      public void setRedisTemplate(RedisTemplate redisTemplate) {
        this.redisTemplate = redisTemplate;
      }
      
      public void valueOperationSample(){
        ValueOperations<String, User> valueOper = redisTemplate.opsForValue();
        User suser = new User(1,"zhangsan",12);
        valueOper.set("user:" + suser.getId(),suser);
        System.out.println(valueOper.get("user:" + suser.getId()).getName());
      }
      
      public void listOperationSample(){
        User suser = new User(1,"zhangsan",12);
        ListOperations<String, User> listOper = redisTemplate.opsForList();
        listOper.leftPush("user:list", suser);//lpush,head
        listOper.rightPush("user:list", suser);//rpush,tail
      } com.sample.redis.sdr;
    public class RedisClientTest {
    
      //private JsonRedisSeriaziler seriaziler;
      
      private RedisTemplate redisTemplate;
    
      public void setRedisTemplate(RedisTemplate redisTemplate) {
        this.redisTemplate = redisTemplate;
      }
      
      public void valueOperationSample(){
        ValueOperations<String, User> valueOper = redisTemplate.opsForValue();
        User suser = new User(1,"zhangsan",12);
        valueOper.set("user:" + suser.getId(),suser);
        System.out.println(valueOper.get("user:" + suser.getId()).getName());
      }
      
      public void listOperationSample(){
        User suser = new User(1,"zhangsan",12);
        ListOperations<String, User> listOper = redisTemplate.opsForList();
        listOper.leftPush("user:list", suser);//lpush,head
        listOper.rightPush("user:list", suser);//rpush,tail
      }
     
      
      public void boundValueOperationSample(){
        User suser = new User(1,"zhangsan",12);
        BoundValueOperations<String, User> bvo = redisTemplate.boundValueOps("user:" + suser.getId());
        bvo.set(suser);
        bvo.expire(60, TimeUnit.MINUTES);
      }
      
      /**
       * 非连接池环境下,事务操作;对于sdr而言,每次操作(例如,get,set)都有会从pool中获取connection;
       * 因此在连接池环境下,使用事务需要注意。
       */
      public void txUnusedPoolSample(){
        User suser = new User(1,"zhangsan",12);
        redisTemplate.watch("user:" + suser.getId());
        redisTemplate.multi();
        ValueOperations<String, User> tvo = redisTemplate.opsForValue();
        tvo.set("user:" + suser.getId(), suser);
        redisTemplate.exec();
      }
      
      /**
       * 在连接池环境中,需要借助sessionCallback来绑定connection
       */
      public void txUsedPoolSample(){
        SessionCallback<User> sessionCallback = new SessionCallback<User>() {
          @Override
          public User execute(RedisOperations operations) throws DataAccessException {
            operations.multi();
            User user = new User(2,"lisi",32);
            String key = "user:" + user.getId();
            BoundValueOperations<String, User> oper = operations.boundValueOps(key);
            oper.set(user);
            oper.expire(60, TimeUnit.MINUTES);
            operations.exec();
            return user;
          }
        };
        redisTemplate.execute(sessionCallback);
      }
      
      /**
       * pipeline : 1,正确使用方式
       */
      public void pipelineSample(){
        final byte[] rawKey = redisTemplate.getKeySerializer().serialize("user_total");
        //pipeline
        RedisCallback<List<Object>> pipelineCallback = new RedisCallback<List<Object>>() {
          @Override
          public List<Object> doInRedis(RedisConnection connection) throws DataAccessException {
            connection.openPipeline();
            connection.incr(rawKey);
            connection.incr(rawKey);
            return connection.closePipeline();
          }
          
        };
        
        List<Object> results = (List<Object>)redisTemplate.execute(pipelineCallback);
        for(Object item : results){
          System.out.println(item.toString());
        }
      }
      //pipeline:备用方式
      public void pipelineSampleX(){
        byte[] rawKey = redisTemplate.getKeySerializer().serialize("user_total");
        RedisConnectionFactory factory = redisTemplate.getConnectionFactory();
        RedisConnection redisConnection = factory.getConnection();
        List<Object> results;
        try{
          redisConnection.openPipeline();
          redisConnection.incr(rawKey);
          results = redisConnection.closePipeline();
        }finally{
          RedisConnectionUtils.releaseConnection(redisConnection, factory);
        }
        if(results == null){
          return;
        }
        for(Object item : results){
          System.out.println(item.toString());
        }
    
      }
    }
      public void boundValueOperationSample(){
        User suser = new User(1,"zhangsan",12);
        BoundValueOperations<String, User> bvo = redisTemplate.boundValueOps("user:" + suser.getId());
        bvo.set(suser);
        bvo.expire(60, TimeUnit.MINUTES);
      }
      
      /**
       * 非连接池环境下,事务操作;对于sdr而言,每次操作(例如,get,set)都有会从pool中获取connection;
       * 因此在连接池环境下,使用事务需要注意。
       */
      public void txUnusedPoolSample(){
        User suser = new User(1,"zhangsan",12);
        redisTemplate.watch("user:" + suser.getId());
        redisTemplate.multi();
        ValueOperations<String, User> tvo = redisTemplate.opsForValue();
        tvo.set("user:" + suser.getId(), suser);
        redisTemplate.exec();
      }
      
      /**
       * 在连接池环境中,需要借助sessionCallback来绑定connection
       */
      public void txUsedPoolSample(){
        SessionCallback<User> sessionCallback = new SessionCallback<User>() {
          @Override
          public User execute(RedisOperations operations) throws DataAccessException {
            operations.multi();
            User user = new User(2,"lisi",32);
            String key = "user:" + user.getId();
            BoundValueOperations<String, User> oper = operations.boundValueOps(key);
            oper.set(user);
            oper.expire(60, TimeUnit.MINUTES);
            operations.exec();
            return user;
          }
        };
        redisTemplate.execute(sessionCallback);
      }
      
      /**
       * pipeline : 1,正确使用方式
       */
      public void pipelineSample(){
        final byte[] rawKey = redisTemplate.getKeySerializer().serialize("user_total");
        //pipeline
        RedisCallback<List<Object>> pipelineCallback = new RedisCallback<List<Object>>() {
          @Override
          public List<Object> doInRedis(RedisConnection connection) throws DataAccessException {
            connection.openPipeline();
            connection.incr(rawKey);
            connection.incr(rawKey);
            return connection.closePipeline();
          }
          
        };
        
        List<Object> results = (List<Object>)redisTemplate.execute(pipelineCallback);
        for(Object item : results){
          System.out.println(item.toString());
        }
      }
      //pipeline:备用方式
      public void pipelineSampleX(){
        byte[] rawKey = redisTemplate.getKeySerializer().serialize("user_total");
        RedisConnectionFactory factory = redisTemplate.getConnectionFactory();
        RedisConnection redisConnection = factory.getConnection();
        List<Object> results;
        try{
          redisConnection.openPipeline();
          redisConnection.incr(rawKey);
          results = redisConnection.closePipeline();
        }finally{
          RedisConnectionUtils.releaseConnection(redisConnection, factory);
        }
        if(results == null){
          return;
        }
        for(Object item : results){
          System.out.println(item.toString());
        }
    
      }
    }
  2.  
  
  public void boundValueOperationSample(){
    User suser = new User(1,"zhangsan",12);
    BoundValueOperations<String, User> bvo = redisTemplate.boundValueOps("user:" + suser.getId());
    bvo.set(suser);
    bvo.expire(60, TimeUnit.MINUTES);
  }
  
  /**
   * 非连接池环境下,事务操作;对于sdr而言,每次操作(例如,get,set)都有会从pool中获取connection;
   * 因此在连接池环境下,使用事务需要注意。
   */
  public void txUnusedPoolSample(){
    User suser = new User(1,"zhangsan",12);
    redisTemplate.watch("user:" + suser.getId());
    redisTemplate.multi();
    ValueOperations<String, User> tvo = redisTemplate.opsForValue();
    tvo.set("user:" + suser.getId(), suser);
    redisTemplate.exec();
  }
  
  /**
   * 在连接池环境中,需要借助sessionCallback来绑定connection
   */
  public void txUsedPoolSample(){
    SessionCallback<User> sessionCallback = new SessionCallback<User>() {
      @Override
      public User execute(RedisOperations operations) throws DataAccessException {
        operations.multi();
        User user = new User(2,"lisi",32);
        String key = "user:" + user.getId();
        BoundValueOperations<String, User> oper = operations.boundValueOps(key);
        oper.set(user);
        oper.expire(60, TimeUnit.MINUTES);
        operations.exec();
        return user;
      }
    };
    redisTemplate.execute(sessionCallback);
  }
  
  /**
   * pipeline : 1,正确使用方式
   */
  public void pipelineSample(){
    final byte[] rawKey = redisTemplate.getKeySerializer().serialize("user_total");
    //pipeline
    RedisCallback<List<Object>> pipelineCallback = new RedisCallback<List<Object>>() {
      @Override
      public List<Object> doInRedis(RedisConnection connection) throws DataAccessException {
        connection.openPipeline();
        connection.incr(rawKey);
        connection.incr(rawKey);
        return connection.closePipeline();
      }
      
    };
    
    List<Object> results = (List<Object>)redisTemplate.execute(pipelineCallback);
    for(Object item : results){
      System.out.println(item.toString());
    }
  }
  //pipeline:备用方式
  public void pipelineSampleX(){
    byte[] rawKey = redisTemplate.getKeySerializer().serialize("user_total");
    RedisConnectionFactory factory = redisTemplate.getConnectionFactory();
    RedisConnection redisConnection = factory.getConnection();
    List<Object> results;
    try{
      redisConnection.openPipeline();
      redisConnection.incr(rawKey);
      results = redisConnection.closePipeline();
    }finally{
      RedisConnectionUtils.releaseConnection(redisConnection, factory);
    }
    if(results == null){
      return;
    }
    for(Object item : results){
      System.out.println(item.toString());
    }

  }
}
  public void boundValueOperationSample(){
    User suser = new User(1,"zhangsan",12);
    BoundValueOperations<String, User> bvo = redisTemplate.boundValueOps("user:" + suser.getId());
    bvo.set(suser);
    bvo.expire(60, TimeUnit.MINUTES);
  }
  
  /**
   * 非连接池环境下,事务操作;对于sdr而言,每次操作(例如,get,set)都有会从pool中获取connection;
   * 因此在连接池环境下,使用事务需要注意。
   */
  public void txUnusedPoolSample(){
    User suser = new User(1,"zhangsan",12);
    redisTemplate.watch("user:" + suser.getId());
    redisTemplate.multi();
    ValueOperations<String, User> tvo = redisTemplate.opsForValue();
    tvo.set("user:" + suser.getId(), suser);
    redisTemplate.exec();
  }
  
  /**
   * 在连接池环境中,需要借助sessionCallback来绑定connection
   */
  public void txUsedPoolSample(){
    SessionCallback<User> sessionCallback = new SessionCallback<User>() {
      @Override
      public User execute(RedisOperations operations) throws DataAccessException {
        operations.multi();
        User user = new User(2,"lisi",32);
        String key = "user:" + user.getId();
        BoundValueOperations<String, User> oper = operations.boundValueOps(key);
        oper.set(user);
        oper.expire(60, TimeUnit.MINUTES);
        operations.exec();
        return user;
      }
    };
    redisTemplate.execute(sessionCallback);
  }
  
  /**
   * pipeline : 1,正确使用方式
   */
  public void pipelineSample(){
    final byte[] rawKey = redisTemplate.getKeySerializer().serialize("user_total");
    //pipeline
    RedisCallback<List<Object>> pipelineCallback = new RedisCallback<List<Object>>() {
      @Override
      public List<Object> doInRedis(RedisConnection connection) throws DataAccessException {
        connection.openPipeline();
        connection.incr(rawKey);
        connection.incr(rawKey);
        return connection.closePipeline();
      }
      
    };
    
    List<Object> results = (List<Object>)redisTemplate.execute(pipelineCallback);
    for(Object item : results){
      System.out.println(item.toString());
    }
  }
  //pipeline:备用方式
  public void pipelineSampleX(){
    byte[] rawKey = redisTemplate.getKeySerializer().serialize("user_total");
    RedisConnectionFactory factory = redisTemplate.getConnectionFactory();
    RedisConnection redisConnection = factory.getConnection();
    List<Object> results;
    try{
      redisConnection.openPipeline();
      redisConnection.incr(rawKey);
      results = redisConnection.closePipeline();
    }finally{
      RedisConnectionUtils.releaseConnection(redisConnection, factory);
    }
    if(results == null){
      return;
    }
    for(Object item : results){
      System.out.println(item.toString());
    }

  }
}

<think>我们正在配置RedisTemplate的连接池。首先,我们需要配置连接池参数,然后配置Redis连接工厂,再配置RedisTemplate,最后封装一个工具类。根据引用[1],我们需要配置Redis连接池和RedisTemplate,并建议封装一个RedisUtil类。引用[2]提到Spring-Data-Redis是操作Redis的面向对象方式。引用[3]展示了RedisTemplate针对不同数据结构的操作方法。引用[4]列出了所需的jar包。步骤:1.添加依赖:在pom.xml中添加Spring DataRedis和Jedis(或Lettuce)的依赖。2.配置连接池:使用Jedis连接池,配置参数如最大连接数、最大空闲连接等。3.配置RedisConnectionFactory:设置连接池和Redis服务器地址。4.配置RedisTemplate:设置key和value的序列化方式(通常使用StringRedisSerializer)。5.封装RedisUtil:提供常用的操作方法。下面详细说明:第一步:添加依赖(以Maven为例)```xml<dependencies><!--Spring DataRedis --><dependency><groupId>org.springframework.data</groupId><artifactId>spring-data-redis</artifactId><version>2.5.4</version><!--请根据实际情况选择版本--></dependency><!-- Jedis客户端--><dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId><version>3.6.0</version><!--请根据实际情况选择版本 --></dependency><!--连接池依赖 --><dependency><groupId>org.apache.commons</groupId><artifactId>commons-pool2</artifactId><version>2.9.0</version></dependency></dependencies>```第二步:配置连接池和Redis连接工厂(以Java配置为例)创建一个配置类,例如RedisConfig.java: ```javaimport org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration; importorg.springframework.data.redis.connection.RedisStandaloneConfiguration; importorg.springframework.data.redis.connection.jedis.JedisConnectionFactory;import org.springframework.data.redis.core.RedisTemplate;import org.springframework.data.redis.serializer.StringRedisSerializer; importredis.clients.jedis.JedisPoolConfig;@Configurationpublicclass RedisConfig {@BeanpublicJedisPoolConfigjedisPoolConfig() {JedisPoolConfig poolConfig =new JedisPoolConfig();//最大连接数poolConfig.setMaxTotal(100);//最大空闲连接数poolConfig.setMaxIdle(50);//最小空闲连接数poolConfig.setMinIdle(20);//当连接池资源耗尽时,等待时间,超出则抛异常,默认为-1(永不超时)poolConfig.setMaxWaitMillis(2000);//从连接池获取连接时,是否进行有效性检查(ping)poolConfig.setTestOnBorrow(true);//向连接池归还连接时,是否进行有效性检查poolConfig.setTestOnReturn(true);//连接空闲时是否进行有效性检查poolConfig.setTestWhileIdle(true);returnpoolConfig;}@Beanpublic JedisConnectionFactory jedisConnectionFactory(JedisPoolConfigjedisPoolConfig) {RedisStandaloneConfiguration config= newRedisStandaloneConfiguration();config.setHostName("localhost");config.setPort(6379);config.setPassword("yourpassword");//如果有密码config.setDatabase(0);//选择数据库JedisConnectionFactory factory= newJedisConnectionFactory(config);factory.setPoolConfig(jedisPoolConfig);return factory;}@BeanpublicRedisTemplate<String,Object>redisTemplate(JedisConnectionFactory jedisConnectionFactory){RedisTemplate<String,Object>template =new RedisTemplate<>();template.setConnectionFactory(jedisConnectionFactory);//设置key的序列化器template.setKeySerializer(new StringRedisSerializer());template.setHashKeySerializer(newStringRedisSerializer());//设置value的序列化器,这里使用Jackson2JsonRedisSerializer来序列化对象//注意:使用Jackson2JsonRedisSerializer需要添加相关依赖(如jackson-databind)//如果只是存储字符串,可以使用StringRedisSerializer//template.setValueSerializer(new StringRedisSerializer());// template.setHashValueSerializer(new StringRedisSerializer());//为了简化,这里value也使用字符串序列化器template.setValueSerializer(newStringRedisSerializer());template.setHashValueSerializer(new StringRedisSerializer());template.afterPropertiesSet();returntemplate;}} ```第三步:封装RedisUtil工具类引用[1]中建议封装RedisUtil类,提供一些常用方法。 ```javaimport org.springframework.data.redis.core.RedisTemplate;import org.springframework.stereotype.Component;import javax.annotation.Resource; importjava.util.concurrent.TimeUnit;@Componentpublic classRedisUtil{@Resourceprivate RedisTemplate<String, Object> redisTemplate;//设置字符串值public voidset(Stringkey,Objectvalue){redisTemplate.opsForValue().set(key,value);}//设置字符串值并设置过期时间(单位:秒)public voidset(Stringkey,Object value, longtimeout){redisTemplate.opsForValue().set(key,value,timeout,TimeUnit.SECONDS);}//获取字符串值publicObject get(String key) {returnredisTemplate.opsForValue().get(key);}//删除keypublic Booleandelete(Stringkey){return redisTemplate.delete(key);}//设置过期时间publicBoolean expire(String key, longtimeout){return redisTemplate.expire(key, timeout, TimeUnit.SECONDS);}//其他方法,如操作Hash、List、Set等,根据需求封装}```第四步:使用示例在Service中注入RedisUtil并使用: ```javaimport org.springframework.stereotype.Service;import javax.annotation.Resource; @Servicepublicclass ExampleService {@ResourceprivateRedisUtilredisUtil;public voidexample(){//存储字符串redisUtil.set("name","JohnDoe",60);//60秒后过期//获取Stringname =(String) redisUtil.get("name");System.out.println(name);//输出:John Doe//删除redisUtil.delete("name");} }```注意事项:1.序列化方式:根据实际存储的数据类型选择合适的序列化方式。如果存储对象,建议使用Jackson2JsonRedisSerializer(需要添加jackson依赖)并配置ObjectMapper。2.连接池参数:根据实际需求调整连接池参数。3.密码:如果Redis服务器设置了密码,务必在配置中设置。这样,我们就完成了RedisTemplate的连接池配置和使用示例。相关问题:1.如何选择RedisTemplate的序列化方式?2.Redis连接池参数如何调优?3.除了Jedis,还有哪些Redis客户端可以使用?</think>### 在Spring Data Redis中配置RedisTemplate连接池 #### 1. **添加依赖** 在`pom.xml`中添加以下依赖: ```xml <dependencies> <!-- Spring Data Redis --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> <!-- Jedis客户端(连接池实现) --> <dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> </dependency> </dependencies> ``` #### 2. **配置连接池参数** 在`application.yml`中配置连接池参数: ```yaml spring: redis: host: localhost port: 6379 password: yourpassword # 若无密码可省略 jedis: pool: max-active: 20 # 最大连接数 max-idle: 10 # 最大空闲连接 min-idle: 5 # 最小空闲连接 max-wait: 2000ms # 获取连接的最大等待时间 ``` #### 3. **配置RedisTemplate** 创建Java配置类`RedisConfig.java`: ```java import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.data.redis.connection.RedisConnectionFactory; import org.springframework.data.redis.connection.jedis.JedisConnectionFactory; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.data.redis.serializer.StringRedisSerializer; @Configuration public class RedisConfig { @Bean public JedisConnectionFactory jedisConnectionFactory() { return new JedisConnectionFactory(); // 自动读取application.yml配置 } @Bean public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory connectionFactory) { RedisTemplate<String, Object> template = new RedisTemplate<>(); template.setConnectionFactory(connectionFactory); // 设置Key的序列化方式(防止乱码) template.setKeySerializer(new StringRedisSerializer()); template.setHashKeySerializer(new StringRedisSerializer()); // 建议Value使用JSON序列化(需额外配置Jackson) // template.setValueSerializer(new GenericJackson2JsonRedisSerializer()); return template; } } ``` #### 4. **封装RedisUtil工具类** 建议封装工具类简化操作(引用[^1]): ```java import org.springframework.data.redis.core.RedisTemplate; import org.springframework.stereotype.Component; import java.util.concurrent.TimeUnit; @Component public class RedisUtil { private final RedisTemplate<String, Object> redisTemplate; public RedisUtil(RedisTemplate<String, Object> redisTemplate) { this.redisTemplate = redisTemplate; } // 存储字符串(带过期时间) public void set(String key, Object value, long timeout) { redisTemplate.opsForValue().set(key, value, timeout, TimeUnit.SECONDS); } // 获取字符串 public Object get(String key) { return redisTemplate.opsForValue().get(key); } // 操作Hash public void hPut(String key, String field, Object value) { redisTemplate.opsForHash().put(key, field, value); } // 其他操作:List/Set/ZSet等(引用[^3]) // redisTemplate.opsForList(), redisTemplate.opsForSet()... } ``` #### 5. **使用示例** 在Service中注入工具类: ```java import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @Service public class UserService { @Autowired private RedisUtil redisUtil; public void cacheUserData(String userId, User user) { // 缓存用户数据(30分钟过期) redisUtil.set("user:" + userId, user, 1800); } public User getCachedUser(String userId) { return (User) redisUtil.get("user:" + userId); } } ``` #### 关键配置说明 | **参数** | **作用** | **推荐值** | |------------------|----------------------------------|-----------| | `max-active` | 最大连接数(避免资源耗尽) | 20 | | `max-idle` | 最大空闲连接(提高复用率) | 10 | | `min-idle` | 最小空闲连接(防止突发流量) | 5 | | `max-wait` | 获取连接等待时间(避免阻塞) | 2000ms | > **注意**:序列化方式需根据数据类型选择: > - `StringRedisSerializer`:字符串类型(推荐Key使用) > - `GenericJackson2JsonRedisSerializer`:对象类型(需添加Jackson依赖) > - `JdkSerializationRedisSerializer`:Java原生序列化(有安全风险) --- ### 相关问题 1. **如何优化RedisTemplate在高并发场景下的性能?** - 连接池参数调优(如`max-active`)、Pipeline批量操作、异步API使用等。 2. **RedisTemplate的序列化方式有哪些优缺点?** - 对比`StringRedisSerializer`、`Jackson2JsonRedisSerializer`、`JdkSerializationRedisSerializer`的效率和安全性。 3. **Spring Data Redis如何实现分布式锁?** - 结合`SETNX`命令和Lua脚本实现原子操作(需处理超时和续约问题)。 4. **连接池配置不当会导致哪些问题?** - 连接泄漏(未及时释放)、资源耗尽(`max-active`过小)、长尾延迟(`max-wait`不合理)等。 5. **如何监控Redis连接池状态?** - 通过`JedisPool`的`getNumActive()`等方法或集成Micrometer暴露指标[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值