Redis中list数据类型的相关命令、编码方式和应用场景

Redis常用命令——List篇 列表类型是用来存储多个有序的字符串,如下图所示,a、b、c、 d、e五个元素从左到右组成了一个有序的列表,列表中的每个字符串称为元素(element) ,一个列表最多可以存储2^32-1个元素。在Redis 中,可以对列表两端插入(push)和弹出 (pop),还可以获取指定范围的元素列表、获取指定索引下标的元素等。列表是一种比较灵活的数据结构,它可以充当栈和队列的角色,在实际开发上有很多应用场景。 阅读详情

相关命令:

操作类型命令时间复杂度
添加rpush key value [value ...]O(k),k 是元素个数,从右侧添加,如果key不存在则会创建这个key,返回key中元素个数
添加lpush key value [value ...]O(k),k 是元素个数,从左侧添加,如果key不存在则会创建这个key
添加rpushx key value [value ...]O(k),k 是元素个数 ,从右侧添加 ,如果key不存在则不会创建这个key,返回值为零,成功返回key中元素个数。
添加lpushx key value [value ...]O(k),k 是元素个数 ,从左侧添加 ,如果key不存在则不会创建这个key,返回值为零,成功返回key中元素个数。
添加linsert key before | after pivot valueO(n),n 是 pivot 距离头尾的距离
查找lrange key start endO(s+n),s 是 start 偏移量,n 是 start 到 end 的范围
查找lindex key indexO(n),n 是索引的偏移量
查找llen keyO(1)
删除lpop keyO(1)
删除rpop keyO(1)
删除lrem key count valueO(k),k 是元素个数
删除ltrim key start endO(k),k 是元素个数
修改lset key index valueO(n),n 是索引的偏移量
阻塞操作blpopO(1)
阻塞操作brpopO(1)

  1. 列表中的元素是有序的,这意味着可以通过索引下标获取某个元素或者某个范围的元素列表,例如要获取图 2-20 的第 5 个元素,可以执行 lindex user:1:messages 4 或者倒数第 1 个元素,lindex user:1:messages -1 就可以得到元素 e,此处的有序指的不是升序或者降序,而是强调顺序很关键,也就是说把一个list的元素不同元素位置颠倒一下得到的新list和原来的不等价,列表中允许出现重复元素。
  2. 区分获取和删除的区别,例如图 2-20 中的 lrem 1 b 是从列表中把从左数遇到的前 1 个 b 元素删除,这个操作会导致列表的⻓度从 5 变成 4;但是执行 lindex 4 只会获取元素,但列表长度是不会变化 的。
  3. 列表中的元素是允许重复的,例如图 2-21 中的列表中是包含了两个 a 元素的。

Redis中list底层更像双端队列,和java中的list并不一样,所不要期待这里的list有和Java中list有相同的方法/狗头!

lpushx & rpushx:

lpushx & rpushx 在 key 存在时,将⼀个或者多个元素从左侧放⼊(头插)到 list 中。不存在,直接返回0:

LPUSHX key element [element ...] // element 存入list的字符串,只能存字符串吗??
RPUSHX key element [element ...] // x 的含义是 exists 存在

  因为key1不存在,所以 lpush key1 777 888 并没有添加成功,也没有创建key1。

lrange:

lrange key start end // 获取闭区间内的元素

一谈到下标,我们往往就要关注是否越界的问题:

  • C++中,下标越界访问一般认为是“未定义行为”,它会越界的位置访问数据,可能会导致程序崩溃或者得到一个非法数据、或者合法但错误的数据、又或者敲好合法的正确数据都有可能。
  • Java中,如果数组越界会直接抛出异常
  • lrange 命令中如果下标越界采用的是一种软着陆的方式,对于越界的位置会尽可能的获取里面的合法数据,如下图:

虽然下标100越界了,但是redis并没有报错,对于合法区间正常获取元素,对于非法区间不做处理

