redis 管道批量操作

284 阅读1分钟
{
    long piliangStart = System.currentTimeMillis();
    System.out.println("批量操作开始");
    RedisSerializer stringSerializer = new StringRedisSerializer();
    redisTemplate.setKeySerializer(stringSerializer);
    redisTemplate.setValueSerializer(stringSerializer);
    List<String> result = redisTemplate.executePipelined(new SessionCallback() {
        //执行流水线
        @Override
        public Object execute(RedisOperations operations) throws DataAccessException {
            //批量处理的内容
            for (int i = 0; i < 1000; i++) {
                operations.opsForHash().put("items1",i+"",i+"");
            }
            //注意这里一定要返回null,最终pipeline的执行结果,才会返回给最外层
            return null;
        }
    });
    System.out.println("批量结果集合="+result);
    long piliangEnd = System.currentTimeMillis();
    System.out.println("批量更新用时毫秒值:"+(piliangEnd-piliangStart));
    System.out.println("批量操作结束");
    System.out.println("#############################");
    System.out.println("传统操作开始");
    long l = System.currentTimeMillis();
    BoundHashOperations boundHashOperations = redisTemplate.boundHashOps("items2");
    //批量处理的内容
    for (int i = 0; i < 1000; i++) {
        boundHashOperations.put(i+"",i+"");
    }
    long l2 = System.currentTimeMillis();
    System.out.println("传统更新用时毫秒值:"+(l2-l));
    System.out.println("传统操作结束");
}

根据你的项目需求选择合适的反序列化对象。
比如我在项目中key使用的是StringRedisSerializer,
而值通常使用的是GenerJackson2JsonRedisSerializer。
所以在初始化redisTemplate的时候会这样做
将序列化的实例化对象放入redisTemplate中
当使用的时候就可以直接redis.getKeySerializer()或者redis.getValueSerializer()
这样就不用在实例化一个对象,造成浪费和冗余。

{
    RedisSerializer keySerializer = new StringRedisSerializer();
    RedisSerializer valueSerializer = new GenericJackson2JsonRedisSerializer();
    redisTemplate.setKeySerializer(keySerializer);
    redisTemplate.setValueSerializer(valueSerializer);
    redisTemplate.setHashKeySerializer(keySerializer);
    redisTemplate.setHashValueSerializer(valueSerializer);
    this.redisTemplate = redisTemplate;

}