package org.scache.cache.redis;
import org.scache.serialization.ISerializer;
import redis.clients.jedis.BinaryClient.LIST_POSITION;
import redis.clients.jedis.JedisPool;
import java.io.Serializable;
import java.util.*;
/**
* Redis的 {@link List}实现
*
* @author 君枫
* @since 2014-8-15 下午2:21:06
*/
@SuppressWarnings("unchecked")
class RedisList<T extends Serializable> extends AbstractRedisObject implements List<T> {
private static final int batchSize = 50;
RedisList(String listName, JedisPool jedisPool, ISerializer serializer) {
super(listName, jedisPool, serializer);
}
@Override
public int size() {
return getJedis().llen(redisKeyByteArray).intValue();
}
@Override
public boolean isEmpty() {
return size() == 0;
}
@Override
public boolean contains(Object o) {
return indexOf(o) != -1;
}
@Override
public Iterator<T> iterator() {
return listIterator(0);
}
@Override
public ListIterator<T> listIterator(final int ind) {
return new ListIterator<T>() {
private int currentIndex = ind - 1;
private boolean removeExecuted;
@Override
public boolean hasNext() {
int size = size();
return currentIndex + 1 < size && size > 0;
}
@Override
public T next() {
if (!hasNext()) {
throw new NoSuchElementException("No such element at index " + currentIndex);
}
currentIndex++;
removeExecuted = false;
return RedisList.this.get(currentIndex);
}
@Override
public void remove() {
if (removeExecuted) {
throw new IllegalStateException("Element been already deleted");
}
RedisList.this.remove(currentIndex);
currentIndex--;
removeExecuted = true;
}
@Override
public boolean hasPrevious() {
int size = size();
return currentIndex - 1 < size && size > 0 && currentIndex >= 0;
}
@Override
public T previous() {
if (!hasPrevious()) {
throw new NoSuchElementException("No such element at index " + currentIndex);
}
removeExecuted = false;
T res = RedisList.this.get(currentIndex);
currentIndex--;
return res;
}
@Override
public int nextIndex() {
return currentIndex + 1;
}
@Override
public int previousIndex() {
return currentIndex;
}
@Override
public void set(T e) {
if (currentIndex >= size() - 1) {
throw new IllegalStateException();
}
RedisList.this.set(currentIndex, e);
}
@Override
public void add(T e) {
RedisList.this.add(currentIndex + 1, e);
currentIndex++;
}
};
}
@Override
public Object[] toArray() {
List<T> list = subList(0, size());
return list.toArray();
}
@Override
public <V> V[] toArray(V[] a) {
List<T> list = subList(0, size());
return list.toArray(a);
}
@Override
public boolean add(T e) {
return getJedis().rpush(redisKeyByteArray, serialize(e)) > 0;
}
@Override
public boolean remove(Object o) {
return remove(o, 1);
}
protected boolean remove(final Object o, final int count) {
return getJedis().lrem(redisKeyByteArray, count, serialize((T) o)) > 0;
}
@Override
public boolean containsAll(Collection<?> c) {
if (isEmpty()) {
return false;
}
Collection<Object> copy = new ArrayList<Object>(c);
int to = div(size(), batchSize);
for (int i = 0; i < to; i++) {
List<byte[]> byteList = getJedis().lrange(redisKeyByteArray, i * batchSize, i * batchSize + batchSize - 1);
List<T> list = deserializeValue(byteList);
for (Iterator<Object> iterator = copy.iterator(); iterator.hasNext(); ) {
Object obj = iterator.next();
int index = list.indexOf(obj);
if (index != -1) {
iterator.remove();
}
}
}
return copy.isEmpty();
}
@Override
public boolean addAll(Collection<? extends T> c) {
return getJedis().rpush(redisKeyByteArray, serializeValue((List<T>) c)) >= c.size();
}
@Override
public boolean addAll(int index, Collection<? extends T> c) {
if (index > 0) {
byte[] lastElemnt = getByteArray(index - 1);
byte[] currentElemnt;
for (T v : c) {
currentElemnt = serialize(v);
getJedis().linsert(redisKeyByteArray, LIST_POSITION.AFTER, lastElemnt, currentElemnt);
lastElemnt = currentElemnt;
}
} else if (index == 0) {
Collections.reverse((List<?>) c);
byte[][] bytes = serializeValue((Collection<T>) c);
getJedis().lpush(redisKeyByteArray, bytes);
} else
return false;
return true;
}
@Override
public boolean removeAll(Collection<?> c) {
boolean flag = true;
for (Object o : c) {
if (!remove(o))
flag = false;
}
return flag;
}
@Override
public boolean retainAll(Collection<?> c) {
boolean changed = false;
for (Iterator<T> iterator = iterator(); iterator.hasNext(); ) {
T object = iterator.next();
if (!c.contains(object)) {
iterator.remove();
changed = true;
}
}
return changed;
}
@Override
public void clear() {
getJedis().del(redisKeyByteArray);
}
@Override
public T get(int index) {
return deserialize(getJedis().lindex(redisKeyByteArray, index));
}
protected byte[] getByteArray(int index) {
checkIndex(index, size());
return getJedis().lindex(redisKeyByteArray, index);
}
@Override
public T set(int index, T element) {
checkIndex(index, size());
T old = get(index);
getJedis().lset(redisKeyByteArray, index, serialize(element));
return old;
}
@Override
public void add(int index, T element) {
if (index > 0) {
getJedis().linsert(redisKeyByteArray, LIST_POSITION.AFTER, getByteArray(index - 1), serialize(element));
} else if (index == 0) {
getJedis().lpush(redisKeyByteArray, serialize(element));
}
}
private void checkIndex(int index, int size) {
if (!isInRange(index, size))
throw new IndexOutOfBoundsException("index: " + index + " but current size: " + size);
}
private boolean isInRange(int index, int size) {
return index >= 0 && index < size;
}
T removeFromLeft(int index, int size) {
List<byte[]> byteList = getJedis().lrange(redisKeyByteArray, 0, index);
getJedis().ltrim(redisKeyByteArray, index + 1, size - 1);// 只保留另一半
T removed = deserialize(byteList.remove(index));
Collections.reverse(byteList);
byte[][] reversedBytes = new byte[byteList.size()][];
byteList.toArray(reversedBytes);
没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![java](https://img-home.csdnimg.cn/images/20210720083646.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
收起资源包目录
![package](https://csdnimg.cn/release/downloadcmsfe/public/img/package.f3fc750b.png)
![folder](https://csdnimg.cn/release/downloadcmsfe/public/img/folder.005fa2e5.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![folder](https://csdnimg.cn/release/downloadcmsfe/public/img/folder.005fa2e5.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![folder](https://csdnimg.cn/release/downloadcmsfe/public/img/folder.005fa2e5.png)
![folder](https://csdnimg.cn/release/downloadcmsfe/public/img/folder.005fa2e5.png)
![folder](https://csdnimg.cn/release/downloadcmsfe/public/img/folder.005fa2e5.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![folder](https://csdnimg.cn/release/downloadcmsfe/public/img/folder.005fa2e5.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![folder](https://csdnimg.cn/release/downloadcmsfe/public/img/folder.005fa2e5.png)
![folder](https://csdnimg.cn/release/downloadcmsfe/public/img/folder.005fa2e5.png)
![folder](https://csdnimg.cn/release/downloadcmsfe/public/img/folder.005fa2e5.png)
![folder](https://csdnimg.cn/release/downloadcmsfe/public/img/folder.005fa2e5.png)
![folder](https://csdnimg.cn/release/downloadcmsfe/public/img/folder.005fa2e5.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![folder](https://csdnimg.cn/release/downloadcmsfe/public/img/folder.005fa2e5.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![folder](https://csdnimg.cn/release/downloadcmsfe/public/img/folder.005fa2e5.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![folder](https://csdnimg.cn/release/downloadcmsfe/public/img/folder.005fa2e5.png)
![folder](https://csdnimg.cn/release/downloadcmsfe/public/img/folder.005fa2e5.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![folder](https://csdnimg.cn/release/downloadcmsfe/public/img/folder.005fa2e5.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![folder](https://csdnimg.cn/release/downloadcmsfe/public/img/folder.005fa2e5.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![folder](https://csdnimg.cn/release/downloadcmsfe/public/img/folder.005fa2e5.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![folder](https://csdnimg.cn/release/downloadcmsfe/public/img/folder.005fa2e5.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![folder](https://csdnimg.cn/release/downloadcmsfe/public/img/folder.005fa2e5.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![folder](https://csdnimg.cn/release/downloadcmsfe/public/img/folder.005fa2e5.png)
![folder](https://csdnimg.cn/release/downloadcmsfe/public/img/folder.005fa2e5.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
共 48 条
- 1
资源评论
![avatar-default](https://csdnimg.cn/release/downloadcmsfe/public/img/lazyLogo2.1882d7f4.png)
![avatar](https://profile-avatar.csdnimg.cn/de50ac10e30e41b89db28203f97239be_qq_41701956.jpg!1)
Java程序员-张凯
- 粉丝: 1w+
- 资源: 6826
上传资源 快速赚钱
我的内容管理 展开
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助
![voice](https://csdnimg.cn/release/downloadcmsfe/public/img/voice.245cc511.png)
![center-task](https://csdnimg.cn/release/downloadcmsfe/public/img/center-task.c2eda91a.png)
最新资源
- ReportPlus 数据报表中心小程序 使用了 ucharts 和 wyb-table 两插件实现的数据报表功能
- 1177-555定时器接成的施密特触发器.ms14
- kernel-ml-devel-6.6.1-1.el7.elrepo.x86-64.rpm
- 基于原生小程序实现的借书小程序
- kernel-ml-6.6.1-1.el7.elrepo.x86-64.rpm
- LM555定时器 多谐振荡器Multisim仿真
- Java项目-基于SSM+JSP的高校人事管理系统的设计与实现(源码+数据库脚本+部署视频+代码讲解视频+全套软件)
- sklearn中的支持向量机.ipynb
- python2.7下载
- Java项目-基于SSM+JSP的固定资产管理系统的设计与实现(源码+数据库脚本+部署视频+代码讲解视频+全套软件)
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
![feedback](https://img-home.csdnimg.cn/images/20220527035711.png)
![feedback](https://img-home.csdnimg.cn/images/20220527035711.png)
![feedback-tip](https://img-home.csdnimg.cn/images/20220527035111.png)
安全验证
文档复制为VIP权益,开通VIP直接复制
![dialog-icon](https://csdnimg.cn/release/downloadcmsfe/public/img/green-success.6a4acb44.png)