lrang == list rang != light rang

因此并不存在 rrang

lpop & rpop:

删除元素,redis5中不支持删除指定个数元素,redis6.2及以后版本支持删除指定个数的元素:

lpop key  //redis5
lpop key element//redis6.2

lindex:

获取给定下标的元素,同样也是软着陆,需要注意的是这个命令的时间复杂度是O(N)的,N指的该list中的规模。

linstert:

linsert key before | after pivot value // O(n),n 是 pivot 距离头尾的距离 

 如果有多个基准点,则会从左向右查找第一个基准点添加元素。

lrem:

lrem key count value // lrem => list remove != light rremove 所以没有rrem

 下面是官方解释:如果count是正数代表从head开始删除count个value,如果count是负数代表从tial开始删除count个value,如果count为0代表删除列表中所有的value。

Redis中的list的底层更像是双端列表,而不是Arraylist,所以有些操作的时间复杂度是O(N),关于下标越界的如何处理的问题,lindex key index 如果越界了则会返回nil,并不会报错或者“拆忙盒”,而lset key index element 如果下标越界则会直接报错。

blpop & brpop:

阻塞队列:当队列为空时,尝试出队列会产生阻塞,直到队列不会空;当队列已满时,尝试入队列则会产生阻塞。谁阻塞?想要出队列和入队列的线程阻塞。

blpop & brpop 时出队的命令,所以消费者客户端执行这两个命令的时候队列为空,则会进入阻塞状态(注意可不是redis服务器端阻塞),但是也不能一直阻塞,所以要设置一个过期时间(单位为秒s)解除阻塞状态:

进入阻塞状态:

当另外一个终端向队列中插入元素后,队列不为空,解除阻塞状态:

 blpop & brpop 还支持监控多个列表:所有列表都为空则进入阻塞状态,那个列表先不空,就从那个列表出元素。如果有多个列表都不为空,则从 blpop key [key ...] timeout 中第一个不为空的列表中出元素。

编码方式:

列表类型的内部编码有两种(现在已经结合为了一种quicklist编码方式) :

  1. ziplist(压缩列表):当列表的元素个数小于 list-max-ziplist-entries 配置(默认 512 个),同时 列表中每个元素的⻓度都⼩于 list-max-ziplist-value 配置(默认 64 字节)时,Redis 会选用 ziplist 来作为列表的内部编码实现来减少内存消耗。 
  2.  linkedlist(链表):当列表类型无法满足 ziplist 的条件时,Redis会使用linkedlist作为列表的内部实现。

上述中的512、64是可以在redis配置文件中修改的,这两个配置都已经不用了,原因是list采用了quicklist进行编码:

quicklist相当于ziplist和linkedlist的结合:整体看是一个链表,每个节点又是一个压缩列表,每个压缩列表都不会太大,同时再把多个压缩列表通过链式结构连起来:

应用场景:

充当消息队列:

上图的消息队列模型可以起到“轮询”的作用,谁先发起brpop谁就先得到元素,如果再发起一brpop,以为redis是单线程模型,所以会重新排到后面。

分频道的消息队列:

分页查询:

微博 Timeline 每个用户都有属于自己的 Timeline(微博列表),现需要分页展示文章列表。此时可以考虑使用列表,因为列表不仅是有序的,同时支持按照索引范围获取元素。

1)每篇微博使用哈希结构存储,例如微博中 3 个属性:title、timestamp、content:

比特就业课 hmset mblog:1 title xx timestamp 1476536196 content xxxxx
hmset mblog:n title xx timestamp 1476536196 content xxxxx

2)向用户 Timeline 添加微博,user::mblogs 作为微博的键:

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

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

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

此方案在实际中可能存在两个问题:

1. 1 + n 问题。即如果每次分页获取的微博个数较多,需要执行多次 hgetall 操作,此时可以考虑使用 pipeline(流水线)模式批量提交命令(把多个命令合并成一个网络请求),或者微博不采用哈希类型,而是使用序列化的字符串类型,使用 mget 获取。

