redis的数据类型:List

Redis命令介绍之列表的操作命令(第一部分) 介绍并以示例的形式展示Redis中列表相关命令(第一部分),包括LPUSH、LPOP、LLEN、LRANGE、LINDEX等命令。 阅读详情

文章目录

list类型简介

在这里插入图片描述

list内部(编码方式)并非是一个简单的数组,而是更接近于“双端队列”(deque) ,可以在两端进行高效的插入删除操作(时间复杂度均为O(1))
2.

List列表中的元素是有序的,如何理解有序?

有序意味着我们可以通过索引下标获取某个元素或者某个范围的元素列表
在这里插入图片描述

例如我们要获取上图中的第 5 个元素e,可以执行 :
lindex user:1:messages 4 或者lindex user:1:messages -1 就可以得到元素 e

“有序”的含义,要根据上下文区分

  • 有的时候,谈到有序,指的是“升序”,“降序”
  • 有的时候,谈到的有序,指的是,顺序很关键。即如果把元素位置颠倒,顺序调换,此时得到的新的List和之前的List是不等价的!!

同样一个词,怎么理解,务必要结合上下文,结合具体场景
比如栈 / 堆. (数据结构的,操作系统的,JVM的)
同步 (同步和互斥的同步,还是同步和异步的同步)

List获取操作与List删除操作的区别和联系是什么?

联系:这俩操作都会返回对应的元素,List获取操作是仅仅获取,List删除是删除对应位置的元素,并把这个元素返回给用户
在这里插入图片描述

区别:上图的 lrem 1 b 是从列表中把从左数遇到的前 1 个 b 元素删除,这个操作会导致列表的长度从 5 变成 4;但是执行 lindex 4 只会获取元素,但列表长度是不会变化的。

LIST列表中的元素允许重复吗?

列表中的元素是允许重复的,例如下图列表中就包含了两个 a 元素。
在这里插入图片描述

对于Redis中很多类型像hash、set,field是不能重复的,如果set一个已有的field,只能是覆盖写,而List的元素可以重复,因为它们是通过数据下标来区分的

因为当前的List,头和尾都能高效的插入删除元素,就可以把这个List当做一个栈/队列来使用。Redis有一个典型的应用场景,就是作为消息队列。最早的时候,就是通过List类型~~后来Redis又提供了一个stream类型,专门用来做消息队列

List类型指令介绍

LPUSH

LPUSH中的L是left的缩写,意思是从链表的最左边插入
语法:LPUSH key element1 element2 …

LPUSH一次可以插入一个元素,也可以插入多个元素。假如说我LPUSH key 1 2 3 4 ,请问插入完毕之后,谁在最前面?谁在最后面?

LPUSH key element [element …] 一次可以插入一个元素,也可以插入多个元素。1 2 3 4按照顺序,依次头插这几个元素。全都插入完毕,4是在最前面,1在最后面

LPUSH插入的时间复杂度是多少?指令执行之后的返回值是什么?

时间复杂度 O(1),返回值是list的长度。

如果LPUSH key 1 2 3 4 执行之前,key已经存在,那么执行结果是什么?

  • 如果key已经存在,并且key对应的value类型,不是list,此时lpush命令就要报错。
  • 如果在执行 LPUSH key 1 2 3 4 之前,key 已经存在且是一个列表(list)类型,那么执行后会将新元素 1、2、3、4 依次插入到列表的头部(左侧)

注意:LPUSH 的特性是左侧插入,且多个元素会按参数顺序依次插入(即 1 先插入,2 插在 1 的左侧,以此类推,最终 4 会在最左侧)。

LPUSHX

语法:LPUSHX key element [element …]
时间复杂度:O(1)
返回值:插入后list的长度。

LPUSHX 与LPUSH的区别是什么?

LPUSHX只有在 key 存在时,才会将一个或者多个元素从左侧放入(头插)到 list 中。不存在,直接返回0。
LPUSH在key不存在时,会自动创建一个List,然后将一个或者多个元素从左侧放入(头插)到 list 中

RPUSH

RPUSH 与LPUSH的区别是什么?

LPUSH是从左边插入,相当于头插
RPUSH是从右边插入,相当于尾插

RPUSH的作用是什么?怎么用?时间复杂度是多少?返回值是什么?

RPUSH作用:将一个或者多个元素从右侧放入(尾插)到 list 中。
语法:RPUSH key element1 element2 …
时间复杂度:O (1)
返回值:返回插入后 list 的长度

