您的位置:首页 > 数据库 > Redis

Redis入门-1-数据模型List

2017-04-13 00:00 369 查看
摘要: Redis list是一个双向链表结构,主要功能是push、pop、获取一个范围的所有值等等。之所以说它是双向的,因为它可以在链表左,右两边分别操作。Redis List可用从两端插入元素,这样是非常高效的。如果元素插入或删除操作是作用于链表中间,那将会是非常低效的。在插入时,如果该键并不存在,Redis将为该键创建一个新的链表,因此链表可以被自动创建,在使用时无需判断其是否存在。与此相反,如果链表中所有的元素均被移除,那么该键也将会被从数据库中删除

Redis入门-数据模型List

List列表

list列表是简单的字符串列表,按照插入顺序排序,使其成为消息队列的理想工具。在list中您可以序列化任何对象并将其作为字符串进行持久化,因此队列中的消息可以在需要时携带更复杂的数据。

头元素和尾元素:头元素指的是列表的左端/前端第一个元素,尾元素指的是列表右端/后端的第一个元素。举个例子列表中包含三个元素:x,y,z ,其中x是头元素,二z是尾元素。

空列表:不包含任何元素的列表,redis将不存的key也视为空列表。

1.将值value插入到列表

1.1 LPUSH

LPUSH key value [value ...]

将一个或多个值value插入到列表key的表头。同时插入多个value值,那么各个values值按照从左到右的顺序依次插入到表头:比如对queue#tasks同时lpush插入a b c三个value,则结果列表为c , b ,a 。 如果key不存在,一个空的列表将会被创建并被执行LPUSH操作。

当key存在但是不是列表类型时候,会返回一个错误。该操作的时间复杂度是O(1)。执行LPUSH命令后,返回的值时列表的长度。(Note:插入多个value值时在Redis2.4以后版本的特性)

try (Jedis jedis = jedisPool.getResource()) {
//设置list数据
Long status = jedis.lpush("queue#tasks", "may","jays","codes");
Long status = jedis.lpush("queue#tasks", "three");
System.out.println(status); //lpush返回的值是 list的列表的长度
Long two = jedis.lpush("queue#tasks", "four");
System.out.println(two);

//计算长度
Long length = jedis.llen("queue#tasks");
System.out.println("list length:" +length);
}

1.2 LPUSHX

LPUSHX key value

将值value插入到列表key的表头,并且仅当key存在并且是一个列表。与LPUSH相反,当key不存在时,LPUSHX命令什么也不做。 时间复杂度是O(1),返回值是列表的长度。

#对一个空的列表进行lpushx
Redis> LLEN greet #greet是一个空的列表
(integer) 0
Redis> LPUSHX greet "hello"        #尝试lpushx失败,因为列表为空
(integer) 0

# 对一个已经存在列表进行lpushx
Redis> LPUSH greet "hello"          #使用lpush创建一个greet列表
(integer) 1
Redis> llen greet                   #greet列表已经存在
(integer) 1
Redis> LPUSHX greet "good morning"  #使用lpushx进行插入操作
(integer) 2
Redis> lrange greet 0 -1     #遍历greet列表
1) "good morning"
2) "hello"
Redis> llen greet  #列表长度
(integer) 2

1.3 RPUSH

RPUSH key value [value ...]

将一个或多个value插入到列表的key的表尾部。

如果将多个value值,那个哥哥value的值按照从左到右的顺序依次插入到表尾部:比如对一个空列表执行RPUSH a b c 。队列顺序也为a b c。

如果key不存在,一个空的列表将被创建并执行RPUSH操作。当key存在但并不是列表类型时候,返回一个错误。(Note:插入多个值时Redis2.4版本以前的RPUSH命令)

Redis> rpush greet "a" "b" "c" #在队列尾部插入
(integer) 5
Redis> lrange greet 0 -1
1) "good morning"
2) "hello"
3) "a"
4) "b"
5) "c"

Redis> rpush c/EV78945 "goood" #对一个非list类型的数据结构
(error) WRONGTYPE Operation against a key holding the wrong kind of value

1.4 RPUSHX

RPUSHX key value

将值的value插入到列表key的表尾,当且仅当key存在并且是一个列表。

和RPUSH命令相反,当key不存在时,RPUSHX命令什么也不做。

时间复杂度O(1),返回值RPUSHX命令执行之后,表的长度。

redis> lrange greet 0 -1
1) "good morning"
2) "hello"
3) "a"
4) "b"
5) "c"
redis> rpushx greet "end"
(integer) 5

1.5 LPOP

LPOP key

移除并返回列表key的头元素。
时间复杂度O(1),返回值是列表的头元素,当key不存在时,返回null

redis> lrange greet 0 -1
1) "hello"
2) "a"
3) "b"
4) "c"
5) "end"
redis> lpop greet #从队列头部进行删除,hello将被删除
"hello"
redis> lrange greet 0 -1
1) "a"
2) "b"
3) "c"
4) "end"

1.6 RPOP

rpop greet

移除并返回列表key的尾部元素。
时间复杂度O(1)。返回值列表的尾元素。当key不存在时,返回null。

redis> lrange greet 0 -1
1) "a"
2) "b"
3) "c"
4) "end"
redis> rpop greet #从队列的尾部删除,end将被删除
"end"
redis> lrange greet 0 -1
1) "a"
2) "b"
3) "c"

1.7 LRANGE

lrange greet startIndex endIndex

获取队列中从startIndex,到endIndex之间的元素。其中start的值也可以为负值,-1将表示链表中的最后一个元素,即尾部元素,-2表示倒数第二个并以此类推。该命令在获取元素时,start和end位置上的元素也会被取出。如果start的值大于链表中元素的数量,空链表将会被返回。如果end的值大于元素的数量,该命令则获取从start(包括start)开始,链表中剩余的所有元素。

redis> lrange greet 0 -1
1) "a"
2) "b"
3) "c"

1.8 RPOPLPUSH

RPOPLPUSH sourcedestination

原子性的从与source键关联的链表尾部弹出一个元素,同时再将弹出的元素插入到与destination键关联的链表的头部。如果source键不存在,该命令将返回nil,同时不再做任何其它的操作了。如果source和destination是同一个键,则相当于原子性的将其关联链表中的尾部元素移到该链表的头部。该方法的复杂度就是O(1)。

redis> lrange greet 0 -1
1) "a"
2) "b"
redis> rpoplpush greet greet-copy
"b"
redis> lrange greet-copy 0 -1
1) "b"
redis> lrange greet 0 -1
1) "a"

1.9 其它操作方法

LINDEX key index
返回请求的元素,如果index超出范围,则返回nil

LSET key index value
设定链表中指定位置的值为新值。其中0表示第一个元素,即头部元素,-1表示尾部元素

LRANGE key start stop 返回指定范围内元素的列表。其中0表示第一个元素,即头部元素,-1表示尾部元素.

LTRIM key start stop 该命令将仅保留指定范围内的元素。

参考博客
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Redis List 数据结构