redis数据类型之List入门练习

入门

redis的list类型存储时采用linkedlist
redis存储list类型可以实现队列和堆栈,队列是先进先出,而堆栈是先进后出。
如果使用的是lpush,底层用的就是栈,先进后出
如果使用的是rpush,底层用的就是队列,先进先出

命令

lpush
rpush
lrange
llen
lrem
lpop
rpop
ltrim

实操

//创建列表,如果使用的是lpush,底层用的就是栈,先进后出
> lpush list1 1 2 3 4 5 6
(integer) 6
//获取列表元素,要带有参数,否则报错
> lrange list1
(error) ERR wrong number of arguments for 'lrange' command
//获取列表所以元素 -1 代表最后一个
> lrange list1 0 -1
1) "6"
2) "5"
3) "4"
4) "3"
5) "2"
6) "1"
//查询列表前四个元素
> lrange list1 0 3
1) "6"
2) "5"
3) "4"
4) "3"
//新建列表
> rpush list2 10 11 12 13
(integer) 4
//查看列表所有元素
> lrange list2 0 -1
1) "10"
2) "11"
3) "12"
4) "13"
//查看列表前3个元素
> lrange list2 0 2
1) "10"
2) "11"
3) "12"

scala API操作List

def ListDemo(): Unit ={
      for(i<-0 to 20){
       //生成一个随机的uuid
        val string: String = UUID.randomUUID().toString
        //将字符串添加到列表list1
        jedis.lpush("list1",string)
        val list: util.List[String] = jedis.lrange("list1", 0, -1)
        import  scala.collection.JavaConversions._
        for(x<-list){
          println(x)
        }
      }
    }
f9fc53ca-3d5c-4df5-84f6-8549d661145b
84a1f2c6-1a5d-401c-8a19-6c41747c484d
403d1ea1-7691-4bf9-93f7-b73dd308e9e2
.....

编程中用的的方法解析

randomUUID

public static UUID randomUUID()

静态工厂检索类型4(伪随机生成)的UUID。 使用加密强度高的伪随机数生成器生成UUID

lpush

public Long lpush(String key,
                  String... strings)   

将字符串值添加到存储在键处的列表的开头(LPUSH)或结尾(RPUSH)。 如果键不存在,则会在追加操作之前创建一个空列表。 如果键存在但不是列表,则返回错误。
时间复杂度:O(1)

lrange

public java.util.List<String> lrange(String key,
                                     long start,
                                     long stop)

返回存储在指定键处的列表的指定元素. 开始和结束是从零开始的索引。 0是列表的第一个元素(列表头),1是下一个元素,依此类推。
例如,LRANGE foobar 0 2将返回列表的前三个元素。
start和end也可以是负数,指示与列表末尾的偏移量。例如,-1是列表的最后一个元素,-2是倒数第二个元素,依此类推。

与各种编程语言中的范围函数保持一致
请注意,如果您有一个从0到100的数字列表,则LRANGE 0 10将返回11个元素,即包括最右边的项目。这可能与选择的编程语言中与范围相关的函数的行为一致(也可能不一致)(请考虑Ruby的Range.new,Array#slice或Python的range()函数)。

超出范围的索引
索引超出范围不会产生错误:如果start在列表的末尾,或者start> end,则返回一个空列表。
时间复杂度:O(start + n)(其中n为范围的长度,start为起始偏移量)

> lpush list 1 2 3
(integer) 3
//超出索引不会报错
> lrange list 0 8
1) "3"
2) "2"
3) "1"
//end比start大会返回空列表
> lrange list 9 0
(empty list or set)

llen

public Long llen(String key)

返回存储在指定键处的列表的长度。 如果键不存在,则返回零(与空列表相同的行为)。 如果存储在key处的值不是列表,则返回错误。
时间复杂度:O(1)

> lpush l1 1 2 3
(integer) 3
//shell语法是空格,java代码才是放在括号中!
> llen(l1)
(error) ERR unknown command `llen(l1)`, with args beginning with:
> llen l1
(integer) 3
//key不存在,返回0
> llen l2
(integer) 0

pop

public String lpop(String key)

以原子方式返回并删除列表的第一个(LPOP)或最后一个(RPOP)元素。 例如,如果列表包含元素“ a”,“ b”,“ c”,则LPOP将返回“ a”,并且列表将变为“ b”,“ c”。
如果键不存在或列表已经为空,则返回特殊值“ nil”。

> lpush s 1 2 3 4 5
(integer) 5
//删除最右侧元素,并返回被删除的元素
> lpop s
127.0.0.1:6379> lrange s 0 -1
1) "4"
2) "3"
3) "2"
4) "1"
//删除造左侧的元素,并返回被删除的元素
> rpop s
"1"
> lrange s 0 -1
1) "4"
2) "3"
3) "2"

lrem
注意第二个参数类型为long,第三个为string,但是shell中没有区别,java中则是有区别的

public Long lrem(String key,
                 long count,
                 String value)

从列表中删除count个value。 如果count为零,则删除所有元素。 如果count是负数,则将元素从尾部移到头部,而是从头到尾移出,这是正常行为。 因此,例如,具有count -2和hello作为要从列表中删除的值(a,b,c,hello,x,hello,hello)的LREM将离开列表(a,b,c,hello,x)。 删除的元素数以整数形式返回,有关返回值的更多信息,请参见下文。 请注意,LREM将不存在的键视为空列表,因此针对不存在的键的LREM将始终返回0。
时间复杂度:O(N)(其中N为列表的长度)

> lpush zzz 1 2 3 3 4 3 5 6 7 7
(integer) 10
//删除2个3
> lrem zzz 2 3
(integer) 2
> lrange zzz 0 -1
1) "7"
2) "7"
3) "6"
4) "5"
5) "4"
6) "3"
7) "2"
8) "1"
> lrem zzz 0
(error) ERR wrong number of arguments for 'lrem' command
//删除所有的7, 0 这个参数代表所有的
127.0.0.1:6379> lrem zzz 0 7
//表面删除了2个元素
(integer) 2
> lrange zzz 0 -1
1) "6"
2) "5"
3) "4"
4) "3"
5) "2"
6) "1"
> lrem zzz -1 6
(integer) 1
127.0.0.1:6379> lrange zzz 0 -1
1) "5"
2) "4"
3) "3"
4) "2"
5) "1"

lset

将一个新值设置为键处List的索引位置处的元素。
超出范围的索引将生成错误。
与其他接受索引的列表命令类似,对于从列表末尾开始的访问元素,索引可以为负。 因此,-1是最后一个元素,-2是倒数第二个,依此类推。
时间复杂度:
O(N)(N为列表的长度),将列表的第一个或最后一个元素设置为O(1)。

public String lset(String key,
                   long index,
                   String value)
> lpush ss 1 2 3
(integer) 3
//修改索引为1的元素,索引从0开始
> lset ss 1 99
OK
> lrange ss 0 -1
1) "3"
2) "99"
3) "1"

总结

对应列表,无非增删改查而已,命令中的l应该是list的意思.

增 lpush
删 lrem,lpop
改 lset
查 lrange
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值