假如说我RPUSH key 1 2 3 4 5 6 7 8 ,请问插入完毕之后,谁在最前面?插入的时间复杂度是多少?如果这条命令执行之前,key已经存在,那么执行结果是什么?

依次尾插这几个元素,全都插入完毕,1是在最前面!!!
返回值是list的长度。如果key已经存在,并且key对应的value类型,不是list,此时lpush命令就要报错,如果key对应的value类型是list,那就要向key对应的List依次尾插1 2 3 4 5 6 7 8

RPUSHX

这个命令和LPUSH命令几乎完全相同,唯一的不同就在于,RPUSHX是尾插,LPUSHX是头插
这个命令与RPUSH的区别在于,RPUSHX只有在key存在时,才能完成尾插的操作,如果list不存在,直接返回0

LPOP与RPOP

LPOP key对key对应的List进行头删操作
RPOP key对key对应的List进行尾删操作
LPOP/RPOP时间复杂度:O(1)
LPOP/RPOP返回值: 返回删除的元素,如果没东西删就返回nil

Redis中的list是一个双端队列,从两头插入/删除元素都是非常高效~~O(1)
搭配使用rpush和lpop,就相当于队列了。搭配使用rpush和rpop,就相当于栈了。

当使用 LPOP 命令时,如果指定的 key 不存在,Redis 会怎样处理?

Redis 不会报错,而是会返回 nil
这是因为 Redis 将不存在的 key 视为空列表,LPOP 操作在空列表上执行时,自然没有元素可移除和返回,所以返回 nil 来表示这种情况。

LPOP的count参数

LPOP和RPOP在当前的redis 5版本中,都是没有count参数。从redis 6.2版本,新增了一个count参数,指令变成了LPOP key count,count就描述这次要删几个元素

lrange

lrange 命令用于查看 list 中指定范围的元素
语法:LRANGE key start stop
此处描述的区间也是闭区间,即[start, stop],下标支持负数,-n 表示从列表尾部开始数的第n 个元素。

既然有lrange,那有没有rrange呢?

这里的lrange是 “list range” 的意思,用于获取 list 中指定范围的元素 ,不是 “left range”
但是Redis里面确实有不少这样的对应指令,比如lpush 和 rpush、lpop 和 rpop

如何查看list中的所有元素?

LRANGE key 0 -1,即start=0,stop=-1
在这里插入图片描述

如果按照插入的顺序来排,8的数组下标不应该是0吗,为什么是1?
此处的序号仅仅是标识下返回元素的顺序,和下标无关。hash类型就没有下标的概念~
在这里插入图片描述

在Redis的List中,如果下标超出范围,Redis会怎么处理呢?

谈到下标,往往会关注超出范围的情况
C++中,下标超出范围,一般会认为这是一个“未定义行为”,而未定义行为导致的后果是不可控的,就跟开盲盒一样,既有可能会导致程序崩溃,也可能会得到一个不合法的数据,还可能会得到一个看起来合法但是错误的数据,也有可能恰好得到一个符合要求的数据……

缺点:程序猿不一定能第一时间发现问题!!
优点:效率是最高的!!

而Java中,下标超出范围,一般会抛出异常多出一步下标合法性的验证~~
缺点:速度比上面要慢
优点:出现问题能及时发现.
思考一下:是机器执行的快重要?还是程序猿代码写的快重要??
肯定是程序猿代码写的快重要,因为和我们利益相关,所以JAVA的优化对我们来说是更友好了

在Redis中并没有采用上述的两种设定,Redis的做法,是直接尽可能的获取到给定区间的元素。如果给定区间非法,比如超出下标,就会尽可能的获取对应的内容,使得程序的鲁棒性很强
在这里插入图片描述

什么叫鲁棒性?“鲁棒性”就是你对我越粗鲁,我就表现的越棒,鲁棒性强就意味着程序的容错能力更强~~

执行lrange key 0 -10的时候,若列表中的元素数量少于 10 个,执行该指令的结果是什么?

执行lrange key 0 -10的时候,若列表中的元素数量少于 10 个,那么 stop 索引会被视为超出范围,此时该命令会返回从第一个元素到列表最后一个元素的所有元素,也就是整个列表。

列表不存在:
如果 key 对应的列表不存在,该命令会返回一个空列表。

lindex

作用:给定下标,返回对应下标的元素
语法:lindex key index

  • key用于指定List
  • index用于指定list中的下标

