《Redis应用实例》Java实现(27):定长队列和淘汰队列
定长队列和淘汰队列都是固定长度的队列。
不同之处是定长队列超过定长后后面的元素不添加了,而淘汰队列超过定长后面添加的元素添加后最前面的元素会删掉。
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();}}