首页 > 数据库 >Redis 数据类型list、hash、zset 原理、使用场景说明

Redis 数据类型list、hash、zset 原理、使用场景说明

时间:2022-11-25 16:24:51浏览次数:48  
标签:存储 hash zset list1 数据类型 元素 list jedis Redis

面试中常会被问到Redis 的数据类型用过哪些,被问的多了就想整理一下,以被下次再被问时可以很好的回复,现在对redis中list、hash、zset进行梳理。

一、list

Redis list的实现为一个双向链表 ; List 列表是简单的字符串列表,按照插入顺序排序,可以从头部或尾部向 List 列表添加元素。

1.1说明:
1、 Redis的列表允许用户从序列的两端推入或者弹出元素
2、可以做消息队列,以完成多程序之间的消息交换。可以用push操作将任务存在list中(生产者), 然后线程在用pop操作将任务取出进行执行。(消费者)

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

ps: lpop、rpop 会将list元素取出并移出,和队列特性一样;
  lrange、rrange 取出元素但不移除

1.3 可实现常用数据结构
  Stack(栈) = LPUSH + LPOP
  Queue(队列)= LPUSH + RPOP
  Blocking MQ(阻塞队列)= LPUSH + BRPOP
1.4常用命令:
  lpush,rpush,lpop,rpop,lrange,BLPOP(阻塞版)等。

1.5代码实例

 /**
     * redis 数据类型list测试
     * Redis list的实现为一个双向链表
     * List 列表是简单的字符串列表,按照插入顺序排序,可以从头部或尾部向 List 列表添加元素。
     * 使用场景
     * list类型:保存多个数据,底层使用双向链表存储结构实现
     * <p>
     * ps: lpop、rpop 会将list元素取出并移出,和队列特性一样;
     * lrange、rrange 取出元素但不移除
     */
    @Test
    public void redisList() {
        //1.连接redis
        Jedis jedis = new Jedis("127.0.0.1", 6379);

        //2.操作redis
        jedis.lpush("list1", "a", "b", "c");
        jedis.rpush("list1", "x");
        // 取出所有数据  不会将元素移除
        List<String> list1 = jedis.lrange("list1", 0, -1);
        System.out.println("list1 = " + list1);
        // 可以从两边取数据插入,也可以从左右两边取数据--Redis的列表允许用户从序列的两端推入或者弹出元素
        System.out.println("jedis.lpop(\"list1\") = " + jedis.lpop("list1"));
        System.out.println("jedis.rpop(\"list1\") = " + jedis.rpop("list1"));
        List<String> list2 = jedis.lrange("list1", 0, -1);
        list2.forEach(x -> {
            System.out.println("jedis.lpop(\"list2\") = " + jedis.lpop("list1"));
        });
        //(2)消息队列,以完成多程序之间的消息交换。可以用push操作将任务存在list中(生产者),然后线程在用pop操作将任务取出进行执行。(消费者)
        // blpop 阻塞弹出
//      jedis.blpop("list1");

        jedis.close();

    }

二、 hash 类型 

 
2.1 说明:hash 存储可以存储一个对象-多个属性,取时直接取出成 转换成一个Map,
省去了像存放json字符串序列化和反序列化也便于修改
新的存储需求:对一系列存储的数据进行编组,方便管理,典型应用存储对象信息
需要的存储结构:一个存储空间保存多个键值对数据
ps: hash类型:底层使用哈希表结构实现数据存储
hash类型下的value只能存储字符串
2.2常用命令
hset、hget、hgetall、hkeys、hvals、hsetnx
hmget key field1,feild2 :可以获取多个filed

2.3 代码实例

/**
     * redis 数据类型hash测试
     * 说明:hash 存储可以存储一个对象-多个属性,取时直接取出成 转换成一个Map,
     *  省去了像存放json字符串序列化和反序列化也便于修改
     *  新的存储需求:对一系列存储的数据进行编组,方便管理,典型应用存储对象信息    
     * 常用命令
     * hset、hget、hgetall、hkeys、hvals、hsetnx
     * hmget key field1,feild2 :可以获取多个filed
     */
    @Test
    public void redisHash() {

        Jedis jedis = new Jedis("127.0.0.1", 6379);
        jedis.set("liyanbo", "777");
        System.out.println("jedis.get(\"liyanbo\") = " + jedis.get("liyanbo"));

        //1、 hash 存储可以存储一个对象-多个属性,取时直接取出成 转换成一个Map,省去了像存放json字符串序列化和反序列化也便于修改
        jedis.hset("hashKey", "keyO1", "key1");
        jedis.hset("hashKey", "keyO2", "key2");
        jedis.hset("hashKey", "keyO3", "key3");
        Map<String, String> map02 = jedis.hgetAll("hashKey");
        System.out.println("map02 = " + map02);// 可以直接使用 map 取对应的值

        //1.3
        jedis.close();
    }

3、zSet 数据类型

3.1 说明:Redis zset和set一样也是string类型元素的集合,且不允许重复的成员。不同之处在于,
  每个元素都与双类型的分数相关联
  Redis 有序集合和集合一样也是 string 类型元素的集合,且不允许重复的成员。
  不同的是每个元素都会关联一个 double 类型的分数。redis 正是通过分数来为集合中的成员进行从小到大的排序。
  有序集合的成员是唯一的,但分数(score)却可以重复