时间复杂度O(N) 此处N指的是list中的元素个数.
如果下标非法,返回nil

linsert

作用:在特定位置插入元素。
时间复杂度:O (N)
返回值:返回插入之后list的 长度。
语法:LINSERT key <BEFORE | AFTER> pivot element

  • 其中<BEFORE | AFTER>表示一个必选选项,你需要从中选择一个。BEFORE 表示在基准元素之前插入新元素;AFTER 表示在基准元素之后插入新元素。
  • pivot:基准元素,也就是作为参考的元素。命令会在列表中查找这个元素,然后根据你选择的 BEFORE 或 AFTER 选项,在相应位置插入新元素。
  • element:是要插入到列表中的新元素
  • key是某个List类型的键值

万一要插入的列表中,基准值pivot存在多个(就你在List中可以找到多个值为pivot的元素,没法确定下标),咋办?

linsert进行插入的时候,要根据基准值,找到对应的位置。从左往右找,找到第一个符合基准值的位置,从这里插入。(以从左到右第一个pivot的下标为准)

LLEN

语法:LLEN key
作用:返回由 key 标识的List列表的长度。
返回值:正常情况下返回由 key 标识的List的长度,如果 key 不存在,返回 0;如果 key 对应的值不是列表类型,返回nil

lrem

语法:LREM key count element

  • key:列表的键名

  • count:移除元素的数量,有三种情况:

    • 当 count 大于 0 时,从列表头部开始向尾部搜索,移除与 element 相等的元素,一共移除 count 个。(如果重复元素不够count个,则能删多少删多少)
    • 当 count 小于 0 时,从列表尾部开始向头部搜索,移除与 element 相等的元素,一共移除 |count| 个(|count| 表示 count 的绝对值)。(如果重复元素不够count个,则能删多少删多少)
    • 当 count 等于 0 时,移除列表中所有与 element 相等的元素。
  • element:要从列表中移除的元素值。

此命令的作用是从指定列表(由 key 标识)里移除与给定值 element 相等的元素,移除多少个这样的重复元素由 count 参数决定。(lrem中的rem表示 remove )
时间复杂度:O(N+M),N是列表总长度,M是移除元素个数

LTRIM

作用:LTRIM 命令用于修剪(截断)列表,通过保留[start, stop]内的元素,移除列表中其他元素,从而改变列表的长度和内容。
语法:LTRIM key start stop

  • key:指定要操作的列表的键名,用于在 Redis 中定位对应的列表数据结构。
  • start:表示保留元素范围的起始索引。索引从 0 开始计数,负数表示从列表尾部开始计数,如 -1 表示最后一个元素。
  • stop:表示保留元素范围的结束索引,同样支持正数(从 0 开始计数)和负数(从列表尾部计数)。

时间复杂度为 O(N)

ACL catagories

Redis有很多命令,把每个命令都打上对应的ACL catagories(比如这个命令需要读权限和写权限),打好所有的标签之后,管理员就可以给每个redis用户配置不同的权限(允许该用户执行哪些标签对应的命令)
比如:LTRIM的ACL catagories是write、List、slow,如果我给一个用户禁掉了write权限,那所有ACL catagories中含有write的命令,该用户都不能执行

lset

语法:LSET key index element
作用:根据下标修改元素,LSET 命令可以将key对应列表中下标index指向的元素替换为新的值element。如果执行成功,列表中该索引位置的元素就会被更新为你指定的值。

如果LSET key index element命令中,index越界了,结果会怎样?

会报错,而lindex中index越界,并不会报错,而是返回nil

BLPOP与BRPOP

语法:BLPOP key [key ...] timeout
blpop和brpop是lpop和rpop的阻塞版本,在列表中有元素的情况下,阻塞和非阻塞表现是一致的。但如果列表中没有元素,非阻塞版本会立即返回nil,但阻塞版本会根据timeout,阻塞一段时间,期间Redis可以执行其他命令,但要求执行该命令的客户端会表现为阻塞状态

BLPOP就是在LPOP列表头插的基础上,加了一个阻塞机制(阻塞Block)

  • 如果list中存在元素,blpop和brpop就和lpop以及rpop作用完全相同。
  • 如果list为空,blpop和brpop就会被阻塞,一直等到list不为空,就会被唤醒去执行对应的Pop操作

BLPOP与BRPOP这俩阻塞命令主要用来干啥呢?