2. 分裂获取文章时,lrange 在列表两端表现较好,获取列表中间的元素表现较差,此时可以考虑将列表做拆分。

写的有点乱了,多多包涵!

Rstudio安装org.Hs.eg.db 自己也是个小白,初次安装org.Hs.eg.db碰到好多问题,步骤总结如下: 第一,instal.packages()安装,不行则换 BiocManager::install() 第二,如BiocManager不成,说明不是最新版本,可按提示安装最新版 BiocManager::install(version = '3.13') #由于R版本较新,按照提示中的相关信息,安装最新版本的 第三,再次安装 BiocManager::install("org.Hs.eg.db") 第四,之后每个人. 阅读详情

相关推荐

宇树智能人形机器人模块化腿部动力系统技术拆解

o电机防摔防护板(3.1.5.1)→端盖总成(3.1.5.2)→电机外壳(3.1.5.4)的冲击力传递路径;o散热风扇(3.1.3.1)推动冷风→大腿基座腔体→散热片组(3.1.5.7)→中空大腿杆排出;o防御专利:覆盖“关节热管理风道接口标准”、“抗冲击结构身份编码”;o大腿杆腔体(3.1.3.4)内置反平行四边形机构,避免连杆外露。:力传感器(3.1.8.4.2)仅部署于足端,缺失关节力矩反馈。:更换行星减速器(3.1.5.5)需拆解整个电机模块;o热量传导路径:电机定子→外壳→散热片组。

weixin_50955533的博客 1232

java 用redisTemplate 的 Operations存取list集合

