redis的pipeline(附有redisTemplate使用的代码示例)

文章目录

  • 一、介绍
  • 二、API
    • 1、String
    • 2、Hash
    • 3、List
      • 1)pop删除并返回元素
    • 4、Set
      • 1)添加元素
      • 2)删除元素
      • 3)pop移除并返回几个随机的元素
    • 5、ZSet
  • 三、示例
    • 1、List的批量right pop


一、介绍

  • 由于redis是一个高性能的单线程的key-value数据库,它的执行过程为
    1. 发送命令
    2. 命令排队
    3. 命令执行
    4. 返回结果
  • 当我们执行一些批量操作但又没有批量操作的api时,如:List没有提供批量pop的api,批量pop时需要循环pop,相当于将以上4个步骤批量执行N次,1、4 称为Round Trip Time(RTT,往返时间),在一条简单指令中,往往1、4步骤之和大过于2、3步骤之和
  • Redis提供了pipeline管道机制,是客户端提供的一种批处理技术,它能将一组Redis命令进行组装,通过一次RTT传输给Redis,并将这组Redis命令的执行结果按顺序返回给客户端,大幅减少网络io开销,从而提升整体服务的性能

二、API

  • 各个接口的实现类都是DefaultStringRedisConnection
  • api的key、value入参基本都是byte[]类型,所以需要借助序列化器来转换

1、String

  • 使用的是RedisStringCommands接口中的api

2、Hash

  • 使用的是RedisHashCommands接口中的api
  • api是大多h开头

3、List

  • 使用的是RedisListCommands接口中的api
  • api是大多l开头

1)pop删除并返回元素

//左侧弹出
byte[] lPop(byte[] key);

//右侧弹出
byte[] rPop(byte[] key);

//阻塞式左侧弹出(block left pop),当给定列表内没有任何元素可供弹出的时候,连接将被 BLPOP命令阻塞,直到等待超时或发现可弹出元素为止
List<byte[]> bLPop(int timeout, byte[]... keys);

//阻塞式右侧弹出(block right pop)
List<byte[]> bRPop(int timeout, byte[]... keys);

4、Set

  • 使用的是RedisSetCommands接口中的api
  • api是大多s开头

1)添加元素

Long sAdd(byte[] key, byte[]... values);

connection.sAdd(keySerializer.serialize(key),valueSerializer.serialize(element));

2)删除元素

Long sRem(byte[] key, byte[]... values);

3)pop移除并返回几个随机的元素

//1个
byte[] sPop(byte[] key);

//多个
List<byte[]> sPop(byte[] key, long count);

5、ZSet

  • 使用的是RedisZSetCommands接口中的api
  • api是大多z开头

三、示例

1、List的批量right pop

//弹出的数量
long popNum=10L;
String key="pipeline-test";

//这里要获取项目配置的redis的key、value的序列化器,否则其它地方使用该缓存数据会出问题
RedisSerializer keySerializer=redisTemplate.getKeySerializer();
RedisSerializer valueSerializer=redisTemplate.getValueSerializer();

//当代码执行到exec的时候,它才会真正去连接服务器,然后把待执行的命令在一个事务中一次性执行完成,并返回一个List
//返回的List泛型就是存入的类型
List<User> result=redisTemplate.executePipelined((RedisCallback<String>)connection->{
    //api的key、value入参基本都是byte[]类型,所以需要借助序列化器来包装
    for(long i=1;i<=popNum;i++){
        connection.rPop(keySerializer.serialize(key));
    }
    //必须返回null,因为返回值会被管道的返回值覆盖,外层取不到这里的返回值
    return null;
});

你可能感兴趣的:(redis,redis,数据库,java)