这俩阻塞命令用途主要就是用来作为"消息队列"
当前这俩命令虽然可以一定程度的满足"消息队列"这样的需求. 整体来说,这俩命令功能还是比较有限,没有专业软件方便
blpop和brpop有些英雄迟暮~~ 以后用途越来越少了

参数timeout

使用 brpop 和 blpop 的时候,是可以显式设置阻塞时间timeout的!!!意思就是说,timeout指定阻塞等待时间,表示我等你这么长的时间,在这段时间期间, blpop 操作陷入阻塞状态,等待队列不为空时,将 blpop 操作唤醒,期间Redis可以执行其他命令。但如果在这段时间之内,blpop 操作一直没有得到唤醒,到时间之后就不再等待,Redis 立即返回 nil 给客户端。(是不是感觉有些熟悉?这个timeout参数的含义与epoll里面timeout的含义完全一样!)
由于期间Redis可以执行其他命令,所以此处的blpop和brpop看起来好像耗时很久,但是实际上并不会对redis服务器产生负面影响!!

BLPOP的多路转接

BLPOP还可以指定一个key或者 多个key,每个key都对应一个list(这不就是典型的多路转接方案嘛)
如果这些list有任何一个非空,blpop都能够把这里的元素给获取到. 立即返回.如果这些list都为空,此时就需要阻塞等待,等待其他客户端往这些list中插入元素了.
此处还可以指定 超时时间timeout . 单位是 秒 (Redis 6, 超时时间允许设定成小数. Redis 5中, 超时时间, 得是整数)

BLPOP的返回值

返回的结果相当于一个pair (二元组),第一个值是告诉我们当前的数据来自于哪个key,第二个值是告诉我们pop的数据是谁~~
在这里插入图片描述

BLPOP 命令中如果设置了多个键,即BLPOP key1 key2… timeout,请问最终Pop时,是会对每个List都做一次头删吗?

这个依旧与多路转接方案保持一致,只要等到了一个,就立即对其进行POP,然后返回。

  • 如果BLPOP key1 key2… timeout里面的所有key指向的List都为空,那这条命令会开始阻塞等待,timeout指定阻塞等待的时间,如果在阻塞等待期间,一旦有一个键对应的列表不为空,可以Pop,则我们就立即执行Pop,然后返回。注意,就返回这一个值,并不是要Pop所有的List,而是只要我等待的这么多List中,有一个list可以Pop,我就Pop一下,然后该命令结束
  • 举个例子:今晚上我要吃饭,我约了三个女神,哪个女神回复我了,我就去跟她一块吃饭,如果有多个女神同时回复我,那我也只能选一个去一块吃饭,可不敢让劈腿被发现

如果多个客户端同时对一个key执行pop,请问这些客户端都能获得pop出的元素吗?

只有最先执行命令的客户端会得到弹出的元素。
举个例子:同一个女神,但是有多个屌丝去约,当女神有空了(队列不为空了)的时候,哪个人先约的,哪个人就能先约到女神

BLPOP与LPOP简单对比

  1. 列表为不空,timeout=5,5s内没有新元素加入
    在这里插入图片描述

2.列表不为空,timeout=5,5s内有新元素加入
在这里插入图片描述

命令总结

操作类型命令时间复杂度
添加rpush key value [value ...] O ( k ) O(k) O(k), k k k 是元素个数
添加lpush key value [value ...] O ( k ) O(k) O(k), k k k 是元素个数
添加linsert key before | after pivot value O ( n ) O(n) O(n), n n n 是 pivot 距离头尾的距离
查找lrange key start end O ( s + n ) O(s+n) O(s+n), s s s 是 start 偏移量, n n n 是 start 到 end 的元素个数
查找lindex key index O ( n ) O(n) O(n), n n n 是索引的偏移量
查找llen key O ( 1 ) O(1) O(1)
删除lpop key O ( 1 ) O(1) O(1)
删除rpop key O ( 1 ) O(1) O(1)
删除lrem key count value O ( k ) O(k) O(k), k k k 是元素个数
删除ltrim key start end O ( k ) O(k) O(k), k k k 是元素个数
修改lset key index value O ( n ) O(n) O(n), n n n 是索引的偏移量
阻塞操作blpop brpop O ( 1 ) O(1) O(1)

list类型内部编码

以前版本list类型有两种内部编码,ziplist和linkedlist,现在我们主要就是使用quicklist
在这里插入图片描述

