spring data redis使用pipline

使用stringRedisTemplate.executePipelined可以向redis批量提交一批命令,进行命令批处理。效率比遍历的方式执行单条语句要高。‘

spring data redis使用pipline的两种方式。

redisTemplate.executePipelined(new RedisCallback() {
            @Override
            public Long doInRedis(RedisConnection connection) throws DataAccessException {
                StringRedisConnection conn = (StringRedisConnection) connection;
                for (String key : keys) {
                    conn.hDel(key, mapKeys);
                }
                return null;
            }
        });
redisTemplate.execute(new RedisCallback() {
            @Override
            public Object doInRedis(RedisConnection connection) throws DataAccessException {
                keyValueList.forEach(e->{
                    connection.stringCommands().set(e.getKey().getBytes(),e.getValue().getBytes());
                });
                return null;
            }
        },false,true);

基于lettuce客户端的pipline每次执行上述两个代码段仅使用连接池中的一个连接。因为lettuce客户端是基于Tcp长连接的,在一个连接中传输所有的命令。而基于Jedis的客户端上述两个代码段会使用连接池中的多个连接进行命令提交,所以一定要注意连接池中预留足够连接数。
一般redis支持的连接数很多(详见redis server maxclients参数),且每次连接中命令执行较快。所以在硬件资源充足的情况下可适当调大客户的redis连接池最大活跃连接数。
设置spring.redis.pool.max-active属性.
对于批量更新无需返回值的操作不推荐如下方式执行pipline,速度较慢。同时在Jedis客户端仍然会使用连接池中的多个连接。

stringRedisTemplate.execute(new SessionCallback(){
            @Override
            public Object execute(RedisOperations redisOperations) throws DataAccessException {
                for (String key : keys) {
                    redisOperations.opsForHash().delete(key, mapKeys);
                }
                return null;
            }
        });

你可能感兴趣的:(redis,spring-boot,spring,data,redis,spring)