-
lpush
从左边(队头)添加数据。 -
rpop
从右边(队尾)拉取数据
l
p
u
s
h
+
r
p
o
p
可
以
实
现
队
列
。
\color{#FF0000}{ lpush+rpop可以实现队列。}
lpush+rpop可以实现队列。
l
p
u
s
h
+
l
p
o
p
可
以
实
现
栈
的
功
能
。
\color{#FF0000}{ lpush+lpop可以实现栈的功能。}
lpush+lpop可以实现栈的功能。
l
p
u
s
h
+
b
r
p
o
p
\color{#FF0000}{lpush+brpop}
lpush+brpop可以实现阻塞队列
l
p
u
s
h
+
l
t
r
i
m
\color{#FF0000}{lpush+ltrim}
lpush+ltrim可以实现固定大小的容器
应用场景案例:Redis用List实现队列。从左端添加数据,从右端消费数据。
//添加任务
final ScheduledFuture<?> scheduledFuture = SCHEDULED_EXECUTOR_SERVICE.scheduleAtFixedRate(new Runnable() {
@Override
public void run() {
//添加任务
redisTemplate.executePipelined(new SessionCallback<Object>() {
@Override
public Object execute(RedisOperations operations) throws DataAccessException {
for (int i = 0; i < 2000; i++) {
operations.opsForList().leftPush(SCHEDULE_TASK_PREFIX, "task:" + atomicInteger.incrementAndGet());
}
return null;
}
});
}
}, 0, 2, TimeUnit.SECONDS);
消费任务
for (int i = 0; i < 10; i++) {
SCHEDULED_EXECUTOR_SERVICE.scheduleAtFixedRate(new Runnable() {
@Override
public void run() {
//消费任务
List<Object> objects = redisTemplate.executePipelined(new SessionCallback<Object>() {
@Override
public Object execute(RedisOperations operations) throws DataAccessException {
for (int i = 0; i < 100; i++) {
operations.opsForList().rightPop(SCHEDULE_TASK_PREFIX);
}
return null;
}
});
}
}, 0, 1, TimeUnit.SECONDS);
}
主线程监听队列
while (true) {
Thread.sleep(5000);
if (atomicInteger.get() > 100000) {
scheduledFuture.cancel(true);
}
System.out.println("当前任务数:" + redisTemplate.opsForList().size(SCHEDULE_TASK_PREFIX));
}
基于list的延迟队列设计方案
说明:
- 主要用到了list类型中阻塞相关的命令。