栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Redis的5种数据类型-2

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Redis的5种数据类型-2

list

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

 

业务场景-最新消息的展示
  • twitter、新浪微博、腾讯微博中个人用于的关注列表需要按照用户的关注顺序进行展示,粉丝列表需要将最近关注的粉丝列在前面

list类型数据操作注意事项

    list 中保存的数据都是string类型的,数据总容量式是有限的,最多232-1个元素(4294967295)
    list具有索引的概念,但是操作数据时候通常以队列的形式进行入队出队操作,或以栈的形式进入栈出栈的操作
    获取全部数据操作结束索引设置为-1
    list 可以对数据进行分页操作,通过第一页的信息来自list,第2页及更多的信息通过数据库的形式加载

List类型应用实践

Redis的list类型相当于java中的linkedList,其原理就就是一个双向链表。支持正向、反向查找和遍历等操作,插入删除速度比较快。经常用于实现热销榜,最新评论等的设计。

lpush(压栈:先进后出)

在key对应list的头部添加字符串元素

redis 127.0.0.1:6379> lpush mylist "world"
(integer) 1
redis 127.0.0.1:6379> lpush mylist "hello"
(integer) 2
redis 127.0.0.1:6379> lrange mylist 0 -1
1) "hello"
2) "world"
redis 127.0.0.1:6379>

 其中,Redis Lrange 返回列表中指定区间内的元素,区间以偏移量 START 和 END 指定。 其中 0 表示列表的第一个元素, 1 表示列表的第二个元素,以此类推。 你也可以使用负数下标,以 -1 表示列表的最后一个元素, -2 表示列表的倒数第二个元素,以此类推

rpush(先进先出)

在key对应list的尾部添加字符串元素

redis 127.0.0.1:6379> rpush mylist2 "hello"
(integer) 1
redis 127.0.0.1:6379> rpush mylist2 "world"
(integer) 2
redis 127.0.0.1:6379> lrange mylist2 0 -1
1) "hello"
2) "world"
redis 127.0.0.1:6379>

 del(删除集合)

redis 127.0.0.1:6379> del mylist

 

linsert

在key对应list的特定位置之前或之后添加字符串元素

redis 127.0.0.1:6379> rpush mylist3 "hello"
(integer) 1
redis 127.0.0.1:6379> rpush mylist3 "world"
(integer) 2
redis 127.0.0.1:6379> linsert mylist3 before "world" "there"
(integer) 3
redis 127.0.0.1:6379> lrange mylist3 0 -1
1) "hello"
2) "there"
3) "world"
redis 127.0.0.1:6379>

 

lrem(-n代表删除n个)

从key对应list中删除count个和value相同的元素,count>0时,按从头到尾的顺序删除,count<0时,按从尾到头的顺序删除,count=0时,删除全部

 

ltrim

保留指定key 的值范围内的数据(只保留范围内的,其余全部删除,从左到右)

 

lpop

从list的头部删除元素,并返回删除元素

redis 127.0.0.1:6379> lrange mylist2 0 -1
1) "hello"
2) "world"
redis 127.0.0.1:6379> rpop mylist2
"world"
redis 127.0.0.1:6379> lrange mylist2 0 -1
1) "hello"
redis 127.0.0.1:6379>

 

llen

返回key对应list的长度:

redis 127.0.0.1:6379> lrange mylist5 0 -1
1) "three"
2) "foo"
redis 127.0.0.1:6379> lindex mylist5 0
"three"
redis 127.0.0.1:6379> lindex mylist5 1
"foo"
redis 127.0.0.1:6379>

 

rpoplpush

从第一个list的尾部移除元素并添加到第二个list的头部,最后返回被移除的元素值,整个操作是原子的.如果第一个list是空或者不存在返回nil:
rpoplpush lst1 lst1
rpoplpush lst1 lst2

小节面试分析

    如何基于redis实现一个队列结构?(lpush/rpop)
    如何基于redis实现一个栈结构?(lpush/lpop)
    如何基于redis实现一个阻塞式队列?(lpush/brpop)
    如何实现秒杀活动的公平性?(先进先出-FIFO)
    通过list结构实现一个消息队列(顺序)吗?(可以,FIFO->lpush,rpop)
    用户注册时的邮件发送功能如何提高其效率?(邮件发送是要调用三方服务,底层通过队列优化其效率,队列一般是list结构)
    如何动态更新商品的销量列表?(卖的好的排名靠前一些,linsert)
    商家的粉丝列表使用什么结构实现呢?(list结构)

list使用场景 业务描述

在设计一个秒杀或抢购系统时,为了提高系统的响应速度,通常会将用户的秒杀或抢购请求先存储到一个redis队列,这里我们就基于redis实现一个先进先出队列,例如:

 代码实现
package com.jt.redis;

import redis.clients.jedis.Jedis;

import java.util.List;


public class SecondsKillDemo01 {
     
     public static void enque(String request){
         Jedis jedis=new Jedis("192.168.126.129", 6379);
         jedis.lpush("queue-1",request);
         jedis.close();
     }
    
     public static String deque(){
         Jedis jedis=new Jedis("192.168.126.129", 6379);
         //非阻塞式取数据
         //return jedis.rpop("queue-1");
         //阻塞式取数据
         List list = jedis.brpop(60, "queue-1");
         jedis.close();
         return list!=null?list.get(1):null;//0为key
     }

    public static void main(String[] args) {
        //1.构建生产对象(购买商品的用户)
        Thread t1=new Thread(){
            @Override
            public void run() {
                int i=1;
                for(;;){
                    enque("request-"+i++);
                    try { Thread.sleep(1000);
                    }catch (Exception e){}
                }
            }
        };
        //2.构建消费者对象(处理请求的对象)
        Thread t2=new Thread(){
            @Override
            public void run() {
                for(;;){
                    String request=deque();
                    if(request==null)continue;
                    System.out.println("process "+request);
                }
            }
        };
        //3.开启抢购活动
        t1.start();
        t2.start();
    }
}

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/315678.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号