|
@@ -0,0 +1,106 @@
|
|
|
|
+package com.chelvc.framework.redis.queue;
|
|
|
|
+
|
|
|
|
+import java.util.AbstractQueue;
|
|
|
|
+import java.util.Collection;
|
|
|
|
+import java.util.Iterator;
|
|
|
|
+
|
|
|
|
+import com.chelvc.framework.common.util.ObjectUtils;
|
|
|
|
+import com.chelvc.framework.redis.context.RedisContextHolder;
|
|
|
|
+import lombok.NonNull;
|
|
|
|
+import org.springframework.data.redis.core.ListOperations;
|
|
|
|
+import org.springframework.data.redis.core.RedisTemplate;
|
|
|
|
+
|
|
|
|
+/**
|
|
|
|
+ * Redis队列实现
|
|
|
|
+ *
|
|
|
|
+ * @param <E> 元素类型
|
|
|
|
+ * @author Woody
|
|
|
|
+ * @date 2024/8/19
|
|
|
|
+ */
|
|
|
|
+public class RedisQueue<E> extends AbstractQueue<E> {
|
|
|
|
+ private final String name;
|
|
|
|
+ private final RedisTemplate<String, E> template;
|
|
|
|
+
|
|
|
|
+ public RedisQueue(@NonNull String name) {
|
|
|
|
+ this(name, null);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ public RedisQueue(@NonNull String name, RedisTemplate<String, E> template) {
|
|
|
|
+ this.name = name;
|
|
|
|
+ this.template = template;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * 集合迭代器实现
|
|
|
|
+ */
|
|
|
|
+ private class Iter implements Iterator<E> {
|
|
|
|
+ private int index = 0;
|
|
|
|
+ private final int size;
|
|
|
|
+
|
|
|
|
+ public Iter(int size) {
|
|
|
|
+ this.size = size;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ @Override
|
|
|
|
+ public boolean hasNext() {
|
|
|
|
+ return this.index < this.size;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ @Override
|
|
|
|
+ public E next() {
|
|
|
|
+ return handler().index(name, this.index++);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * 获取Redis List处理器实例
|
|
|
|
+ *
|
|
|
|
+ * @return Redis List处理器实例
|
|
|
|
+ */
|
|
|
|
+ private ListOperations<String, E> handler() {
|
|
|
|
+ RedisTemplate<String, E> template = ObjectUtils.ifNull(this.template, RedisContextHolder::getDefaultTemplate);
|
|
|
|
+ return template.opsForList();
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ @Override
|
|
|
|
+ public Iterator<E> iterator() {
|
|
|
|
+ return new Iter(this.size());
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ @Override
|
|
|
|
+ public int size() {
|
|
|
|
+ Long size = this.handler().size(this.name);
|
|
|
|
+ return size == null ? 0 : size.intValue();
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ @Override
|
|
|
|
+ public boolean offer(E e) {
|
|
|
|
+ Long size = this.handler().rightPush(this.name, e);
|
|
|
|
+ return size != null && size > 0;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ @Override
|
|
|
|
+ public E poll() {
|
|
|
|
+ return this.handler().leftPop(this.name);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ @Override
|
|
|
|
+ public E peek() {
|
|
|
|
+ return this.handler().index(this.name, 0);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ @Override
|
|
|
|
+ public void clear() {
|
|
|
|
+ this.handler().getOperations().delete(this.name);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ @Override
|
|
|
|
+ @SuppressWarnings("unchecked")
|
|
|
|
+ public boolean addAll(Collection<? extends E> c) {
|
|
|
|
+ if (ObjectUtils.isEmpty(c)) {
|
|
|
|
+ return false;
|
|
|
|
+ }
|
|
|
|
+ Long size = this.handler().rightPushAll(this.name, (Collection<E>) c);
|
|
|
|
+ return size != null && size > 0;
|
|
|
|
+ }
|
|
|
|
+}
|