`

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(获取...

    Redis学习资料

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

    Redis 数据类型详细介绍.pdf

    Redis 数据类型详细介绍

    c++ 操作redis数据库

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

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

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

Global site tag (gtag.js) - Google Analytics