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),返回值是列表的长度。
#对一个空的列表进行lpushxRedis> LLEN greet #greet是一个空的列表(integer) 0Redis> LPUSHX greet "hello" #尝试lpushx失败,因为列表为空(integer) 0# 对一个已经存在列表进行lpushxRedis> LPUSH greet "hello" #使用lpush创建一个greet列表(integer) 1Redis> llen greet #greet列表已经存在(integer) 1Redis> LPUSHX greet "good morning" #使用lpushx进行插入操作(integer) 2Redis> 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) 5Redis> lrange greet 0 -11) "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 -11) "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 -11) "hello"2) "a"3) "b"4) "c"5) "end"redis> lpop greet #从队列头部进行删除,hello将被删除"hello"redis> lrange greet 0 -11) "a"2) "b"3) "c"4) "end"
1.6 RPOP
rpop greet
移除并返回列表key的尾部元素。 时间复杂度O(1)。返回值列表的尾元素。当key不存在时,返回null。
redis> lrange greet 0 -11) "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 该命令将仅保留指定范围内的元素。