Redis的List类型就像我们日常生活中的待办事项清单。你可以随时在清单开头或末尾添加新事项,也能快速查看或移除已完成的项目。这种灵活的数据结构让List成为Redis中使用频率最高的类型之一。
Redis List类型简介与特点
List本质上是一个字符串元素的序列集合。每个List可以存储超过40亿个元素,这个数量级足以应对绝大多数业务场景。List中的元素按照插入顺序排列,新元素可以添加到列表头部或尾部。
List类型有几个鲜明的特性。它支持双向操作,你既可以从左边也可以从右边进行插入和弹出。元素可以重复出现,同一个值可能在List中出现多次。List的长度是动态的,随着元素增减自动调整。我记得在某个电商项目中,我们就是用Redis List来管理用户浏览记录,这种有序且可重复的特性正好符合业务需求。
List类型在Redis中的数据结构
Redis的List底层采用两种结构实现。当元素数量较少时,使用压缩列表(ziplist)来节省内存空间。一旦元素数量或大小超过阈值,就会自动转换为双向链表(linkedlist)。这种智能的切换机制在保证性能的同时兼顾了内存效率。
压缩列表将所有元素紧凑地存储在一起,减少了内存碎片。而双向链表虽然占用更多内存,但在插入删除操作上表现出色。Redis根据你的实际使用情况在两者间自动选择,这种设计确实很贴心。

List类型常用命令概述
List的操作命令直观易懂。LPUSH和RPUSH分别用于在列表左右端添加元素,LPOP和RPOP则从对应端移除元素。LRANGE可以获取指定范围内的元素,这个命令在我们实现分页功能时特别有用。
其他常用命令包括LINDEX获取指定位置元素,LLEN获取列表长度,LREM移除特定值元素。BLPOP和BRPOP是阻塞版本的弹出命令,它们在列表为空时会等待新元素的到来,这个特性在消息队列场景中非常实用。
我注意到很多初学者容易混淆LTRIM和LREM命令。LTRIM用于修剪列表,只保留指定区间内的元素,而LREM则是移除与给定值匹配的元素。理解这个区别能避免很多不必要的错误。 Jedis jedis = new Jedis("localhost", 6379); jedis.auth("your_password"); // 如果需要认证 jedis.connect();

// 生产者添加消息 jedis.lpush("order_queue", "新订单数据");
// 消费者获取消息 String order = jedis.rpop("order_queue");
// 添加新元素并保持列表长度 jedis.lpush("news_feed", newArticle); jedis.ltrim("news_feed", 0, 999); // 只保留最新的1000条
// 用户添加商品到购物车 String cartKey = "cart:user:" + userId; String productInfo = "{\"productId\":\"123\",\"quantity\":2,\"price\":19900}"; jedis.lpush(cartKey, productInfo);
// 获取购物车所有商品
List