Redis数据结构之List
概述
在Redis中,List类型是按照插入顺序排序的字符串链表。和数据结构中的普通链表一样,我们可以在其头部(left)和尾部(right)添加新的元素。在插入时,如果该键并不存在,Redis将为该键创建一个新的链表。与此相反,如果链表中所有的元素均被移除,那么该键也将会被从数据库中删除。List中可以包含的最大元素数量是4294967295。从元素插入和删除的效率视角来看,如果我们是在链表的两头插入或删除元素,这将会是非常高效的操作,即使链表中已经存储了百万条记录,该操作也可以在常量时间内完成。然而需要说明的是,如果元素插入或删除操作是作用于链表中间,那将会是非常低效的。相信对于有良好数据结构基础的开发者而言,这一点并不难理解。
List相关功能(Redis客户端命令)
1)lpush key value1 value2…:
在指定的key所关联的list的头部插入所有的values,如果该key不存在,该命令在插入的之前创建一个与该key关联的空链表,之后再向该链表的头部插入数据。插入成功,返回元素的个数。
2)linsert key before/after value newValue
在指定的元素前或者后插入元素
3)lrange key start end:
获取链表中从start到end的元素的值,start、end可为负数,若为-1则表示链表尾部的元素,-2则表示倒数第二个,依次类推
4)lpushx key value:
仅当参数中指定的key存在时(如果与key管理的list中没有值时,则该key是不存在的)在指定的key所关联的list的头部插入value
5)rpushx key value:
在该list的尾部添加元素
6)lpop key:
返回并弹出指定的key关联的链表中的第一个元素,即头部元素。
7)rpop key:
从尾部弹出元素。
8)rpoplpush resource destination:
将链表中的尾部元素弹出并添加到头部
9)llen key:
返回指定的key关联的链表中的元素的数量。
10)lset key index value:
设置链表中的index的脚标的元素值,0代表链表的头元素,-1代表链表的尾元素。
11)lrem key count value:
删除count个值为value的元素,如果count大于0,从头向尾遍历并删除count个值为value的元素,如果count小于0,则从尾向头遍历并删除。如果count等于0,则删除链表中所有等于value的元素。
12)linsert key before|after pivot value:
在pivot元素前或者后插入value这个元素。
List相关功能(Jedis客户端API)
Redis java 客户端jedis
java测试代码如下,(maven项目的创建与pom.xml配置,还有jedis对象的创建都在redis数据结构之String)
/**
*List类型数据的API测试
*/
@Test
public void testList(){
//在链表的头部插入元素
// Long count = jedis.lpush("jedis-l-key-01", "zhangsan", "lisi", "wangwu", "zhaoliu");
// System.out.println("插入的元素个数为:"+count);
List<String> keyList = jedis.lrange("jedis-l-key-01", 0, -1);
System.out.println("创建的链表中的元素为:");
for(String s:keyList){
System.out.println(s);
}
//在链表的中间插入新元素
// jedis.linsert("jedis-l-key-01", BinaryClient.LIST_POSITION.BEFORE,"lisi","田七");
// System.out.println("插入新元素之后的链表中的元素为:");
// List<String> keyList2 = jedis.lrange("jedis-l-key-01", 0, -1);
// for(String s:keyList2){
// System.out.println(s);
// }
Long count = jedis.lrem("jedis-l-key-01", 3, "zhangsan");
System.out.println("成功删除了:"+count+"个zhangsan");
List<String> keyList3 = jedis.lrange("jedis-l-key-01", 0, -1);
System.out.println("创建的链表中的元素为:");
for(String s:keyList3){
System.out.println(s);
}
}