quicklist 相当于是 链表 和 压缩列表 的结合.整体还是一个链表,链表的每个节点,都是一个压缩列表。

  • 每个压缩列表,都不让它太大
  • 如果一个节点的压缩列表大小超出了阈值,我们就会将其拆分成多个,最后把多个压缩列表通过链式结构连起来

你上面说,每个节点中的压缩列表,都不能让它太大,那最大是多少呢?
用redis.conf中的list-max-ziplist-size来设置,比如下图中list-max-ziplist-size设置为-2,那么每个节点最多是8Kb

在这里插入图片描述

list类型的应用场景

使用Redis作为消息队列

生产者消费者模型

在这里插入图片描述
在上图中,谁先执行的这个brpop命令,谁就能拿到这个新来的元素。这样的设定,就能构成一个"轮询"式的效果.

  • 假设消费者执行顺序是1 2 3,当新元素到达之后,首先是消费者1拿到元素. (按照执行brpop命令的先后顺序来决定谁获取到的)。消费者1拿到元素之后,也就从brpop中返回了.(相当于这个命令就执行完了)
  • 如果消费者1还想继续消费,就需要重新再执行一句brpop.此时,三个消费者中,消费者1的brpop操作已经是最晚的了,所以分配的优先级是最低的。
  • 生产者在生产一个新元素到列表中,此时队列中最先执行brpop的是消费者2,所以由消费者2拿到该元素也从brpop中返回~~
  • 如果消费者2还想继续消费,也需要重新执行brpop.如果再来一个新元素,那么这时候队列中最先执行brpop的是消费者3,所以拿到这个元素的就是消费者3

这样就完成了一个轮询式的效果

在redis中,有很多个这样的List列表,充当消息队列,最终的生产者消费者模型大概是这样的
在这里插入图片描述

像上面这种多个列表/频道的场景,是非常常见的——比如日常使用的一些程序,抖音,有一个通道(List),来传输短视频数据,还可以有一个通道(list),来传输弹幕,还可以有频道,来传输 点赞,转发,收藏数据还可以有频道,来传输 评论 。
把数据搞成多个频道(list),就可以在某种数据发生问题的时候不会对其他数据造成影响. (解耦合)

微博 Timeline

每个用户都有属于自己的 Timeline(微博文章列表),现需要分页展示文章列表。此时可以考虑使用列表,因为列表不但是有序的,同时支持按照索引范围获取元素。
1)每篇微博使用哈希结构存储,例如微博中 3 个属性:title、timestamp、content,利用hmset不断地向Hash表中插入新的mblog

hmset mblog:1 title xx timestamp 1476536196 content xxxxx
...
hmset mblog:n title xx timestamp 1476536196 content xxxxx

2)把所有属于同一个user的blog插入到对应user的mblogs列表(List)下。向用户 Timeline 添加微博,user::mblogs 作为微博的键:

lpush user:1:mblogs mblog:1 mblog:3
...
lpush user:k:mblogs mblog:9

3)利用List中的lrangeh分页获取用户的Timeline,例如获取用户1的前10篇微博:

keylist = lrange user:1:mblogs 0 9
for key in keylist {
    hgetall key
}

此方案在实际中可能存在一个问题,就是如果key太多,那你hgetall的次数就会很多,网络请求的次数也比较多,IO次数一多了,那速度就慢下来了,这个问题应该怎么解决呢?

  • 此时可以考虑使用 pipeline(流水线)模式批量提交命令,即多条IO命令一次性全部提交,减少了网络通信的次数
  • 或者微博不采用哈希类型,而是使用序列化的字符串类型,使用 mget 获取。

获取文章时,lrange 在列表两端表现较好,获取列表中间的元素表现较差,对此我们应该如何优化?

  • 此时可以考虑将长的列表做拆分,得到多个小列表

如何将一个List做成栈或者队列?

  1. 限制一侧的存取,就是栈
    同侧存取(lpush + lpop或者rpush + rpop)为栈
  2. 限制只能一侧存,另一侧取,就是队列
    异侧存取(lpush + rpop或者rpush + lpop)为队列
【Redis从入门到精通】第03篇:Redis数据类型全景——String/Hash/List/Set/ZSet一锅端 如果说Redis是一辆超级跑车,那五种核心数据类型就是它的引擎、刹车、变速箱、悬挂和轮胎——少一样都不行。本文用最接地气的方式,把String、Hash、List、Set、ZSet五种类型从头到脚拆解一遍:每种类型的内存模型长啥样?核心命令有哪些?什么场景该选哪种类型?结尾还有一张五维选型速查表,帮你一秒定位最佳数据类型。 阅读详情

