`

Redis的列表数据类型

阅读更多
  • List 类型概述
  • List 的命令操作
  • List 数据类型应用案例


List 类型概述 — List 的基本概念

List是一个链表结构,主要功能是push、pop、获取一个范围的所有值等等,操作中key理解为链表的名字。Redis的list类型其实就是一个每个子元素都是string类型的双向链表。我们可以通过push、pop操作从链表的头部或者尾部添加删除元素, push和pop命令的算法时间复杂度都是O(1),这样list既可以作为栈,又可以作为队列。链表的最大长度是232-1。

List 类型概述 — 底层实现
Redis列表使用两种数据结构作为底层实现:
1. 双端链表

2. 压缩列表
因为双端链表占用的内存比压缩列表要多,所以当创建新的列表键时,列表会优
先考虑使用压缩列表作为底层实现,并且在有需要的时候,才从压缩列表实现转
换到双端链表实现。


伪代码:
列表:
typedef struct list {
      listNode *head;                 // 表头指针
      listNode *tail;                     // 表尾指针
      unsigned long len;             // 节点数量
      void *(*dup)(void *ptr) ;   // 复制函数
      void (*free)(void *ptr) ;     // 释放函数
      int (*match)(void *ptr, void *key) ;  // 比对函数
}list;
// listNode是双端链表的节点
Typedef   struct  listNode  {
       struct listNode *prev;  // 前驱节点
       struct listNode *next;  // 后继节点
       void *value;   // 值
} listNode;



List 类型概述 — 使用场景
Redis list应用场景非常多,比如:
  • 微博的关注列表
  • 粉丝列表
  • 博客评论
  • 消息队列
  • 取最新 N  个数据的操作
  • 排行榜应用,取 TOP  N 操作


List 的常用命令
LPUSH
语法:LPUSH  key   value
解释:用来向列表左边增加元素,返回值表示增加元素后列表的长度;LPUSH命令还支持同时增加多个元素。

LRANGE
语法:LRANGE  key   start  end
解释:用来获得列表中的某一片段,返回索引从 Start 到 end 之间的所有元素,索引从0开始。LRANGE 命令也支持负索引,-1表示最右边的元素,-2表示最右边倒数第2个元素。

RPUSH
语法:RPUSH  key   value
解释:用来向列表右边增加元素,返回值表示增加元素后列表的长度;RPUSH命令还支持同时增加多个元素。

LINSERT
语法:LINSERT  key   BEFORE | AFTER  pivot  value
解释:此命令首先会在列表中从左到右查找值为pivot的元素,然后根据第2个参数是BEFORE还是AFTER来决定将Value插入到前面还是后面。返回值是插入后元素的个数。

LPOP/RPOP
语法:LPOP/RPOP   key
解释:LPOP命令可以从列表左边弹出一个元素;RPOP从列表右边弹出一个元素。
LPOP和LPUSH配合,RPOP和RPUSH配合可以把列表当作栈使用;LPUSH和RPOP配合,RPUSH和LPOP配合可以把列表当作队列使用。

LREM
语法:LREM  key   count   value
解释:LREM 命令会删除列表中前 count 个值为value 的元素,返回值是实际删除的元素的个数。
当 count >0时,从左边开始删除;
当 count <0时,从右边开始删除;
当 count =0时,删除所有值为 value 的元素;

LTRIM
语法:LTRIM  key   start   end
解释:LTRIM 命令会删除列表中指定索引范围外的所有元素,返回值即指定索引内的元素。LTRIM 命令常和 LPUSH命令一起使用来限制列表中元素的数量,比如记录日志时我们希望只保留最近的100条记录,则每次添加日志时调用一次 LTRIM 命令即可。

RPOPLPUSH
语法:RPOPLPUSH  src   dest
解释:RPOPLPUSH 命令先从 src 列表的右边弹出一个元素,然后将其加入 dest 列表的左边,并返回这个元素的值。当把列表当作队列时,RPOPLPUSH 可以在多个队列中传递数据。当 src 与dest 相同时,此命令会不断的将队尾的元素移动到队首。

LINDEX
语法:LINDEX  key  index
解释:LINDEX 命令用来返回指定索引的元素,索引从0开始。
LSET
语法:LSET key  index  value
解释:将索引为 index 的元素赋值为 value。

LSET
语法:LSET key  index  value
解释:将索引为 index 的元素赋值为 value。

List 数据类型应用案例
  • String 类型存储文章 ID
  • List 类型存储文章 ID
  • List 类型存储文章评论


如何获取文章列表
读取 post:count 键获得博客文章的最大 ID
根据 ID 进行分页(假设每页10条),第 n 页的文章 ID 范围是“最大的文章ID-(n-1)*10”到“max(最大的文章 ID – n*10+1,1)”
对每个ID使用HMGET命令来获取文章的数据,伪代码如下:
页显示10篇文章
$postsPerPage  = 10
# 获得最后发表的文章 ID
$lastPostID = GET posts:count
# 当前页码范围
$start = $lastPostID – ($currentPage - 1) * $postsPerPage
$end = max( $lastPostID – $currentPage  * $postsPerPage +1,1)
# 遍历文章 ID 获取数据
For $i = $start down to $end
# 获取文章的标题和作者并打印出来
post = HMGET post:$i,title,author
         Print $post[0]
         Print $post[1]

缺点:删除文章时影响页码分布,都需要从最大文章 ID 开始遍历。


List 类型存储文章 ID
使用列表类型键 posts:list 记录文章 ID
LPUSH posts:list  文章ID
LREM    posts:list  1  文章 ID
# 使用 LRANGE 实现分页
$postsPerPage  = 10
$start =  ($currentPage - 1) * $postsPerPage
$end =  $currentPage  * $postsPerPage  - 1
$postsID = LRANGE posts:list,$start,$end
# 获取需要显示文章的 ID 列表
For   each   $id   in   $postsID
          $post = HGETALL post:$id
           print  文章标题:$post.title
# 使用列表类型键post:文章 ID:comments来存储文章的评论
$serializedComment = serialize($author,$email,$time,$content)
LPUSH  post:42:comments,$serializedComment
读取评论时使用 LRANGE 命令

说明:案例摘抄自极客学院,感谢大牛的分享。
  • 大小: 38.6 KB
  • 大小: 28.3 KB
分享到:
评论

相关推荐

    Java操作Redis的多种数据类型

    本文将深入探讨如何使用Java操作Redis的四种主要数据类型:字符串(String)、列表(List)、哈希(Hash)和集合(Set)。 首先,我们来看**字符串类型**(String)。在Redis中,字符串是最基础的数据类型,可以...

    数据结构Redis中数据类型对应的数据结构.pdf

    在Redis中,键的数据类型始终是字符串,而值的数据类型包括字符串、列表、字典、集合和有序集合。 1. 字符串(String):这是最基础的数据类型,对应数据结构是简单的字符串。在Redis中,字符串可以用来存储各种...

    Redis数据类型视频

    在本课程中,你将了解Redis是什么、能干什么、如何用,了解NoSQL的使用场景和概念,快速掌握Redis的安装配置、五大数据类型、常用操作命令、Redis持久化、主从复制、事务控制以及用Jedis操作进行Java开发等知识。...

    基于redis分页和排序设计(根据redis的数据类型设计)

    基于redis分页和排序设计(根据redis的数据类型设计)

    02_redis 数据类型.pdf

    首先,Redis数据类型可以分为五种常用类型:string、hash、list、set、sorted_set。Redis自身是一个基于内存的存储系统,其中所有的数据都是采用key:value的形式存储的。key总是字符串类型,而value则根据数据类型的...

    Redis集群数据迁移操作文档

    《Redis集群数据迁移实战指南》 在IT领域,数据迁移是一项关键任务,特别是在使用Redis这样的高性能内存数据库时。本文将详细介绍如何进行Redis集群的数据迁移,包括全量和增量数据迁移,以及离线迁移的方法,主要...

    52丨算法实战(一):剖析Redis常用数据类型对应的数据结构1

    它的数据类型包括字符串、列表、字典、集合和有序集合,这些数据类型对应着不同的数据结构,从而实现了各自的功能。 1. **字符串(String)** - 字符串是最基本的数据类型,对应于数据结构中的字符串。在Redis中,...

    redis数据类型指令整理

    通过以上对Redis数据类型及其相关指令的整理,我们可以了解到Redis提供了非常丰富和灵活的数据操作能力,这使得Redis成为了一个在多种应用场景下都非常实用的工具。无论是在数据存储、缓存加速还是消息队列等场景,...

    Redis 数据类型.docx

    redis Redis 数据类型.docx 来源:https://www.runoob.com/redis/redis-data-types.html

    Redis实战_Redis实战中文完整版_Redis快速入门_Redis数据类型及操作_Redis常用

    2. **Redis数据类型及操作**:这是Redis的核心部分,包括五大数据类型: - **字符串(String)**:最基础的数据类型,支持设置、获取、增加、减少等操作。 - **哈希(Hash)**:用于存储键值对集合,适用于存储对象。 ...

    Redis 数据类型.pdf

    Redis 数据类型

    Redis基础架构与数据类型 Redis键值操作与命令 Redis字符串与列表数据结构 Redis哈希与集合数据结构

    Redis基础架构与数据类型 Redis键值操作与命令 Redis字符串与列表数据结构 Redis哈希与集合数据结构 Redis排序集合与使用场景 Redis持久化策略与RDB Redis持久化策略与AOF Redis主从复制与集群配置 Redis事务与Lua...

    redis面试题之数据类型.zip

    在面试中,Redis的数据类型是考察候选人对其理解深度的重要环节。下面将详细介绍Redis中的五大数据类型及其应用。 1. 字符串(Strings) Redis中的字符串是最基本的数据类型,可以存储任何可打印的字符序列,如数字、...

    redis可视化客户端工具

    数据类型为重点,redis数据,大小 导航历史记录 支持的生存时间 redis数据支持分页查询 支持多重选择删除,剪切,复制,出口redis数据 支持平面视图和层次结构视图列出redis数据 多语言支持,目前支持英语和...

    Redis基础数据库类型

    Redis 基础数据类型 Redis 作为一个内存数据库已经被许许多多的公司使用,它的性能非常的优秀,读写速度支持非常快而且支持 10W 的 QPS。今天我们就来学习下它的丰富的数据类型。 String(字符串) 字符串类型是 ...

    redis的数据操作

    redis当中一共支持五种数据类型,分别是string字符串类型,list列表类型,集合set类型,hash表类型以及有序集合zset类型 字符串操作 SET key value(指定key的值) GET key value(获取key的值) GETRANGE key m,n(获取...

    c++ 操作redis数据库

    Redis是一个开源的、基于内存的数据结构存储系统,它支持多种数据类型,如字符串、哈希、列表、集合、有序集合等,且具有高速读写能力。而C++是一种静态类型的、编译式的、通用的、大小写敏感的、不仅支持过程化编程...

    Redis学习资料

    Redis学习手册 Hash数据类型 doc Redis学习手册 Key操作命令 doc Redis学习手册 List数据类型 doc Redis学习手册 Set数据类型 doc Redis学习手册 Sorted Sets数据类型 doc Redis学习手册 String数据类型 doc Redis...

    Redis 数据类型详细介绍.pdf

    Redis 数据类型详细介绍

    redis 数据类型详解 以及 redis适用场景场合

    ### Redis 数据类型详解 Redis是一种高性能的键值存储系统,提供了多种数据结构的支持,使得它在不同的应用场景下都能够表现出色。接下来,我们将详细介绍Redis中的主要数据类型及其应用场景。 #### String 字符串...

Global site tag (gtag.js) - Google Analytics