文章目录
- 一、介绍
- 二、API
-
- 1、String
- 2、Hash
- 3、List
-
- 1)pop删除并返回元素
- 4、Set
-
- 1)添加元素
- 2)删除元素
- 3)pop移除并返回几个随机的元素
- 5、ZSet
- 三、示例
-
- 1、List的批量right pop
一、介绍
- 由于redis是一个高性能的单线程的key-value数据库,它的执行过程为
- 发送命令
- 命令排队
- 命令执行
- 返回结果
- 当我们执行一些批量操作但又没有批量操作的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命令阻塞,直到等待超时或发现可弹出元素为止
Listbyte[]> bLPop(int timeout, byte[]... keys);
//阻塞式右侧弹出(block right pop)
Listbyte[]> 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);
//多个
Listbyte[]> 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泛型就是存入的类型
ListUser> result=redisTemplate.executePipelined((RedisCallbackString>)connection->{
//api的key、value入参基本都是byte[]类型,所以需要借助序列化器来包装
for(long i=1;ipopNum;i++){
connection.rPop(keySerializer.serialize(key));
}
//必须返回null,因为返回值会被管道的返回值覆盖,外层取不到这里的返回值
return null;
});
服务器托管,北京服务器托管,服务器租用 http://www.fwqtg.net
震惊!谣言吧!求辟谣!默哀! 左耳朵耗子,在程序员这个群体里应该属于 GOAT 的存在了,虽然每个人心目中都有自己的 GOAT,但耗子叔的影响力可以说是有目共睹。 我也是在技术群刷到这张图片的,相信大多数小伙伴和我一样:震惊!谣言吧!求辟谣!默哀! 希望大家都…