数据类型详解

在讲解Redis中List的使用之前,大家需要知道List是怎么样的结构,方便在合适的场景中去使用。

这里有个名词可以概括它的性质”一键多值“,值在健在,值光健光
这个我在之前的博客也有讲过,各位看官老爷可以移步到这篇博客

结构类型:快速链表

操作命令

因为它的底层结构为双端链表,所以可以两边操作,而对应的两边操作除了使用命令不一样,它们操作基本相同

-添加

127.0.0.1:6379[2]> help lpush
  LPUSH key value [value ...]
  summary: Prepend one or multiple values to a list(对list头部进行追加)
  since: 1.0.0
  group: list

127.0.0.1:6379[2]> help rpush
  RPUSH key value [value ...]
  summary: Append one or multiple values to a list(对list后面进行添加)
  since: 1.0.0
  group: list

-查看

127.0.0.1:6379[2]> help lrange
  LRANGE key start stop
  summary: Get a range of elements from a list(获取list中的元素)
  since: 1.0.0
  group: list
  
注意:如果start设置为0 以及stop设置为-1即获取list中的全部元素
127.0.0.1:6379[2]> help llen
  LLEN key
  summary: Get the length of a list(获取list的长度)
  since: 1.0.0
  group: list

注意:如果llen后面不是list类型会报错

-获取

127.0.0.1:6379[2]> help lpop
  LPOP key
  summary: Remove and get the first element in a list(获取list中的第一个元素)
  since: 1.0.0
  group: list
  
127.0.0.1:6379[2]> help rpop
  RPOP key
  summary: Remove and get the last element in a list(获取list中的最后一个元素)
  since: 1.0.0
  group: list

-修改

127.0.0.1:6379[2]> help lset
  LSET key index value
  summary: Set the value of an element in a list by its index(通过索引修改元素的值)
  since: 1.0.0
  group: list
注意:当超过索引的时会报错

使用

下面是在java代码中具体使用过程
向表中注入RedisTemplate就可以使用了

	/**
     * redis中list结构对应Template的使用
     */
    @GetMapping("/test")
    public void testList() {
         // 向列表中头部添加元素(同理使用rightPush从尾部添加)
        redisTemplate.opsForList().leftPush("list", "l1");
        // 通过index获取列表中的元素
        System.out.println(redisTemplate.opsForList().index("list", 0));
        // l1
		
		// 把多个值存入列表头部(同理使用rightPushAll从尾部批量添加)
        redisTemplate.opsForList().leftPushAll("list", "l1", "l2", "l3");
	    // 						获取列表指定范围内元素		start起始位置,end结束位置
        System.out.println(redisTemplate.opsForList().range("list", 0, -1));  
        //如果为-1,那么就返回所有的元素:[l3, l2, l1, l1]    
        
        // list存在的时候再加入
        redisTemplate.opsForList().leftPushIfPresent("list", "l4");
        System.out.println(redisTemplate.opsForList().range("list", 0, -1));
        //[l4, l3, l2, l1, l1]  
                
        // 在存在这个元素值的前面添加一个值(同理使用rightPush从右边向这个元素的前面添加一个值)
        redisTemplate.opsForList().leftPush("list", "l2","l2");
        System.out.println(redisTemplate.opsForList().range("list", 0, -1))
        //[l4, l3, l2, l2, l1, l1]

	    // 移除并获取列表中第一个元素
        System.out.println(redisTemplate.opsForList().leftPop("list"));
        //移除集合中左边的元素在等待的时间里,如果超过等待的时间仍没有元素则退出。
        System.out.println(redisTemplate.opsForList().leftPop("list", l5, TimeUnit.SECONDS));
		
		//对列表进行裁剪
        redisTemplate.opsForList().trim("list", 1, 2);
        System.out.println(redisTemplate.opsForList().range("list", 0, -1));
        // [l3, l2, l2, l1]

        // 获取当前列表长度
        System.out.println(redisTemplate.opsForList().size("list"));
        // 4
	}

业务场景

简单消息队列(pop和rpush)

非实时排行榜(lrange命令可以分页查看队列中的数据,只有定时计算的排行版才适合使用list存储

最新列表(lpush命令和lrange命令能实现最新列表的功能,如朋友圈的点赞列表,评论列表)

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