相关推荐

RS485差分信号A下拉B上拉导致的乱码问题:一个硬件工程师的踩坑实录

本文通过一个工业网关项目中的RS485通信乱码故障,深入剖析了差分信号偏置电路设计的核心要点。文章详细记录了从波形抓取、原理图分析到多节点冲突排查的全过程,重点揭示了A下拉、B上拉这一反常规配置如何导致总线空闲状态不稳定,进而引发数据包末尾多出0x00字节及前导乱码的问题,并最终给出了硬件与软件协同的系统级解决方案与设计准则。

weixin_29159441的博客 236

redis基本数据类型 list类型

1) BLMOVE source destination LEFT|RIGHT LEFT|RIGHT timeout 列表弹出一个元素,推到另一个列表并返回,或者阻塞直到一个是可用的 LEFT|RIGHT LEFT|RIGHT : 弹出元素位置 summary: Pop an element from a list, push it to another list and return it; or block until one is available since: 6.2.0 2)BLPOP k

codelmh的博客 571

实战测评:4大搜索API(You.com/Tavily/Exa/Perplexity)谁更适合你的AI项目?附Python调用代码

本文实战测评了You.com、Tavily、Exa和Perplexity四大搜索API在AI项目中的集成应用,详细对比了它们的技术特性和Python调用方法。针对LLM实时数据需求,You.com的优化设计表现突出,支持32k大上下文窗口和快速响应。文章提供了完整的代码示例和场景化选型建议,帮助开发者高效集成搜索API到AI项目中。

weixin_42569329的博客 478

Redis——常用数据类型List

Redis常用数据类型List 指令,编码,应用场景

m0_70289867的博客 1467

最新测算源码PHP算命源码-风水八字-八字起名-塔罗牌占卜

未来,随着技术的发展和用户需求的变化,我们可以继续对系统进行升级和优化,以满足更多用户的需求和期望。数据库设计:创建一个名为bazi的数据库表,包含以下字段:id(自增ID)、name(姓名)、sex(性别)、birth_date(出生日期)、birth_time(出生时间)、bazi(八字结果)。数据库设计:创建一个包含塔罗牌信息的数据库表,如tarot_cards,包含字段:id(塔罗牌ID)、name(塔罗牌名称)、meaning(塔罗牌含义)等。根据操作系统的不同,PHP的安装方法会有所不同。

shanbeizi的博客 2417

iTunes备份文件路径修改方法

因为以前的很多帖子iTunes都不是从微软下载的,而现在的iTunes一般都是微软商店里面的,它的路径为:“C:\Users\ 你的用户名 \Apple\MobileSync” (注:用户名,根据个人电脑名称更改)打开iTunes备份路径:“C:\Users\txh\AppData\Roaming\Apple Computer\MobileSync”,其中文件夹MobileSync就是用来存放备份文件的。创建你想备份纯在的目录创建备份文件目录(我的是G:/APPLE/Backup)2.粘贴的剪切文件目录。

尘玥的故事 1万+

redis基本数据类型和常见命令

Redis是典型的key-value(键值型)数据库,key一般是字符串,而value包含很多不同的数据类型:Redis为了方便我们学习,将操作不同数据类型的命令也做了分组,在官网()可以查看到不同的命令:在redis客户端中,可以通过help @命令组名或help 命令名查看命令的用法本文首先将对redis的通用命令进行介绍,在讲解redis的5种基本数据类型(String,Hash,List,Set,SortedSet)中穿插介绍在redis中key的结构该如何设置。

c1tenj2的博客 1382

Spark Sql 连接mysql

转载请务必注明原创地址为:http://dongkelun.com/2018/03/21/sparkMysql/ 1、基本概念和用法(摘自spark官方文档中文版) Spark SQL 还有一个能够使用 JDBC 从其他数据库读取数据的数据源。当使用 JDBC 访问其它数据库时,应该首选 JdbcRDD。这是因为结果是以数据框(DataFrame)返回的,且这样 Spark SQL操作轻松或便......

主要分享大数据相关的知识,如Spark、Hudi 1万+

Redis List(哈希表) 命令使用

