NoSQL之Redis对lists类型的操作

原创 2013年12月02日 17:15:24

一、简介

  list是一个链表结构,主要功能是push、pop、获取一个范围的所有值等等,操作中的key理解为链表的名字。Redis的list类型其实就是一个每一个子元素都是string类型的双向链表。我们可以通过push、pop操作从链表的头部或者尾部添加删除元素,这样list既可以作为栈,也可以作为队列。

二、栈跟队列的特性

1.栈:先进后出。如果把1,2,3放到栈中,那么顺序是3,2,1 1的方向是栈的头,3所在的是栈的尾。如果想从栈里把1拿出来,那么先拿3再2再1.

2.队列:先进先出,相当于一个管道,同样防1,2,3,那么出也是1,2,3。

三、list类型的相关操作

1.lpush listkey value:listkey对应list的头部添加value。

127.0.0.1:6379> lpush listkey1 'world'
(integer) 1
127.0.0.1:6379> lpush listkey1 'hello'
(integer) 2
127.0.0.1:6379> lrange listkey1 0 -1
1) "hello"
2) "world"

上面的操作代表的意思是首先我往listkey1的头压入一个world字符串,接着往它的头压入hello,然后用lrange取出listkey1中的全部数据,可以看到listkey1中从头到尾依次是hello,world。lrange listkey1 0 -1是指从listkey1中从第0个元素取到最后一个元素(从头取到尾)。

2.rpush listkey value:从listkey的尾部压入元素value

127.0.0.1:6379> rpush listkey2 'hello'
(integer) 1
127.0.0.1:6379> rpush listkey2 'world'
(integer) 2
127.0.0.1:6379> lrange listkey2 0 -1
1) "hello"
2) "world"

3.lrange listkey start end:取listkey里面的值从start取到end 

4.linsert listkey before/after value1 value2:从listkey的头开始,在value1的前/后面压入value2

127.0.0.1:6379> lpush listkey3 v1
(integer) 1
127.0.0.1:6379> lpush listkey3 v2
(integer) 2
127.0.0.1:6379> lpush listkey3 v3
(integer) 3
127.0.0.1:6379> lpush listkey3 v4
(integer) 4
127.0.0.1:6379> lrange listkey3 0 -1
1) "v4"
2) "v3"
3) "v2"
4) "v1"
127.0.0.1:6379> linsert listkey3 before v1 v5
(integer) 5
127.0.0.1:6379> lrange listkey3 0 -1
1) "v4"
2) "v3"
3) "v2"
4) "v5"
5) "v1"

这里有一点需要注意,就是如果list中如果有2个或者多个相同的值,那么执行before会是什么情况?这个大家可以自己测试,记住一点,before是从list的头开始算起的,遇到的第一个为准。

关于链表的头尾,记住一个规则,从尾到头为向上,永远指向头的方向为前。

5.lset listkey flag value:设定listkey中指定下标flag的元素值替换为value
127.0.0.1:6379> lrange listkey4 0 -1
1) "three"
2) "two"
3) "one"
127.0.0.1:6379> lset listkey4 2 four
OK
127.0.0.1:6379> lrange listkey4 0 -1
1) "three"
2) "two"
3) "four"

上面首先存储一个listkey4链表,用从头压入的方法压入3个元素one,two,three,这样three对应的下标是0,two对应的是1,one对应的是2,因为是从头压入的。所以用lset listkey4 2 four实际上是把one替换成了four。再用larange listkey4 0 -1从头到尾取的时候自然就得到了three two four

6.lrem listkey n value:listkey的list中删除n个和value相同的值(n < 0从尾删除,n=0全部删除)。
127.0.0.1:6379> lrange listkey5 0 -1
1) "four"
2) "four"
3) "four"
4) "three"
5) "two"
6) "two"
7) "one"
8) "one"
9) "one"

127.0.0.1:6379> lrem listkey5 2 four
(integer) 2
127.0.0.1:6379> lrange listkey5 0 -1
1) "four"
2) "three"
3) "two"
4) "two"
5) "one"
6) "one"
7) "one"
127.0.0.1:6379> lrem listkey5 -2 one
(integer) 2
127.0.0.1:6379> lrange listkey5 0 -1
1) "four"
2) "three"
3) "two"
4) "two"
5) "one"

大家仔细琢磨一下上面的一系列操作吧。

lrem结果成功返回删除掉的记录数,如果失败返回0

7.ltrim listkey start end:保留指定的listkey的值范围内的数据,从start开始到end结束,其他元素会全部删除掉

127.0.0.1:6379> lrange listkey4 0 -1
1) "three"
2) "three"
3) "three"
4) "two"
5) "four"

127.0.0.1:6379> ltrim listkey4 2 3
OK
127.0.0.1:6379> lrange listkey4 0 -1
1) "three"
2) "two"

注意start到end是保留的范围而不是删除的范围。

8.lpop/rpop listkey:从listkey的list的头/尾部删除元素,并且返回删除的元素。返回值是被删除的元素值

