redis基本数据类型之list

本文介绍Redis List数据类型的应用,包括操作命令、应用场景如社交网络的好友点赞、关注列表管理,以及日志系统的统一管理等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

redis基本数据类型之list

list类型介绍

  • 数据存储需求:存储多个数据,并对数据进入存储空间的顺序进行区分
  • 需要的存储数据:一个存储空间保存多个数据,且通过数据可以体现进入顺序
  • list类型保存多个数据,底层使用双向链表存储结构实现

在这里插入图片描述

2. list类型数据基本操作

	添加/修改数据
		lpush key value [value2]
		rpush key value [value2] 
	获取数据
		lrange key start stop  查看全部 lrange key 0 -1
		lindex key index
		llen key 
	获取并移除数据
		lpop key
		rpop key
	以左边为头有点为尾
	右进左查

3.list 类型数据扩展操作

	规定时间内获取并移除数据
		blpop key1 [key2] timeout #秒
		brpop key1 [key2] timeout #秒

4.list类型数据的扩展操作

业务场景1
微信朋友圈点赞,要求按照点赞顺序显示点赞好友信息,如果取消点赞,移除对应好友信息
在这里插入图片描述

一条朋友圈的点赞好友对应一个list,key对应发朋友圈的人,点赞就是把名单rpush到list,取消点赞就是移除指定元素,取消点赞就是在list中删除指定元素,我们前面学的lpop和rpop只能移除首尾元素,

解决方案

	移除指定数据
 	lrem key count value

2. 其他场景

  • twitter、新浪微博、腾讯微博中个人用于的关注列表需要按照用户的关注顺序进行展示,粉丝列表需要将最近关注的粉丝列在前面
  • 企业运营过程中,系统将产生出大量的运营数据,如果每台服务器都维护自己独立的日志,那运维人员管理起来会很麻烦,需要同时查看多个日志文件。我们使用redis统一管理日志,每台服务器一旦产生日志就发送到redis,这样日志就按时间顺序排好了

在这里插入图片描述
解决方案

  • 依赖list的数据具有顺序的特征对信息进行管理
  • 使用队列模型解决多路信息汇总合并的问题
  • 使用栈模型解决最新消息的问题

Tips 6

  • redis应用于具有操作先后顺序的数据控制

4.list 类型数据操作的主要事项

  • list 中保存的数据都是string类型的,数据总容量式有限的,最多2^32-1个元素(4294967295)
  • list具有索引的概念,但是操作数据时候通常以队列的形式,或以栈的形式
  • 获取全部数据操作结束索引设置为-1
  • list 可以对数据进行分页操作,通过第一页的信息来自list,第2页及更多的信息通过数据库的形式加载(第一页查看较多,存放于Redis)
### Redis基本数据类型的底层实现原理 Redis 是一种高性能的键值存储系统,其底层实现依赖于多种数据结构和编码方式,这些设计使得 Redis 在内存使用效率和数据操作性能之间取得了良好的平衡。以下是 Redis 基本数据类型的底层实现详解: #### 1. **String 类型** String 是 Redis 最基础的数据类型,其实现基于两种编码方式:`int` 和 `embstr`/`raw`。 - 当字符串值可以表示为整数时,Redis 使用 `int` 编码来存储该值[^3]。 - 对于较小的字符串(通常小于 44 字节),Redis 使用 `embstr` 编码,这是一种优化后的编码方式,将字符串对象和值合并为一个连续的内存块,减少了内存分配次数[^2]。 - 对于较大的字符串或动态变化的字符串,Redis 使用 `raw` 编码,允许字符串值动态扩展。 ```c // 示例:Redis 中 String 的实现 struct redisObject { unsigned type:4; // 数据类型标识 unsigned encoding:4; // 编码方式 void *ptr; // 指向实际数据的指针 }; ``` #### 2. **List 类型** List 类型在 Redis 中通过双端链表(`linked list`)或压缩列表(`ziplist`)实现。 - 当列表元素较少且每个元素较小时,Redis 使用 `ziplist` 编码以节省内存。 - 当列表元素较多或元素较大时,Redis 转而使用 `linkedlist` 编码,其中每个节点包含一个指向下一个节点的指针[^3]。 ```python # 示例:操作 Redis List 类型 db.ListLeftPush("mylist", "world") # 插入到列表左侧 db.ListRightPush("mylist", "!") # 插入到列表右侧 ``` #### 3. **Hash 类型** Hash 类型用于存储键值对集合,其底层实现基于哈希表(`hashtable`)或压缩列表(`ziplist`)。 - 当 Hash 中的字段和值较少时,Redis 使用 `ziplist` 编码以减少内存开销[^2]。 - 当字段和值增多时,Redis 切换到 `hashtable` 编码,提供更高效的查找和插入性能[^3]。 #### 4. **Set 类型** Set 类型用于存储无序且唯一的元素集合,其底层实现基于整数集合(`intset`)或哈希表(`hashtable`)。 - 如果 Set 中的所有元素都是整数且数量较少,Redis 使用 `intset` 编码,这是一种紧凑的整数集合实现[^2]。 - 如果 Set 包含非整数元素或元素数量较多,Redis 使用 `hashtable` 编码[^3]。 #### 5. **Sorted Set 类型** Sorted Set 是一种有序集合,其底层实现基于跳跃表(`skiplist`)和字典(`dict`)。 - 跳跃表用于按分值排序的快速范围查询。 - 字典用于快速查找特定成员的分值[^2]。 ```c // 示例:Redis 中 Sorted Set 的实现 typedef struct zset { dict *dict; // 用于快速查找成员 zskiplist *zsl; // 用于按分值排序的跳跃表 } zset; ``` ### 总结 Redis基本数据类型通过灵活选择不同的编码方式,在内存占用和性能之间实现了良好的权衡。理解这些底层实现有助于开发者更好地优化 Redis 的使用场景[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值