本文主要用作学习记录,参考http://redisdoc.com/index.html #BLPOP BLPOP 是列表的阻塞式(blocking)弹出原语。 它是 LPOP 命令的阻塞版本,当给定列表内没有任何元素可供弹出的时候,连接将被 BLPOP 命令阻塞,直到等待超时或发现可弹出元素为止。 当给定多个 key 参数时,按参数 key 的先后顺序依次检查各个列表,弹出第一个非空列

Biu Biu Biu ~~~~~ 462

history 历史命令记录功能如何防坏人(高级)

在 Linux 下面可以使用 history 命令查看用户的所有历史操作,同时 shell 命令操作记录默认保存在用户目录的 .bash_history 文件中。通过这个文件可以查询 shell 命令的执行历史,有助于运维人员进行系统审计和问题排查,同时在服务器遭受黑客攻击后,也可以查询黑客登录服务器的历史命令操作。但是黑客在入侵后,为了抹除痕迹,会删除 .bash_history 文件,这个就需...

墨痕诉清风的博客 1655

Horn-Schunck光流算法的Python实现

光流是计算机视觉领域中的一个重要概念,它描述了图像中物体在时间上的运动。Horn-Schunck光流算法是一种经典的光流估计方法,通过对图像的亮度变化进行建模,来估计像素的运动速度。在本文中,我们将使用Python实现Horn-Schunck光流算法,并提供相应的源代码。请注意,该算法假设图像上的亮度变化主要由物体的运动引起,并且假设光流在整个图像上是稠密的。在上面的示例中,我们首先读取了两个输入图像,然后使用我们实现的Horn-Schunck光流算法估计了它们之间的光流。首先,我们需要导入一些必要的库。

持续更新 495

redis数据类型:list

list 结构示意图,可参考 python 中的 list,特别是范围查找逻辑正序查找:如 0 到 5,从头开始算起,负序查找:如 0 到 -5,通常用于实现栈和队列栈:先进后出,使用 list 的 lpush 可以实现栈的功能,依次向前插入数据,按正序索引取值的时候,可以实现栈的功能。队列:先进先出,使用 rpush可以实现队列的功能,依次向后插入数据,按正序索引取值的时候,可以实现队列的功能。

成功的真谛,只不过坚持下去-----持之以恒! 1619

十年芯片资深IC设计工程师面经系列(四)SDC约束

set_driving_cell:当我们的设计是模块级(Block level)的design时,我们的设计前面一般还有其他的设计,那么前面模块的输出便是我们模块的输入,5.1set_false_path:可以单独的时钟或者路径进行约束。set drive :当我们的设计是芯片级(Chip level)的顶层设计时,芯片外围电路要驱动的是负载较大的IO单元,故需要的驱动能力较强,:set_load 是指output端口的负载,设置的值会影响输出到端口的net上的电容,从而影响相应的路径延时。

weixin_47349046的博客 1773

Redis5【使用篇】01:Redis常用数据类型【string、hash、list、set、sorted set】

Redis5【使用篇】01:Redis常用数据类型【string、hash、list、set、sorted set】

weixin_40612128的博客 469

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

获取list相同值的下标_闲扯Redis三 : Redis五种数据类型之List型

前言 Redis提供了5种数据类型:String(字符串)、Hash(哈希)、List(列表)、Set(集合)、Zset(有序集合),理解每种数据类型的特点对于redis的开发和运维非常重要。Redis中的list是我们经常使用到的一种数据类型,根据使用方式的不同,可以应用到很多场景中。操作命令List数据类型在 Redis 中的相关命令:命令描述用法LPUSH(1)将一个或多个...

weixin_39631767的博客 475

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

Redis 数据类型:List 列表的深度解析与应用

Redis 中的 List 类型是一种灵活的数据结构,其功能类似于编程语言中的数组或顺序表,但其内部实现更接近于双端队列 (deque)。这使得在列表的头部和尾部进行元素的插入和删除操作都非常高效。有序性:列表中的元素是按照插入顺序排列的。可重复性:与 Set 不同,List 允许存储重复的元素。高效的头尾操作:通过 lpush、rpush、lpop 和 rpop 等命令,可以快速地在列表两端添加或移除元素,因此常被用作栈或队列。

2301_80863610的博客 8929

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

六: redis的list数据类型

六: redis的list数据类型 list是一个有序的集合,可以作为队列,栈:集合的双端都是可以进行操作的。 命令 lpush 解释: 往集合左端插入元素,如果键不存在则创建再插入元素,返回集合的长度 用法: lpush key value [value …] 2.4版本及之后的版本支持多个value,之前的只支持单个value 示例: 127.0.0.1:6379> lpush k...