一 、存取为list类型 @RestController @RequestMapping("/test") @Slf4j public class TestController { @Autowired private RedisTemplate redisTemplat...

weixin_30315723的博客 3460

OpenBmc开发2:构建开发环境

编译环境VMware + ubuntu 18.04 编译环境构建:参考OpenBmc开发1:构建开发环境 1、打开一个Ternimal,进入openbmc目录下 2、查看有哪些不同的编译配置 find meta-* -name local.conf.sample 可以看到如下编译配置 3、生成编译配置 插入TEMPLATECONF,上边查询到的配置有很多,但是有一些...

master 2万+

redis list底层数据结构

redis list数据结构  redis list数据结构底层采用压缩列表ziplist或linkedlist两种数据结构进行存储,首先以ziplist进行存储,在不满足ziplist的存储要求后转换为linkedlist列表。  当列表对象同时满足以下两个条件时,列表对象使用ziplist进行存储,否则用linkedlist存储。 列表对象保存的所有字符串元素的长度小于64字节 列表对象保存的元素数量小于512个。 redis list元素添加过程  list的数据添加根据传入的变量个数一个个顺

meser88的博客 4729

UE5 Decal混合进阶:如何用DBuffer实现自定义Normal插值(附完整材质配置流程)

本文深入解析了UE5中利用DBuffer技术实现Decal自定义Normal插值的完整流程。通过详细的材质配置步骤和核心算法说明,帮助开发者突破传统混合模式限制,掌握高级法线控制技巧,特别适合需要精细环境细节的3A级项目开发。

table的专栏 225

开源libmodbus编译为32位和64位动态库

libmodbus 是支持Linux,Mac OS X,window 的一个开源库,支持modbus TCP和RTU 两种模式。

lemontree1945的博客 1923

Redis存储List类型数据

Redis存储支持的类型没有object,虽然有支持list,但是它只支持list<String>。 现在有两个方法存储对象与泛型。 1、用序列化与反序列化。 2、json   本文采用的是json格式来存储object类型。 废话不多说,直接上代码 public class redisTest{ /** *使用redis自带的工具类 *也可以自己...

Bainily_Wu的博客 5万+

大疆无人机图像传输延时优化全解析:从Lightbridge到OcuSync的实战技巧

本文深入解析大疆无人机图像传输延时优化,对比Lightbridge与OcuSync两大核心通信协议的技术差异与实战表现。文章详细拆解了从传感器采集到屏幕显示的完整延时链条,并提供了从环境频段选择、硬件升级到软件设置的全方位优化技巧,帮助飞手与开发者显著降低图传延时,提升操控体验与作业效率。

weixin_29163857的博客 306

redis基本数据类型之list

redis基本数据类型之list

eugene03的博客 1605

小目标检测之改进的YOLOV11算法

MASF-YOLO通过多尺度特征聚合注意力增强自适应融合三大核心创新,显著提升了无人机视角下的小目标检测性能。

hasakie的博客 1719

计算机组成原理(第三版)唐朔飞-第六章计算机的运算方法-课后习题(17-32)

计算机组成原理(第三版)唐朔飞-第六章计算机的运算方法-课后习题(17-32)

weixin_45735391的博客 12万+

redis常用命令和内部编码

redis常见的命令和常见的数据编码

2202_75560428的博客 1132

RH850从0搭建Autosar开发环境【3X】- Davinci Configurator之EcuM模块配置详解(上)

RH850从0搭建Autosar开发环境【3X】- Davinci Configurator之EcuM模块配置详解(上)

weixin_42412049的博客 1015

[Redis] Redis中的Hash类型和List类型

提到list我们会想到java中的List集合,这样的List就相当于数组或者是顺序表.但是Redis中的List并非是一个简单的数组,更接近于双端队列(deque).因为Redis中的list支持头插,头删,尾插,尾删,还可以获取指定范围之内的元素和指定下表的元素(和python一样,支持负数下标).它可以充当栈和队列的角色.在实际开发中的应用场景非常广泛.阻塞指的就是: 当前线程的代码不会继续执行,会在满足一定条件之后唤醒.

无需多言 1822

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

【Redis原理】Redis基本数据类型及其原理

Redis支持多种数据类型,各有特点及应用场景:String(字符串)可存储文本、数字或二进制数据,适用于缓存、计数和简易分布式锁;List(列表)按插入顺序存储元素,适合最新动态展示和简单消息队列;Hash(哈希表)存储键值对,用于对象数据存储;Set(集合)存储唯一元素,支持集合运算,适用UV统计和好友推荐;Zset(有序集合)按分值排序,适合排行榜和优先级队列;BitMap(位图)通过二进制位节省空间,适用于签到统计和用户在线状态。

gadiaola的博客 2210

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

Redis命令使用

用来查询redis中匹配的key?匹配任意一个字符*匹配任意个字符[ae] 只能匹配a或者e[^a]排除a的字符,但固定会匹配一个[a-c] 匹配a到c闭区间内所有的字符例如: keys * 匹配所有字符。

2301_80079026的博客 606

【Redis】list数据类型相关指令

Redis列表(list)是一种有序字符串集合,支持两端插入(lpush/rpush)和删除(lpop/rpop),最多可存储2^32-1个元素。列表具有有序性、允许重复元素等特点,可充当栈或队列使用。主要操作包括:lpush/lpushx(头插)、rpush/rpushx(尾插)、lpop/rpop(删除)、lindex(获取元素)、lrange(获取范围元素)、linsert(指定位置插入)、llen(获取长度)等。特殊操作有blpop/brpop(阻塞式删除)、lrem(删除指定值元素)、ltrim(

jiunian_thx_cn的博客 876

Redis 数据类型及数据结构

常见的有五种:String、Hash、List、Set、ZSetString是最基本的key-value结构,key是唯一标识,value是具体的值。value的值可以为数字或者字符串内部实现字符串对象的内部编码有3种:int、raw、embstr保存的是整数值:整数值用long类型表示,保存在字符串对象结构的ptr属性里面,并将编码设置为int保存的是字符串:常用指令: 应用场景缓存对象:直接缓存整个对象的JSON将key进行分离为 user:ID:属性常规计数Redis处理命令是单线程,执行命令的过程是

weixin_52620731的博客 1243

Redis:数据类型

前言 Redis作为应用最广泛的K-V数据库,包含了丰富的数据类型。这里所说的数据类型,其实是指V的数据类型。 Redis的数据类型大致分为以下几类:String、Hash、List、Set、Sorted Set、HyperLogLog、Geo。 本篇主要讲解前五种常用的数据类型,在讲解数据类型之前,先看一下Redis相关的帮助命令。学会使用这些命令,能够帮我们快速的了解Redis 前置命令 启动...

Sicimike的博客 2937

Redis——Redis基础:2 Redis常见命令和数据结构

讲解了Redis的常见命令,还讲解了Redis的数据类型,包括String类型、Hash类型、List类型、SET类型和SortedSet类型。

念头通达 667

Redis 相关命令详解及其原理

文章详细介绍了 Redis 的安装方法(包管理器和源码编译),并深入剖析了其单线程模型和底层数据结构原理。重点讲解了 String 和 List 两种基础数据类型,包括 String 的三种编码方式(int/embstr/raw)和 List 的 quicklist 实现结构,列举了各类型的常用命令及其时间复杂度,并给出了缓存、计数器、分布式锁等典型应用场景。后续内容预计将继续解析其他数据类型和 Redis 高级功能。

qq_57951250的博客 425

Redis基础——Redis常用命令

Redis的SortedSet是一个可排序的set集合,与Java中的TreeSet有些类似,但底层数据结构却差别很大。Redis的Set结构与Java中的HashSet类似,可以看做是一个value为null的HashMap。例如,需要存储用户、商品信息到redis,有一个用户id是1,有一个商品id恰好也是1,此时如果使用id作为key,那就会冲突了,该怎么办?从而避免了key的冲突问题。HSETNX:添加一个hash类型的key的field值,前提是这个field不存在,否则不执行。

康小庄的博客 1270

Redis——》数据类型:String(字符串)

Redis——》数据类型:String(字符串)

小仙~ 451

redis相关知识

后端需要知道的关于redis的事,基本都在这里了。 此文后续会改为粉丝可见,所以喜欢的请提前关注。 你的点赞和评论是我创作的最大动力,谢谢。 1、入门 Redis是一款基于键值对的NoSQL数据库,它的值支持多种数据结构: 字符串(strings)、哈希(hashes)、列表(lists)、集合(sets)、有序集合(sorted sets)等。 • Redis将所有的数据都存放在内存中,所以它的读写性能十分惊人,用作数据库,缓存和消息代理。 Redis具有内置的复制,Lua脚本,LRU逐出,事务.

qq_42946963的博客 7138

Redis基础命令

例如:需要存储用户、商品信息到Redis,有一个用户的id是1,有一个商品的id恰好也是1,如果此时使用id作为key,那么就回冲突,该怎么办?Redis是典型的key-value数据库,key一般是字符串,而value包含很多不同的数据类型。Redis没有类似MySQL中Table的概念,那么我们该如何区分不同类型的Key呢?获取sorted set 中的指定元素的排名:ZREVRANK key memeber。我们可以通过给key添加前缀加以区分,不过这个前缀不是随便加的,有一定的规范。

weixin_73535718的博客 1793

Redis--day2--Redis命令

Redis中数据结构介绍、Redis通用命令、Key的层级格式; Redis命令:String类型、Hash类型、List类型、Set类型、SortedSet类型;

2301_80071187的博客 811

Redis有哪些数据类型、业务场景、底层

Redis有哪些数据类型、业务场景、底层

我从不打没有准备的仗! 9899
上一篇: Redis中hash数据类型的相关命令、编码方式和应用场景
下一篇: Redis中set数据类型的相关命令、编码方式和应用场景
程序员小辉辉
博客等级 码龄5年 825粉丝 182原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值