【spring boot】spring boot 基于redis pipeline 管道,批量操作redis命令

 

 

spring boot 2.x 

使用RedisTemplate 操作

===================================

 

1.pom.xml

    <!--spring2.0集成redis所需common-pool2-->
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-pool2</artifactId>
            <version>2.4.2</version>
        </dependency>
        <!-- 使用redis的LUA脚本 需要序列化操作的jar-->
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-core</artifactId>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-annotations</artifactId>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
        </dependency>

 

 

2.redisConfig 需要加入spring的自动配置

/**
 * @author sxd
 * @date 2019/5/27 16:13
 */
@Configuration
@AutoConfigureAfter(RedisAutoConfiguration.class)
public class RedisConfig {



    @Bean
    public RedisTemplate<String, String> redisTemplate(RedisConnectionFactory factory) {
        RedisTemplate redisTemplate = new RedisTemplate();
        redisTemplate.setConnectionFactory(factory);
        RedisSerializer keySerializer = new StringRedisSerializer();
//        RedisSerializer valueSerializer = new GenericJackson2JsonRedisSerializer();
        //key采用字符串反序列化对象
        redisTemplate.setKeySerializer(keySerializer);
        //value也采用字符串反序列化对象
        //原因:管道操作,是对redis命令的批量操作,各个命令返回结果可能类型不同
        //可能是 Boolean类型 可能是String类型 可能是byte[]类型 因此统一将结果按照String处理
        redisTemplate.setValueSerializer(keySerializer);
        return redisTemplate;
    }


}
View Code

 

 

3.controller

  @Autowired
    RedisTemplate redisTemplate;


    /**
     * redis 批量操作其中一种方式
     * redis pipeline 管道技术
     */
    @RequestMapping(value = "/redisPipeline" )
    public void redisPipeline(){

//        1.executePipelined 重写 入参 RedisCallback 的doInRedis方法
        List<Object> resultList = redisTemplate.executePipelined(new RedisCallback<Object>() {

            @Override
            public String doInRedis(RedisConnection connection) throws DataAccessException {
//                2.connection 打开管道
                connection.openPipeline();

//                3.connection 给本次管道内添加 要一次性执行的多条命令

//                3.1 一个set操作
                byte[] key1 = "mykey1".getBytes();
                byte[] value1 = "字符串value".getBytes();
                connection.set(key1,value1);

//                3.2一个批量mset操作
                Map<byte[],byte[]> tuple = new HashMap<>();
                tuple.put("m_mykey1".getBytes(),"m_value1".getBytes());
                tuple.put("m_mykey2".getBytes(),"m_value2".getBytes());
                tuple.put("m_mykey3".getBytes(),"m_value3".getBytes());
                connection.mSet(tuple);

//                 3.3一个get操作
                connection.get("m_mykey2".getBytes());

//                4.关闭管道 不需要close 否则拿不到返回值
//                connection.closePipeline();

//                这里一定要返回null,最终pipeline的执行结果,才会返回给最外层
                return null;
            }
        });


//        5.最后对redis pipeline管道操作返回结果进行判断和业务补偿
        for (Object str : resultList) {
            System.out.println(String.valueOf(str));
        }
        
    }
View Code

 

 

运行结果:

true
true
m_value2

 

 

redis中结果:

 

posted @ 2019-05-30 15:18  Angel挤一挤  阅读(8600)  评论(0编辑  收藏  举报