3.2 场景:

  1、实现积分排行榜功能,就采用了redis zset有序集合来实现

  2、学生ID,学生分数,存放后可排序
  Redis zset和set一样也是string类型元素的集合,且不允许重复的成员。不同之处在于,每个元素都与双类型的分数相关联

3.3常用命令:

  zadd:新增成员, zadd:新增成员
  zrangebylex:指定集合区间,获取列表
  zrangebyscore:指定分数区间,获取列表
  zrevrange:倒序展示列表

3.4 代码实例

/**
     * redis 数据类型ZSet测试
     * 说明:Redis zset和set一样也是string类型元素的集合,且不允许重复的成员。不同之处在于,
     *  每个元素都与双类型的分数相关联
     *  Redis 有序集合和集合一样也是 string 类型元素的集合,且不允许重复的成员。
     *  不同的是每个元素都会关联一个 double 类型的分数。redis 正是通过分数来为集合中的成员进行从小到大的排序。
     *  有序集合的成员是唯一的,但分数(score)却可以重复
     * 场景:
     * 1、实现积分排行榜功能,就采用了redis zset有序集合来实现
     * 2、学生ID,学生分数,存放后可排序
     *  Redis zset和set一样也是string类型元素的集合,且不允许重复的成员。不同之处在于,每个元素都与双类型的分数相关联
     */
    @Test
    public void redisZSet() {

        //1.连接redis
        Jedis jedis = new Jedis("127.0.0.1", 6379);
        jedis.zadd("zSetKey", 10, "liyanbo");
        jedis.zadd("zSetKey", 9, "yanda");
        jedis.zadd("zSetKey", 15, "zhiyuan");
        jedis.zadd("zSetKey", 12, "chengqiang");
        // 从高到底排序输出指定范围的数据
        Set<String> setSort = jedis.zrevrange("zSetKey", 0, 4);
        System.out.println("setSort = " + setSort);

        // 取出最高分数信息
//        System.out.println("jedis.zpopmax(\"zSetKey\") = " + jedis.zpopmin("zSetKey"));

        jedis.close();
    }

看到的小伙伴如有疑问或问题可以评论回复一起讨论沟通。

 

标签:存储,hash,zset,list1,数据类型,元素,list,jedis,Redis
From: https://www.cnblogs.com/liyanbofly/p/16925509.html

相关文章

  • HashMap问题
    packagecom.google;importjavax.lang.model.element.NestingKind;importjava.util.HashMap;publicclassIntegerDemo{publicstaticvoidmain(String[]a......
  • HashMap的底层结构和扩容机制
    结构:jdk8之前是数组+链表(数据多之后存在大量hash冲突,链表会变得很长,查询速度太慢),jdk8之后数组+链表+红黑树。key和value是整合为一个Entry单位存储的。put过程:通过h......
  • 重写equals就需要重写hashCode
    重写equals不重写hashCodepublicclassStudent{privateLongid;privateStringcode;privateStringname;publicStudent(Longid,Stringcod......
  • 3、mysql数据类型的优化
    更小的通常更好应该尽量使用可以正确存储数据的最小数据类型,更小的数据类型通常更快,因为它们占用更少的磁盘、内存和CPU缓存,并且处理时需要的CPU周期更少,但是要确保没有低......
  • c/c++ 基本数据类型在16位、32位、64位操作系统下所占字节大小(存储空间)
     表格预览数据类型16位操作系统(byte)32位操作系统(byte)64位操作系统(byte)取值范围char111-128~127unsignedchar1110~255shortint/sh......
  • Python入门(3)——基本数据类型及运算符
    常见的几种基本数据类型python是弱类型语言,相对于强类型语言,它不需要声明变量的类型。在Python中一切都是对象。可以使用id()函数查看此对象的id。Python中的数据类型很多,而......
  • day01--数据类型
    强类型语言java是强类型语言,要求变量的使用要严格符合规定,所有变量都必须先定义后才能使用数据类型的两大类基本类型byte1字节short2字节int4字节lon......
  • 一文熟悉 Go 的基础语法和基本数据类型
    耐心和持久胜过激烈和狂热。前言快速上手一门新的语言,首先要做的就是熟悉新语言的基本语法和基本数据类型,本文将对Go语言的基础语法和基本数据类型进行介绍。Hello,World!记......
  • 一文了解 Go 的复合数据类型(数组、切片 Slice、Map)
    耐心和持久胜过激烈和狂热。前言上一篇文章​​一文熟悉Go的基础语法和基本数据类型​​,讲解了Go的基础语法和基本数据类型,本篇文章将对Go的复合数据类型(数组、切......
  • MySQL数据库——字符编码、配置文件、存储引擎、数据类型、约束条件
    MySQL数据库——字符编码、配置文件、存储引擎、数据类型、约束条件一、字符编码与配置文件1、查看MySQL相关信息\s查看相关信息 当前用户、版本、编码、端口号 MySQ......