redis link链表结构

link 链表结构:

lpush  key  value

作用: 把值插入到链接头部


rpop  key

作用: 返回并删除链表尾元素

rpush,lpop: 不解释

lpushx  key  value

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

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

返回值:

LPUSHX命令执行之后,表的长度。

#情况1:对空列表执行LPUSHX

redis> LLEN greet    # greet是一个空列表

(integer) 0

redis> LPUSHX greet "hello"  # 尝试LPUSHX,失败,因为列表为空

(integer) 0

#情况2:对非空列表执行LPUSHX

redis> LPUSH greet "hello"   # 先用LPUSH创建一个有一个元素的列表

(integer) 1

redis> LPUSHX greet "good morning"   # 这次LPUSHX执行成功

(integer) 2

redis> LRANGE greet 0 -1

1) "good morning"

2) "hello"

rpushx  key  value


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

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

返回值:

RPUSHX命令执行之后,表的长度。

# 情况1:key不存在

redis> LLEN greet

(integer) 0

redis> RPUSHX greet "hello"  # 对不存在的key进行RPUSHX,PUSH失败。

(integer) 0

# 情况2:key存在且是一个非空列表

redis> RPUSH greet "hi"  # 先用RPUSH插入一个元素

(integer) 1

redis> RPUSHX greet "hello"  # greet现在是一个列表类型,RPUSHX操作成功。

(integer) 2

redis> LRANGE greet 0 -1

1) "hi"

2) "hello"

lset key index value

将列表key下标为index的元素的值甚至为value。

更多信息请参考LINDEX操作。

当index参数超出范围,或对一个空列表(key不存在)进行LSET时,返回一个错误。

返回值:

操作成功返回ok,否则返回错误信息。

# 情况1:对空列表(key不存在)进行LSET

redis> EXISTS list

(integer) 0

redis> LSET list 0 item

(error) ERR no such key

# 情况2:对非空列表进行LSET

redis> LPUSH job "cook food"

(integer) 1

redis> LRANGE job 0 0

1) "cook food"

redis> LSET job 0 "play game"

OK

redis> LRANGE job  0 0

1) "play game"

# 情况3:index超出范围

redis> LLEN list # 列表长度为1

(integer) 1

redis> LSET list 3 ‘out of range‘

(error) ERR index out of range

lrange key start stop

作用: 返回链表中[start ,stop]中的元素

规律: 左数从0开始,右数从-1开始

lrem  key  count  value

作用: 从key链表中删除 value值

注: 删除count的绝对值个value后结束

count > 0: 从表头开始向表尾搜索,移除与value相等的元素,数量为count。

count < 0: 从表尾开始向表头搜索,移除与value相等的元素,数量为count的绝对值。

count = 0: 移除表中所有与value相等的值。

127.0.0.1:6379> rpush ceshi  1 2 3 4 5 5 4 3 2 1

(integer) 10

127.0.0.1:6379> lrange ceshi 0 -1

1) "1"

2) "2"

3) "3"

4) "4"

5) "5"

6) "5"

7) "4"

8) "3"

9) "2"

10) "1"

127.0.0.1:6379> lrem ceshi 1 5

(integer) 1

127.0.0.1:6379> lrange ceshi 0 -1

1) "1"

2) "2"

3) "3"

4) "4"

5) "5"

6) "4"

7) "3"

8) "2"

9) "1"

127.0.0.1:6379> flushdb

OK

127.0.0.1:6379> rpush ceshi  1 2 3 4 5  4 3 2 1 5

(integer) 10

127.0.0.1:6379> lrange ceshi 0 -1

1) "1"

2) "2"

3) "3"

4) "4"

5) "5"

6) "4"

7) "3"

8) "2"

9) "1"

10) "5"

127.0.0.1:6379> lrem ceshi 1 5

(integer) 1

127.0.0.1:6379> lrange ceshi 0 -1

1) "1"

2) "2"

3) "3"

4) "4"

5) "4"

6) "3"

7) "2"

8) "1"

9) "5"

127.0.0.1:6379> lrem ceshi -1 1

(integer) 1

127.0.0.1:6379> lrange ceshi 0 -1

1) "1"

2) "2"

3) "3"

4) "4"

5) "4"

6) "3"

7) "2"

8) "5"

