定长队列和淘汰队列都是固定长度的队列。
不同之处是定长队列超过定长后后面的元素不添加了,而淘汰队列超过定长后面添加的元素添加后最前面的元素会删掉。
package com.foxbill.redisinaction;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.Pipeline;
import java.util.List;
/**
* 定长队列和淘汰队列
*/
public class Chapter27 {
static private String KEY_QUEUE = "Chapter27:fixedlenqueue";
static private int MAX_QUEUE_SIZE = 10;
static public void start(Jedis jedis) {
cleanData(jedis);
testFixedLen(jedis);
cleanData(jedis);
testEliminate(jedis);
}
//清除测试数据
private static void cleanData(Jedis jedis) {
jedis.del(KEY_QUEUE);
}
//测试定长队列
private static void testFixedLen(Jedis jedis) {
for (int i = 0; i <12; i++) {
addFixedLen(jedis,"item:"+String.valueOf(i));
}
//打印队列
List<String> list = jedis.lrange(KEY_QUEUE, 0, -1);
String result = String.join(",", list);
// 输出结果
System.out.println(result);
}
//测试淘汰队列
private static void testEliminate(Jedis jedis) {
for (int i = 0; i <12; i++) {
addEliminate(jedis,"item:"+String.valueOf(i));
}
//打印队列
List<String> list = jedis.lrange(KEY_QUEUE, 0, -1);
String result = String.join(",", list);
// 输出结果
System.out.println(result);
}
//定长队列添加元素
private static void addFixedLen(Jedis jedis,String item) {
Pipeline pipelined = jedis.pipelined();
//先添加,后截断
pipelined.rpush(KEY_QUEUE, item);
//保留最旧的MAX_QUEUE_SIZE个元素
pipelined.ltrim(KEY_QUEUE, 0, MAX_QUEUE_SIZE-1);
pipelined.syncAndReturnAll();
}
//淘汰队列添加元素
private static void addEliminate(Jedis jedis,String item) {
Pipeline pipelined = jedis.pipelined();
//先添加,后截断
pipelined.rpush(KEY_QUEUE, item);
//保留最新的MAX_QUEUE_SIZE个元素
pipelined.ltrim(KEY_QUEUE, 0-MAX_QUEUE_SIZE, -1);
pipelined.syncAndReturnAll();
}
}

被折叠的 条评论
为什么被折叠?