127.0.0.1:6379> lrange listkey4 0 -1
1) "three"
2) "two"

127.0.0.1:6379> lpop listkey4
"three"
127.0.0.1:6379> lrange listkey4 0 -1
1) "two"

9.rpoplpush listkey1 listkey2:从listkey1的尾部弹出元素并且添加到listkey2的头部。返回结果成功是是被弹出的元素value

127.0.0.1:6379> lrange listkey5 0 -1
1) "four"
2) "three"
3) "two"
4) "two"
5) "one"
127.0.0.1:6379> lrange listkey6 0 -1
1) "two"
2) "one"
127.0.0.1:6379> rpoplpush listkey5 listkey6
"one"
127.0.0.1:6379> lrange listkey6 0 -1
1) "one"
2) "two"
3) "one"

10.lindex listkey index:返回listkey对应的链表中,index位置的value。index位置从头开始算起。index可以是负数,如果是负数证明是从尾开始算起。

127.0.0.1:6379> lrange listkey6 0 -1
1) "one"
2) "two"
3) "one"
127.0.0.1:6379> lindex listkey6 0
"one"
127.0.0.1:6379> lindex listkey6 1
"two"

11.llen listkey:返回listkey中元素的个数,返回值是一个integer

127.0.0.1:6379> llen listkey5
(integer) 4
127.0.0.1:6379> lrange listkey5 0 -1
1) "four"
2) "three"
3) "two"
4) "two"

NOSQL数据库浅析(三):Redis

Redis是一个远程内存数据库,它不仅性能强劲,而且还具有复制特性以及为解决问题而生的独一无二的数据模型。Redis提供了5种不同类型的数据结构,各式各样的问题都可以很自然地映射到这些数据结构上:Re...
  • qq_36031499
  • qq_36031499
  • 2017年01月04日 15:31
  • 817

NoSql——redis(高级操作)

redis nosql 主从复制 持久化 发布订阅
  • zllaptx4869
  • zllaptx4869
  • 2015年08月31日 16:00
  • 684

Nosql学习之Redis资料(一)

一、简介:      在过去的几年中,NoSQL数据库一度成为高并发、海量数据存储解决方案的代名词,与之相应的产品也呈现出雨后春笋般的生机。然而在众多产品中能够脱颖而出的却屈指可数,如Redis...
  • zhouqinghe24
  • zhouqinghe24
  • 2013年06月09日 12:10
  • 7562

Redis-高性能高并发NoSQL分布式缓存

http://www.redis.net.cn/tutorial/3503.html 1.简介: 2.Redis缓存的数据类型: 3.Redis物理存储: ...
  • zhulongxi
  • zhulongxi
  • 2016年12月06日 17:27
  • 875

NoSQL之Redis技术(四):使用Java操作Redis服务

今天小钱要给大家介绍redis技术的最后一项技术:使用Java来操作我们的redis服务,前些天,我们都是通过命令来操作和连接我们的redis服务的,那如何使用Java来操作呢?以下介绍四种方法使用J...
  • qian_ch
  • qian_ch
  • 2017年03月30日 17:06
  • 692

【NoSql】Redis实践篇-简单demo实现(一)

Redis是一个key-value存储系统。Redis的出现,很大程度补偿了memcached这类key/value存储的不足,在部分场合可以对关系数据库起到很好的补充作用      Redis是一个...
  • hejingyuan6
  • hejingyuan6
  • 2015年08月13日 08:25
  • 4965

memcache、redis等常用nosql解决方案,优缺点以及使用场景

1.存储容量:memcached超过内存比例会抹掉前面的数据,而redis会存储在磁盘 2.支持数据类型:memcached只支持string,redis支持更多。如:hash list集合 有序集...
  • weiwenjuan0923
  • weiwenjuan0923
  • 2016年09月26日 00:20
  • 1222

NoSQL数据库memcache和redis区别()

在web后台发开面试中,经常会被问道memcache和redis的区别和使用情况。 其中memcache和redis都是基于内存存储的缓存系统,存储形式key--value键值对的形式。 区别: (1...
  • qq_21034239
  • qq_21034239
  • 2017年01月17日 20:38
  • 1576

NoSQL之Redis---事务(transaction)Java实现

[不忘初心] 前文中,我们介绍了通过命令行的方式调用redis命令实现事务。本文我们来介绍一下使用Java来实现redis。惯例,我们先看看准备工作有哪些: a.操作系统:windows 7 x64 ...
  • ABCD898989
  • ABCD898989
  • 2016年06月21日 19:15
  • 1115

redis之lists类型

lists类型及操作  list是一个链表结构,主要功能是push、pop、获取一个范围的所有值等等,操作中key理解为链表的名字。redis的list类型其实就是一个每个子元素都是string类型...
  • InnerYgu
  • InnerYgu
  • 2017年04月23日 20:44
  • 158
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:NoSQL之Redis对lists类型的操作
举报原因:
原因补充:

(最多只允许输入30个字)