127.0.0.1:6379> lrem ceshi 0 2

(integer) 2

127.0.0.1:6379> lrange ceshi 0 -1

1) "1"

2) "3"

3) "4"

4) "4"

5) "3"

6) "5"

127.0.0.1:6379>

ltrim key start stop

作用: 剪切key对应的链接,切[start,stop]一段,并把该段重新赋给key

127.0.0.1:6379> lrange ceshi 0 -1

1) "1"

2) "3"

3) "4"

4) "4"

5) "3"

6) "5"

127.0.0.1:6379> ltrim ceshi 0 2

OK

127.0.0.1:6379> lrange ceshi 0 -1

1) "1"

2) "3"

3) "4"

127.0.0.1:6379>

lindex  key index

作用: 返回index索引上的值,

如  lindex key 2

127.0.0.1:6379> lrange ceshi 0 -1

1) "1"

2) "3"

3) "4"

127.0.0.1:6379> lindex ceshi 1

"3"

127.0.0.1:6379>

llen key

作用:计算链接表的元素个数

127.0.0.1:6379> lrange ceshi 0 -1

1) "1"

2) "3"

3) "4"

127.0.0.1:6379> llen ceshi

(integer) 3

127.0.0.1:6379>

linsert  key before|after  search value


作用: 在key链表中寻找’search’,并在search值之前|之后,.插入value

注: 一旦找到一个search后,命令就结束了,因此不会插入多个value

127.0.0.1:6379> lrange ceshi 0 -1

1) "1"

2) "3"

3) "4"

127.0.0.1:6379> linsert ceshi after 4 w

(integer) 4

127.0.0.1:6379> lrange ceshi 0 -1

1) "1"

2) "3"

3) "4"

4) "w"

127.0.0.1:6379> linsert ceshi before 3 c

(integer) 5

127.0.0.1:6379> lrange ceshi 0 -1

1) "1"

2) "c"

3) "3"

4) "4"

5) "w"

127.0.0.1:6379>

rpoplpush  source dest

作用: 把source的尾部拿出,放在dest的头部,

并返回 该单元值

127.0.0.1:6379> lrange ceshi 0 -1

1) "1"

2) "c"

3) "3"

4) "4"

5) "w"

127.0.0.1:6379> rpoplpush ceshi ceshi1

"w"

127.0.0.1:6379> lrange ceshi 0 -1

1) "1"

2) "c"

3) "3"

4) "4"

127.0.0.1:6379> lrange ceshi1 0 -1

1) "w"

brpoplpush  source  destination timeout

BRPOPLPUSH是RPOPLPUSH的阻塞版本,当给定列表source不为空时,BRPOPLPUSH的表现和RPOPLPUSH一样。

当列表source为空时,BRPOPLPUSH命令将阻塞连接,直到等待超时,或有另一个客户端对source执行LPUSH或RPUSH命令为止。

超时参数timeout接受一个以秒为单位的数字作为值。超时参数设为0表示阻塞时间可以无限期延长(block indefinitely) 。

更多相关信息,请参考RPOPLPUSH命令。

返回值:

假如在指定时间内没有任何元素被弹出,则返回一个nil和等待时长。

反之,返回一个含有两个元素的列表,第一个元素是被弹出元素的值,第二个元素是等待时长。

# 情况1:非空列表

redis> BRPOPLPUSH msg reciver 500

"hello moto"    # 弹出元素的值

(3.38s)         # 等待时长

redis> LLEN reciver

(integer) 1

redis> LRANGE reciver 0 0

1) "hello moto”

# 情况2:空列表

redis> BRPOPLPUSH msg reciver 1

(nil)

(1.34s)

时间: 2024-07-30 13:51:45

redis link链表结构的相关文章

link 链表结构

lpush key value 作用: 把值插入到链接头部 rpop key 作用: 返回并删除链表尾元素 rpush,lpop: 不解释 lrange key start stop 作用: 返回链表中[start ,stop]中的元素规律: 左数从0开始,右数从-1开始(0 -1 选取所有元素) lrem key count value 作用: 从key链表中删除 value值注: 删除count的绝对值个value后结束Count>0 从表头删除Count<0 从表尾删除 ltrim ke

利用java实现一个简单的链表结构