勿在浮沙筑高台 426

Redis6 五:Redis常用五大数据类型—— 字符串String 和 列表List

String 是 Redis 最基本的类型,你可以理解成与Memcached一模一样的类型,一个key对应一个value。String类型是二进制安全的。意味着Redis的string可以包含任何数据。比如jdg图片或者序列化的对象。String类型是Redis最基本的数据类型,一个Redis中字符串value最多可以是512M原子性,有一个失败则都失败String的数据结构为简单动态字符串(Simple Dynamic String,缩写SDS)。是可以修改的字符串,内部结构实现上类似于Java的Arra

GQ的博客 298

Redis 学习 - 1.Redis基础:string hash list set sorted_set数据类型

1. Redis基础 Redis入门 002-redis入门:Nosql应用场景介绍 问题 2008年奥运会购票崩溃 12306崩溃 淘宝崩溃 京东崩溃 … 问题现象 海量用户 高并发 罪魁祸首--关系型数据库 性能瓶颈:磁盘IO性能低下 扩展瓶颈:数据关系复杂,扩展性差,不便于大规模集群 解决思路 降低磁盘IO次数,越低越好-----内存存储 去除数据间关系,越简单越好--...

liangwenhao1108的博客 1289

Redis的key关键字和五种常用数据类型:String、List、Hash、Set、Zset及其示例演示

1、key关键字 1、set/get/keys/del set u1 zhang3 #####添加数据 get u1 #####获取数据 exists u1 #####获取数据 del u1 #####删除数据 keys * #####获取所有数据 2、expire/ttl/type expire u1 10 ...

曹利荣的博客 1271

Redis高级(二):redis string数据类型与redis list数据类型详解

1. string数据类型与结构 1.1 string类型简介 String类型是redis的最基础的数据结构,也是最经常使用到的类型。而且其他的四种类型多多少少都是在字符串类型的基础上构建的,所以String类型是redis的基础。 string 类型的值最大能存储 512MB,这里的String类型可以是简单字符串、复杂的xml/json的字符串、二进制图像或者音频的字符串、以及可以是数字的字符串。 常用命令: 1、set命令 **描述:**该命令用于设置给定 key 的值。如果 key 已经存储其他值

大胡子哥哥 1151

Redis数据类型:List

Redis数据类型:List Redis学习准备篇 https://blog.youkuaiyun.com/longqiyuye925/article/details/106246041 所有的list命令都是l开头的 127.0.0.1:6379> lpush list one --将值插入list列表的头部 (integer) 1 127.0.0.1:6379> lpush list two (integer) 2 127.0.0.1:6379> lpush list three (integer

longqiyuye925的博客 264

redis:list数据类型与操作

redis数据类型之list:redis list数据类型是一个双向循环链表。redis.conf中的相关配置如下: 428 # Similarly to hashes, small lists are also encoded in a special way in order 429 # to save a lot of space. The special representation i

shamohua的专栏 6470

Redis List数据类型详解:从命令到Java实战

Redis List是一种有序的字符串集合,支持高效的插入和删除操作,常用于实现消息队列、最新列表等场景。本文详细介绍了List的核心命令(LPUSH/RPOP/LRANGE等)及其使用方式,分析了其底层QuickList实现原理。通过Java代码示例展示了如何利用List实现消息队列功能,包括阻塞式消费等高级用法。Redis List凭借其高性能和灵活性,成为开发中常用的数据结构之一。

weixin_51786043的博客 1011

Redis核心数据类型:String与List的深度解析与应用

本文深入探讨了Redis的两种核心数据类型——String和List,详细介绍了它们的基本概念、应用场景和实用技巧。通过生动的案例和日常生活中的现象,使得即使没有背景知识的读者也能轻松理解这些专有名词和概念。最后,文章提醒读者Redis是一个不断进化的项目,鼓励大家继续学习和探索其更多高级特性,以便更好地为实际项目服务。

silenceallat的博客 835

redis的原理和源码-redis的六种数据类型基本介绍:string、hash、list、set、zset、stream

简单介绍下redis的六种数据结构

迷雾总会解 410
上一篇: redis的数据类型:Hash
下一篇: redis的数据类型:SET与ZSET
烧冻鸡翅QAQ
博客等级 码龄6年 196粉丝 98原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值