定义: 所谓链表就是指在某节点存储数据的过程中还要有一个属性用来指向下一个链表节点,这样的数据存储方式叫做链表 链表优缺点: 优点:易于存储和删除 缺点:查询起来较麻烦 下面我们用java来实现如下链表结构: 首先定义节点类: 复制代码package LinkTest;/** 链表节点类 @author admin */public class Node {private int value;//存储数据private Node next;//下一个节点/** 定义构造器 @param vlau

指针与链表结构理解

指针与链表结构理解#include<stdio.h>int main(void){ int a=3,*p; p=&a; printf("a=%d,*p=%d\n",a,*p); *p=10; printf("a=%d,*p=%d\n",a,*p); printf("Enter a:"); scanf("%d",&a); printf("a=%d,*p=%d\n",a,*p); r

链表结构的小技巧

针对链表结构的Value,Redis在其官方文档中给出了一些实用技巧,如RPOPLPUSH命令,下面给出具体的解释. Redis链表经常会被用于消息队列的服务,以完成多程序之间的消息交换.假设一个应用程序正在执行LPUSH操作向链表中添加新的元素,我们通常将这样的程序称之为"生产者(Producer)",而另外一个应用程序正在执行RPOP操作从链表中取出元素,我们称这样的程序为"消费者 (Consumer)".如果此时,消费者程序在取出消息元素后立刻崩溃,由于该消息

【Redis源代码剖析】 - Redis内置数据结构之压缩字典zipmap

原创作品,转载请标明:http://blog.csdn.net/Xiejingfa/article/details/51111230 今天为大家带来Redis中zipmap数据结构的分析,该结构定义在zipmap.h和zipmap.c文件里.我把zipmap称作"压缩字典"(不知道这样称呼正不对)是因为zipmap利用字符串实现了一个简单的hash_table结构,又通过固定的字节表示节省空间. zipmap和前面介绍的ziplist结构十分相似,我们能够对照地进行学习: Redis中

【Redis源码剖析】 - Redis内置数据结构值压缩字典zipmap

原创作品,转载请标明:http://blog.csdn.net/Xiejingfa/article/details/51111230 今天为大家带来Redis中zipmap数据结构的分析,该结构定义在zipmap.h和zipmap.c文件中.我把zipmap称作"压缩字典"(不知道这样称呼正不正确)是因为zipmap利用字符串实现了一个简单的hash_table结构,又通过固定的字节表示节省空间.zipmap和前面介绍的ziplist结构十分类似,我们可以对比地进行学习: Redis中

Pjlib中的链表结构

Pjlib的链表结构跟常见的链表结构有所区别,如下图所示: ? ? ? ? ? ? 图1:一般链表结构 ? ? ? ? ? 图2:pjlib中的链表结构 可以看到一般的双向链表是链表节点包含数据域,而pjlib中是数据域包含链表节点.一般的链表指针域是链表结构的指针,而pjlib中是数据结构的指针.这种结构的优势我还没有体会到,可能要慢慢体会吧,但对链表头的理解却造成些许困惑.链表头是一个单独的list,而prev和next指向的是含有list的data结构,这种结构总让我觉得怪怪的. Pjli

javascript中的链表结构—双向链表

1.概念 上一个文章里我们已经了解到链表结构,链表的特点是长度不固定,不用担心插入新元素的时候新增位置的问题.插入一个元素的时候,只要找到插入点就可以了,不需要整体移动整个结构. 这里我们了解一下双向链表的结构.尽管从链表中头节点遍历到尾节点很容易,但是反过来,从后向前遍历就没有那么简单.通过给Node对象增加一个属性,该属性存储指向前驱节点的链接,这样就容易多了.此时祥链表中插入一个节点需要更多的工作,我们需要指出该节点正确的前驱和猴急.但是在从链表中删除节点的时候效率更高了,不需要再查找待删

Nginx 链表结构 ngx_list_t

链表结构 ngx_list_t 是 Nginx 封装的链表容器,链表容器内存分配是基于内存池进行的,操作方便,效率高.Nginx 链表容器和普通链表类似,均有链表表头和链表节点,通过节点指针组成链表.其结构定义如下: /* 链表结构 */ typedef struct ngx_list_part_s ngx_list_part_t; /* 链表中的节点结构 */ struct ngx_list_part_s { void *elts; /* 指向该节点数据区的首地址 */ ngx_uint_t