内存式NoSQL数据库Redis(一)

内存式NoSQL数据库Redis(一)

知识点02:NoSQL与RDBMS

  • 目标了解NoSQL的应用场景与RDBMS的区别

  • 路径

    • step1:RDBMS的特点
    • step2:业务架构中的问题
    • step3:NoSQL的特点
  • 实施

    • RDBMS的特点:关系型数据库管理系统

      • 工具:MySQL、Oracle、SQL Server……
      • 应用:业务性数据存储系统:事务和稳定性
      • 特点:体现数据之间的关系,支持事务,保证业务完整性和稳定性,小数据量的性能也比较好
      • 开发:SQL
    • 业务架构中的问题

      • 问题:以网站后台存储为例,当并发量很大,所有高并发全部直接请求MySQL,容易导致MySQL奔溃

        [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gVeUymWT-1624621684837)(Day24_内存式NoSQL数据库Redis(一).assets/image-20210519220356711.png)]

      • 需求:能实现高并发的数据库,接受高并发请求

    • NoSQL的特点:Not Only SQL:非关系型数据库

      • 工具:Redis、HBASE、MongoDB……

      • 应用:一般用于高并发高性能场景下的数据缓存或者数据库存储

      • 特点:读写速度特别快,并发量非常高,相对而言不如RDBMS稳定,对事务性的支持不太友好

      • 开发:每种NoSQL都有自己的命令语法

      • 解决上面RDBMS的问题:实现读写分离

        • 读请求:读请求不读取MySQL,读取Redis
        • 写请求:写请求直接写入MySQL

        [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LmjGVTk0-1624621684838)(Day24_内存式NoSQL数据库Redis(一).assets/image-20210519220547502.png)]

  • 小结

    • RDBMS和NoSQL的应用特点分别是什么?
    • RDBMS:业务性数据存储
      • 支持事务、更加稳定和安全、小数据量和低并发的场景下性能比较高
      • NoSQL:高并发和高性能的数据存储
        • 读写速度比较快,支持高并发读写,事务支持不完美,稳定性和安全性相对较差

知识点03:Redis的功能与应用场景

  • 目标掌握Redis的功能与应用场景

  • 路径

    • step1:介绍
    • step2:功能特点
    • step3:应用场景
  • 实施

    • 介绍

      • 相关网站

      • 官方介绍

        Redis 是一个开源(BSD许可)的,内存中的数据结构存储系统,它可以用作数据库、缓存和消息中间件。 它支持多种类型的数据结构,如 字符串(strings), 散列(hashes), 列表(lists), 集合(sets), 有序集合(sorted sets) 与范围查询, bitmaps, hyperloglogs 和 地理空间(geospatial) 索引半径查询。 Redis 内置了 复制(replication),LUA脚本(Lua scripting), LRU驱动事件(LRU eviction),事务(transactions) 和不同级别的 磁盘持久化(persistence), 并通过 Redis哨兵(Sentinel)和自动 分区(Cluster)提供高可用性(high availability)。
        
      • 定义:基于内存的分布式的NoSQL数据库

        • 所有数据存储在内存中,并且有持久化机制
        • 每次redis重启,会从文件中重新加载数据到内存,所有读写都只基于内存
    • 功能特点

      • 功能:提供高性能高并发的数据存储
      • 特点
        • 基于C语言开发的系统,与硬件的交互性能更好
        • 基于内存实现数据读写,读写性能更快
        • 分布式的、扩展性和稳定性更好
        • 支持事务、拥有各种丰富的数据结构
          • String:类似于Java中的字符串
          • Hash:类似于Java中Map集合
          • List:有序可重复的元素集合
          • Set:无序且不可重复的元素集合,一般用于去重
          • Zset:Sorted Set,有序且不可重复
    • 应用场景

      • 缓存:用于实现大数据量高并发的大数据量缓存【临时性存储】
      • 数据库:用于实现高性能的小数据量读写【永久性存储】
      • 消息中间件:消息队列【MQ】:用于实现消息传递,一般不用
  • 小结

    • Redis的功能与应用场景是什么?
      • 功能:实现高性能高并发的数据读写
      • 特点
        • 基于C语言
        • 数据读写只读写内存
        • 分布式架构
        • 支持多种数据类型
      • 应用
        • 缓存:适合于高并发大数据量的数据缓存
        • 数据库:适合于高性能小数据量的持久性存储
        • 消息队列:一般不用

知识点04:Redis的Windows版单机部署

  • 目标:实现Redis的Windows版单机部署

  • 路径

    • step1:Redis的版本
    • step2:Window版部署
    • step3:测试
  • 实施

    • Redis的版本

      • 3.x:支持了分片集群功能
      • 5.x:分片集群的功能稳定了
    • Window版部署

      • step1:找到Windows版本的安装包

        [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vKePcskK-1624621684840)(Day24_内存式NoSQL数据库Redis(一).assets/image-20210519222131139.png)]

      • step2:将安装包直接解压,解压到一个没有中文的路径,路径不要太深

        [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MicnrFfW-1624621684840)(Day24_内存式NoSQL数据库Redis(一).assets/image-20210519222153470.png)]

        [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7LLbeWeJ-1624621684841)(Day24_内存式NoSQL数据库Redis(一).assets/image-20210519222215966.png)]

      • 命令目录结构

        目录或文件作用
        redis-benchmark.exeredis的性能测试工具
        redis-check-aof.exeaof文件的检查和修复工具
        redis-check-dump.exerdb文件的检查和修复工具
        redis-cli.execlient 客户端访问命令
        redis-server.exe服务器启动程序
        redis.window.conf配置文件,这是个文本文件
    • 启动测试

      • step1:启动Redis服务端

        [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8HtU5C95-1624621684842)(Day24_内存式NoSQL数据库Redis(一).assets/image-20210519222228782.png)]

        [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-K975E52a-1624621684842)(Day24_内存式NoSQL数据库Redis(一).assets/image-20210519222234731.png)]

      • step2:启动Redis客户端

        [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-F1SzrxsA-1624621684842)(Day24_内存式NoSQL数据库Redis(一).assets/image-20210519222242697.png)]

        [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CNTU4oBT-1624621684843)(Day24_内存式NoSQL数据库Redis(一).assets/image-20210519222720294.png)]

      • step3:执行测试命令

        [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DoD3hKyA-1624621684843)(Day24_内存式NoSQL数据库Redis(一).assets/image-20210621104318425.png)]

  • 小结

    • 实现Redis的Windows版单机部署

知识点05:Redis的桌面工具

  • 目标:了解Reids桌面工具的使用

  • 实施

    • 解压安装

      [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kAwxX1OZ-1624621684844)(Day24_内存式NoSQL数据库Redis(一).assets/image-20210519223118049.png)]

    • 启动连接

      image-20210519223132730 image-20210519223146981

      [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RTkFpGdD-1624621684844)(Day24_内存式NoSQL数据库Redis(一).assets/image-20210519223231864.png)]

  • 小结

    • 了解Reids桌面工具的使用

知识点06:Redis的Linux版单机部署

  • 目标:实现Redis的Linux版单机部署

  • 实施

    • 上传源码

      cd /export/software/
      rz
      

      [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hIGvqaI5-1624621684844)(Day24_内存式NoSQL数据库Redis(一).assets/image-20210521102236816.png)]

    • 解压

      tar -zxvf redis-3.2.8.tar.gz -C /export/server/
      

      [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hLch5KWs-1624621684844)(Day24_内存式NoSQL数据库Redis(一).assets/image-20210521102259929.png)]

    • 安装依赖

      yum -y install gcc-c++ tcl
      

      [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-A6IWQBp0-1624621684845)(Day24_内存式NoSQL数据库Redis(一).assets/image-20210521102417864.png)]

      [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HQUGTlwS-1624621684846)(Day24_内存式NoSQL数据库Redis(一).assets/image-20210521102518266.png)]

    • 编译安装

      #进入源码目录
      cd /export/server/redis-3.2.8/
      #编译
      make
      #安装,并指定安装目录
      make PREFIX=/export/server/redis-3.2.8-bin install
      

      [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CWsB545h-1624621684846)(Day24_内存式NoSQL数据库Redis(一).assets/image-20210521102629002.png)]

    • 修改配置

      • 复制配置文件

        cp /export/server/redis-3.2.8/redis.conf /export/server/redis-3.2.8-bin/
        
      • 创建目录

        #redis日志目录
        mkdir -p /export/server/redis-3.2.8-bin/logs
        #redis数据目录
        mkdir -p /export/server/redis-3.2.8-bin/datas
        
      • 修改配置

        cd  /export/server/redis-3.2.8-bin/
        vim redis.conf
        
        ## 61行,配置redis服务器接受链接的网卡
        bind node1
        ## 128行,redis是否后台运行,设置为yes
        daemonize yes
        ## 163行,设置redis服务日志存储路径
        logfile "/export/server/redis-3.2.8-bin/logs/redis.log"
        ## 247行,设置redis持久化数据存储目录
        dir /export/server/redis-3.2.8-bin/datas/
        
      • 创建软连接

        cd /export/server
        ln -s redis-3.2.8-bin redis
        
      • 配置环境变量

        vim /etc/profile
        
        # REDIS HOME
        export REDIS_HOME=/export/server/redis
        export PATH=:$PATH:$REDIS_HOME/bin
        
        source /etc/profile
        
    • 启动

      • 启动服务端

        • 启动命令

          /export/server/redis/bin/redis-server /export/server/redis/redis.conf
          
        • 启动脚本

          vim /export/server/redis/bin/redis-start.sh
          
          #!/bin/bash 
          
          REDIS_HOME=/export/server/redis
          ${REDIS_HOME}/bin/redis-server ${REDIS_HOME}/redis.conf
          
          chmod u+x /export/server/redis/bin/redis-start.sh 
          
      • 启动客户端

        /export/server/redis/bin/redis-cli -h node1 -p 6379
        
      • 关闭客户端

        • exit:退出客户端
      • 关闭服务端

        • 方式一:客户端中

          shutdown
          
        • 方式二:Linux命令行

          kill -9 redis的pid
          
        • 方式三:通过客户端命令进行关闭

          bin/redis-cli -h node1 -p 6379  shutdown
          
    • 测试

      node1:6379> keys *
      (empty list or set)
      node1:6379> set s1 hadoop
      OK
      node1:6379> keys *
      1) "s1"
      node1:6379> get s1
      "hadoop"
      node1:6379> 
      
  • 小结

    • 实现Redis的Linux版单机部署

知识点07:Redis的数据结构及数据类型

  • 目标:掌握Redis的数据结构及数据类型

  • 路径

    • step1:数据结构
    • step2:数据类型
  • 实施

    • 数据结构

      • 整个Reids中所有数据以KV结构形式存在

      • K:作为唯一标识符,唯一标识一条数据,固定为String类型

      • V:真正存储的数据,可以有多种类型

        • String、Hash、List、Set、Zset、BitMap、HypeLogLog
      • 理解Redis:类似于Java中的一个Map集合,可以存储多个KV,根据K获取V

  • 数据类型

    • 每一种类型的应用场景和命令都是不一样的
    Key:StringValue类型Value值应用场景
    pv_20200101String10000一般用于存储单个数据指标的结果
    person001Hashname:laoer age : 20 sex female用于存储整个对象所有属性值
    uvList{100,200,300,100,600}有序允许重复的集合,每天获取最后一个值
    uv_20200101Set{userid1,userid2,userid3,userid4……}无序且不重复的集合,直接通过长度得到UV
    top10_productZSet【score,element】{10000-牙膏,9999-玩具,9998-电视……}有序不可重复的集合,统计TopN
    user_filterBitMap{0101010101010000000011010}将一个字符串构建位,通过0和1来标记每一位
    product_20200101HypeLogLog{productid1,id2……}类似于Set集合,底层实现原理不一样,数据量大的情况下,性能会更好,结果可能存在一定的误差
    • String类型

      • KV:【String,String】,类似于Java中Map集合的一条KV
    • Hash类型

      • KV:【String,Map集合】:Map集合的嵌套,Map集合中的元素是无序的
    • List类型

      • KV:【String,List】:有序且可重复
    • Set类型

      • KV:【String,Set】:无序且不重复
    • Zset类型

      • KV:【String,TreeMap集合】:Value也类似于Map集合,有序的Map集合
      • 类似于List和Set集合特点的合并:有序且不可重复
  • 小结

    • Redis中的数据是什么结构以及有哪些类型?
      • 数据结构:KV结构
      • 类型
        • K:String
        • V
          • String:字符串
          • Hash:类似于Map集合
          • List:类似于List集合
          • Set:类似于Set集合
          • Zset:有序不重复的Set集合
          • BitMap:位图
          • HyperLogLogs:类似于Set,适合于数据量大的场景,有一定的结果误差

知识点08:Redis的通用命令

  • 目标掌握Redis常用的通用命令

  • 实施

    • keys:列举当前数据库中所有Key

      • 语法:keys 通配符

        node1:6379> keys *
        1) "s1"
        node1:6379> get s1
        "hadoop"
        node1:6379> set str2 spark
        OK
        node1:6379> keys *
        1) "str2"
        2) "s1"
        node1:6379> keys st*
        1) "str2"
        node1:6379> 
        
    • del key:删除某个KV

    • exists key :判断某个Key是否存在

    • type key:判断这个K对应的V的类型的

    • expire K 过期时间:设置某个K的过期时间,一旦到达过期时间,这个K会被自动删除

    • ttl K:查看某个K剩余的存活时间

      [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-aymZp6Sd-1624621684846)(Day24_内存式NoSQL数据库Redis(一).assets/image-20210621115251230.png)]

    • select N:切换数据库的

      • Redis默认由16个数据:db0 ~ db15,个数可以通过配置文件修改,名称不能改
      • Redis是一层数据存储结构:所有KV直接存储在数据库中
      • 默认进入db0
    • move key N:将某个Key移动到某个数据库中

    • flushdb:清空当前数据库的所有Key

    • flushall:清空所有数据库的所有Key

  • 小结

    • 掌握Redis常用的通用命令

知识点09:String类型的常用命令

  • 目标掌握String类型的常用命令

  • 实施

    • set:给String类型的Value的进行赋值或者更新
      • 语法:set K V
    • get:读取String类型的Value的值
      • 语法:get K
    • mset:用于批量写多个String类型的KV
      • 语法:mset K1 V1 K2 V2 ……
    • mget:用于批量读取String类型的Value
      • 语法:mget K1 K2 K3 ……
    • setnx:只能用于新增数据,当K不存在时可以进行新增
      • 语法:setnx K V
      • 应用:构建抢占锁,搭配expire来使用
    • incr:用于对数值类型的字符串进行递增,递增1,一般用于做计数器
      • 语法:incr K
    • incrby:指定对数值类型的字符串增长固定的步长
      • 语法:incrby K N
    • decr:对数值类型的数据进行递减,递减1
      • 语法:decr K
    • decrby:按照指定步长进行递减
      • 语法:decrby K N
    • incrbyfloat:基于浮点数递增
      • 语法:incrbyfloat K N
    • strlen:统计字符串的长度
      • 语法:strlen K
    • getrange:用于截取字符串
      • 语法:getrange s2 start end
    node1:6379> set s1 hadoop
    OK
    node1:6379> keys *
    1) "s1"
    node1:6379> get s1
    "hadoop"
    node1:6379> set s1 hive
    OK
    node1:6379> get s1
    "hive"
    node1:6379> key *
    (error) ERR unknown command 'key'
    node1:6379> keys *
    1) "s1"
    node1:6379> mset s2 oozie s3 hue
    OK
    node1:6379> keys *
    1) "s2"
    2) "s3"
    3) "s1"
    node1:6379> mget s1 s3
    1) "hive"
    2) "hue"
    node1:6379> setnx s4 spark
    (integer) 1
    node1:6379> keys *
    1) "s4"
    2) "s2"
    3) "s3"
    4) "s1"
    node1:6379> get s4
    "spark"
    node1:6379> setnx s4 flink
    (integer) 0
    node1:6379> get s4
    "spark"
    node1:6379> set s5 1
    OK
    node1:6379> incr s5
    (integer) 2
    node1:6379> get s5
    "2"
    node1:6379> incrby s5 5
    (integer) 7
    node1:6379> get s5
    "7"
    node1:6379> decr s5
    (integer) 6
    node1:6379> decrby s5 2
    (integer) 4
    node1:6379> get s5
    "4"
    node1:6379> set s6 19.5
    OK
    node1:6379> get s6
    "19.5"
    node1:6379> incrbyfloat s6 2.4
    "21.9"
    node1:6379> strlen s1
    (integer) 4
    node1:6379> get s1
    "hive"
    node1:6379> get s4
    "spark"
    node1:6379> strlen s4
    (integer) 5
    node1:6379> getrange s4 0 1
    "sp"
    node1:6379> getrange s4 0 3
    "spar"
    
  • 小结

    • 掌握String类型的常用命令

知识点10:Hash类型的常用命令

  • 目标:掌握Hash类型的常用命令

  • 实施

    • hset:用于为某个K添加一个属性

      • 语法:hset K k v
    • hget:用于获取某个K的某个属性的值

      • 语法:hget K k
    • hmset:批量的为某个K赋予新的属性

    • 语法:hmset K k1 v1 k2 v2 ……

    • hmget:批量的获取某个K的多个属性的值

      • 语法:hmget K k1 k2 k3……
    • hgetall:获取所有属性的值

      • 语法:hgetall K
    • hdel:删除某个属性

      • 语法:hdel K k1 k2 ……
    • hlen:统计K对应的Value总的属性的个数

      • 语法:hlen K
    • hexists:判断这个K的V中是否包含这个属性

      • 语法:hexists K k
    • hvals:获取所有属性的value的

    • 语法:hvals K

    node1:6379> hset m1 name laoda
    (integer) 1
    node1:6379> hset m1 age 18
    (integer) 1
    node1:6379> hget m1 name
    "laoda"
    node1:6379> hget m1 age
    "18"
    node1:6379> hmset m2 name laoer age 20 sex male 
    OK
    node1:6379> keys *
    1) "s5"
    2) "s1"
    3) "s2"
    4) "s4"
    5) "m1"
    6) "s3"
    7) "m2"
    8) "s6"
    node1:6379> hmget m2 name sex
    1) "laoer"
    2) "male"
    node1:6379> hgetall m2
    1) "name"
    2) "laoer"
    3) "age"
    4) "20"
    5) "sex"
    6) "male"
    node1:6379> del m1
    (integer) 1
    node1:6379> keys *
    1) "s5"
    2) "s1"
    3) "s2"
    4) "s4"
    5) "s3"
    6) "m2"
    7) "s6"
    node1:6379> hdel m2 name
    (integer) 1
    node1:6379> hgetall m2
    1) "age"
    2) "20"
    3) "sex"
    4) "male"
    node1:6379> hlen m2
    (integer) 2
    node1:6379> hexists m2 name
    (integer) 0
    node1:6379> hexists m2 age
    (integer) 1
    node1:6379> hvals m2
    1) "20"
    2) "male"
    node1:6379> 
    
  • 小结

    • 掌握Hash类型的常用命令

知识点11:List类型的常用命令

  • 目标掌握List类型的常用命令

  • 实施

    • lpush:将每个元素放到集合的左边,左序放入

      • 语法:lpush K e1 e2 e3……
    • rpush:将每个元素放到集合的右边,右序放入

      • 语法:rpush K e1 e2 e3……
    • lrange:通过下标的范围来获取元素的数据

      • 语法:lrange K start end

      • 注意:从左往右的下标从0开始,从右往左的下标从-1开始,一定是从小的到大的下标

      • lrange K 0 -1:所有元素

    • llen:统计集合的长度

      • 语法:llen K
    • lpop:删除左边的一个元素

      • 语法:lpop K
    • rpop:删除右边的一个元素

      • 语法:rpop K
      node1:6379> lpush list1 1 2 3 3
      (integer) 4
      node1:6379> rpush list1 4 5 6 7 7
      (integer) 9
      node1:6379> lrange list1 0 8
      1) "3"
      2) "3"
      3) "2"
      4) "1"
      5) "4"
      6) "5"
      7) "6"
      8) "7"
      9) "7"
      node1:6379> lrange list1 0 100
      1) "3"
      2) "3"
      3) "2"
      4) "1"
      5) "4"
      6) "5"
      7) "6"
      8) "7"
      9) "7"
      node1:6379> llen list1
      (integer) 9
      node1:6379> lrange list1 0 -1
      1) "3"
      2) "3"
      3) "2"
      4) "1"
      5) "4"
      6) "5"
      7) "6"
      8) "7"
      9) "7"
      node1:6379> lrange list1 0 4
      1) "3"
      2) "3"
      3) "2"
      4) "1"
      5) "4"
      node1:6379> lrange list1 -9 -5
      1) "3"
      2) "3"
      3) "2"
      4) "1"
      5) "4"
      node1:6379> lrange list1 0 -1
      1) "3"
      2) "3"
      3) "2"
      4) "1"
      5) "4"
      6) "5"
      7) "6"
      8) "7"
      9) "7"
      node1:6379> lpop list1
      "3"
      node1:6379> lrange list1 0 -1
      1) "3"
      2) "2"
      3) "1"
      4) "4"
      5) "5"
      6) "6"
      7) "7"
      8) "7"
      node1:6379> rpop list1
      "7"
      node1:6379> lrange list1 0 -1
      1) "3"
      2) "2"
      3) "1"
      4) "4"
      5) "5"
      6) "6"
      7) "7"
      node1:6379> 
      
  • 小结

    • 掌握List类型的常用命令

知识点12:Set类型的常用命令

  • 目标掌握Set类型的常用命令

  • 实施

    • sadd:用于添加元素到Set集合中

      • 语法:sadd K e1 e2 e3 e4 e5……
    • smembers:用于查看Set集合的所有成员

      • 语法:smembers K
    • sismember:判断是否包含这个成员

      • 语法:sismember K e1
    • srem:删除其中某个元素

      • 语法:srem K e
    • scard:统计集合长度

      • 语法:scard K
    • sunion:取两个集合的并集

      • 语法:sunion K1 K2
    • sinter:取两个集合的交集

      • 语法:sinter K1 K2
  node1:6379> sadd set1 1 3 2 1 4 2 1 9 8 
  (integer) 6
  node1:6379> sadd set1 1 5
  (integer) 1
  node1:6379> smembers set1
  1) "1"
  2) "2"
  3) "3"
  4) "4"
  5) "5"
  6) "8"
  7) "9"
  node1:6379> sismember set1 1
  (integer) 1
  node1:6379> sismember set1 6
  (integer) 0
  node1:6379> srem set1 1 5
  (integer) 2
  node1:6379> smembers set1
  1) "2"
  2) "3"
  3) "4"
  4) "8"
  5) "9"
  node1:6379> scard set1 
  (integer) 5
  node1:6379> 
  node1:6379> smembers set1
  1) "2"
  2) "3"
  3) "4"
  4) "8"
  5) "9"
  node1:6379> sadd set2 3 1 2 9 9 3
  (integer) 4
  node1:6379> smembers set2
  1) "1"
  2) "2"
  3) "3"
  4) "9"
  node1:6379> sinter set1 set2
  1) "2"
  2) "3"
  3) "9"
  node1:6379> sunion set1 set2
  1) "1"
  2) "2"
  3) "3"
  4) "4"
  5) "8"
  6) "9"
  • 小结

    • 掌握Set类型的常用命令

知识点13:Zset类型的常用命令

  • 目标掌握Zset类型的常用命令

  • 实施

    • zadd:用于添加元素到Zset集合中

      • 语法:zadd K score1 k1 score2 k2 ……
    • zrange:范围查询

      • 语法:zrange K start end [withscores]
    • zrevrange:倒序查询

      • 语法:zrevrange K start end [withscores]
    • zrem:移除一个元素

      • 语法:zrem K k1
    • zcard:统计集合长度

      • 语法:zcard K
    • zscore:获取评分

      • 语法:zscore K k
    node1:6379> zadd zset1 20.9 yuwen 17.5 yinyu 99.7 shuxue 60.0 dili
    (integer) 4
    node1:6379> zrange zset1 0 -1
    1) "yinyu"
    2) "yuwen"
    3) "dili"
    4) "shuxue"
    node1:6379> zrevrange zset1 0 -1
    1) "shuxue"
    2) "dili"
    3) "yuwen"
    4) "yinyu"
    node1:6379> zrange zset1 0 -1 withscores
    1) "yinyu"
    2) "17.5"
    3) "yuwen"
    4) "20.899999999999999"
    5) "dili"
    6) "60"
    7) "shuxue"
    8) "99.700000000000003"
    node1:6379> zrem zset1 dili
    (integer) 1
    node1:6379> zrange zset1 0 -1 withscores
    1) "yinyu"
    2) "17.5"
    3) "yuwen"
    4) "20.899999999999999"
    5) "shuxue"
    6) "99.700000000000003"
    node1:6379> zcard zset1
    (integer) 3
    node1:6379> zscore zset1 shuxue
    "99.700000000000003"
    
  • 小结

    • 掌握Zset类型的常用命令

知识点14:BitMap类型的常用命令

  • 目标掌握BitMap类型的常用命令

  • 实施

    • 功能:通过一个String对象的存储空间,来构建位图,用每一位0和1来表示状态

      [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-b5P6V71i-1624621684846)(Day24_内存式NoSQL数据库Redis(一).assets/image-20210520075811401.png)]

      • Redis中一个String最大支持512M = 2^32次方,1字节 = 8位

      • 使用时,可以指定每一位对应的值,要么为0,要么为1,默认全部为0

      • 用下标来标记每一位,第一个位的下标为0

      [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-E6W5JMcc-1624621684847)(Day24_内存式NoSQL数据库Redis(一).assets/image-20210520075824978.png)]

    • 举例:统计UV

      • 一个位图中包含很多位,可以用每一个位表示一个用户id

      • 读取数据,发现一个用户id,就将这个用户id对应的那一位改为1

      • 统计整个位图中所有1的个数,就得到了UV

    • setbit:修改某一位的值

      • 语法:setbit bit1 位置 0/1

        setbit bit1 0 1
        
    • getbit:查看某一位的值

      • 语法:getbit K 位置

        getbit bit1 9
        
    • bitcount:用于统计位图中所有1的个数

      • 语法:bitcount K [start end]

        bitcount bit1
        #start和end表示的是字节
        bitcount bit1 0 10
        
    • bitop:用于位图的运算:and/or/not/xor

      • 语法:bitop and/or/xor/not bitrs bit1 bit2

        bitop and bit3 bit1 bit2
        bitop or bit4 bit1 bit2
        

        [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fkGr6VTY-1624621684848)(Day24_内存式NoSQL数据库Redis(一).assets/image-20210520080018074.png)]

    node1:6379> setbit bit1 0 1
    (integer) 0
    node1:6379> getbit bit1 0
    (integer) 1
    node1:6379> getbit bit1 1
    (integer) 0
    node1:6379> getbit bit1 2
    (integer) 0
    node1:6379> setbit bit1 5 1
    (integer) 0
    node1:6379> getbit bit1 5
    (integer) 1
    node1:6379> setbit bit1 13 1
    (integer) 0
    node1:6379> getbit bit1 13
    (integer) 1
    node1:6379> bitcount bit1 
    (integer) 3
    node1:6379> bitcount bit1 0 1
    (integer) 3
    node1:6379> bitcount bit1 0 0
    (integer) 2
    node1:6379> setbit bit2 0 1
    (integer) 0
    node1:6379> setbit bit2 1 1
    (integer) 0
    node1:6379> bitop and bit3 bit1 bit2
    (integer) 2
    node1:6379> bitcount bit3
    (integer) 1
    node1:6379> bitop or bit4 bit1 bit2
    (integer) 2
    node1:6379> bitcount bit4
    (integer) 4
    node1:6379> 
    
  • 小结

    • 掌握BitMap类型的常用命令

知识点15:HyperLogLog类型的常用命令

  • 目标掌握HyperLogLog类型的常用命令

  • 实施

    • 功能类似于Set集合,用于实现数据的去重

      • 区别:底层实现原理不一样

      • 应用:适合于数据量比较庞大的情况下的使用,存在一定的误差率

    • pfadd:用于添加元素

      • 语法:pfadd K e1 e2 e3……

        pfadd pf1 userid1 userid1 userid2 userid3 userid4 userid3 userid4
        
    • pfcount:用于统计个数

      • 语法:pfcount K

        pfcount pf1
        
    • pfmerge:用于实现集合合并

      • 语法:pfmerge pfrs pf1 pf2……

        pfmerge pf3 pf1 pf2
        
      node1:6379> pfadd pf1 userid1 userid1 userid2 userid3 userid4 userid3 userid4
      (integer) 1
      node1:6379> pfcount pf1
      (integer) 4
      node1:6379> pfadd pf2 userid1 userid1 userid3 userid4 userid3 userid4 userid5
      (integer) 1
      node1:6379> pfmerge pf3 pf1 pf2
      OK
      node1:6379> pfcount pf3
      (integer) 5
      node1:6379> 
      
  • 小结

    • 掌握HyperLogLog类型的常用命令

知识点16:Jedis:使用方式与Jedis依赖

  • 目标掌握Redis的使用方式及构建Jedis工程依赖

  • 路径

    • step1:Redis的使用方式
    • step2:Jedis依赖
  • 实施

    • Redis的使用方式

      • 命令操作Redis,一般用于测试开发阶段
  • 分布式计算或者Java程序读写Redis,一般用于实际生产开发

    • Jedis依赖

      • 构建模块

        [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KUg3Cmxz-1624621684848)(Day24_内存式NoSQL数据库Redis(一).assets/image-20210521144852519.png)]

      • 参考附录一添加依赖

  • 小结

    • 掌握Redis的使用方式及构建Jedis工程依赖

知识点17:Jedis:构建连接

  • 目标实现Jedis的客户端连接

  • 实施

        //todo:1-构建连接对象
        Jedis jedis = null;
    
        @Before
        public void getConnection(){
            //方式一:直接构建Jedis对象
    //        jedis = new Jedis("node1",6379);
            //方式二:通过连接池构建Jedis
            //构建连接池配置对象
            JedisPoolConfig config = new JedisPoolConfig();
            config.setMaxTotal(10);//总连接构建
            config.setMaxIdle(5);//最大空闲连接
            config.setMinIdle(2);//最小空闲连接
            //构建连接池对象
            JedisPool jedisPool = new JedisPool(config,"node1",6379);
            //获取连接
            jedis = jedisPool.getResource();
        }
    
        //todo:2-调用连接对象的方法实现操作
    
    
        //todo:3-释放连接
        @After
        public void closeConnection(){
            jedis.close();
        }
    
  • 小结

    • 实现Jedis的客户端连接

知识点18:Jedis:String操作

  • 目标Jedis中实现String的操作

  • 实施

    set/get/incr/exists/expire/setexp/ttl
    
        @Test
        public void testString(){
            //set/get/incr/exists/expire/setexp/ttl
    //        jedis.set("s1","hadoop");
    //        System.out.println(jedis.exists("s1"));
    //        System.out.println(jedis.exists("s2"));
    //        System.out.println(jedis.get("s1"));
    //        jedis.set("s2","3");
    //        jedis.incr("s2");
    //        System.out.println(jedis.get("s2"));
    //        jedis.expire("s2",10);
    //        while(true){
    //            System.out.println(jedis.ttl("s2"));
    //        }
            //setex:构建KV时,直接设置生命周期
            jedis.setex("s3",10,"oozie");
    
        }
    
  • 小结

    • Jedis中实现String的操作

知识点19:Jedis:Hash操作

  • 目标Jedis中实现Hash的操作

  • 实施

    hset/hmset/hget/hgetall/hdel/hlen/hexists
    
        public void testHash(){
            //hset/hmset/hget/hgetall/hdel/hlen/hexists
            jedis.hset("m1","name","zhangsan");
            System.out.println(jedis.hget("m1","name"));
            Map<String,String> maps = new HashMap<>();
            maps.put("age","18");
            maps.put("phone","110");
            jedis.hmset("m1",maps);
            List<String> hmget = jedis.hmget("m1", "name", "age");
            System.out.println(hmget);
            System.out.println("===================================");
            Map<String, String> m1 = jedis.hgetAll("m1");
            for(Map.Entry map : m1.entrySet()){
                System.out.println(map.getKey()+"\t"+map.getValue());
            }
            System.out.println("===================================");
            System.out.println(jedis.hlen("m1"));
            jedis.hdel("m1","name");
            System.out.println(jedis.hlen("m1"));
            System.out.println(jedis.hexists("m1","name"));
            System.out.println(jedis.hexists("m1","age"));
        }
    
  • 小结

    • Jedis中实现Hash的操作

知识点20:Jedis:List操作

  • 目标Jedis中实现List的操作

  • 实施

    lpush/rpush/lrange/llen/lpop/rpop
    
        @Test
        public void testList(){
            //lpush/rpush/lrange/llen/lpop/rpop
            jedis.lpush("list1","1","2","3");
            System.out.println(jedis.lrange("list1",0,-1));
            jedis.rpush("list1","4","5","6");
            System.out.println(jedis.lrange("list1",0,-1));
            System.out.println(jedis.llen("list1"));
            jedis.lpop("list1");
            jedis.rpop("list1");
            System.out.println(jedis.lrange("list1",0,-1));
        }
    
  • 小结

    • Jedis中实现List的操作

知识点21:Jedis:Set操作

  • 目标Jedis中实现Set的操作

  • 实施

    sadd/smembers/sismember/scard/srem
    
        @Test
        public void testSet(){
            //sadd/smembers/sismember/scard/srem
            jedis.sadd("set1","1","2","3","1","2","3","4","5","6");
            System.out.println("长度:"+jedis.scard("set1"));
            System.out.println("内容:"+jedis.smembers("set1"));
            System.out.println(jedis.sismember("set1","1"));
            System.out.println(jedis.sismember("set1","7"));
            jedis.srem("set1","2");
            System.out.println("内容:"+jedis.smembers("set1"));
    
        }
    
  • 小结

    • Jedis中实现Set的操作

知识点22:Jedis:Zset操作

  • 目标Jedis中实现Zset的操作

  • 实施

    zadd/zrange/zrevrange/zcard/zrem
    
        @Test
        public void testZset(){
            //zadd/zrange/zrevrange/zcard/zrem
            jedis.zadd("zset1",20.9,"yuwen");
            jedis.zadd("zset1",10.5,"yinyu");
            jedis.zadd("zset1",70.9,"shuxue");
            jedis.zadd("zset1",99.9,"shengwu");
            Set<String> zset1 = jedis.zrange("zset1", 0, -1);
            System.out.println(zset1);
            System.out.println(jedis.zrevrange("zset1",0,-1));
            System.out.println(jedis.zcard("zset1"));
            jedis.zrem("zset1","yuwen");
            System.out.println(jedis.zrangeWithScores("zset1",0,-1));
        }
    
  • 小结

    • Jedis中实现Zset的操作

附录一:Jedis Maven依赖

    <properties>
        <jedis.version>3.2.0</jedis.version>
    </properties>

    <dependencies>
        <!-- Jedis 依赖 -->
        <dependency>
            <groupId>redis.clients</groupId>
            <artifactId>jedis</artifactId>
            <version>${jedis.version}</version>
        </dependency>
        <!-- JUnit 4 依赖 -->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.13</version>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.0</version>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                    <encoding>UTF-8</encoding>
                </configuration>
            </plugin>
        </plugins>
    </build>

dd(“zset1”,10.5,“yinyu”);
jedis.zadd(“zset1”,70.9,“shuxue”);
jedis.zadd(“zset1”,99.9,“shengwu”);
Set zset1 = jedis.zrange(“zset1”, 0, -1);
System.out.println(zset1);
System.out.println(jedis.zrevrange(“zset1”,0,-1));
System.out.println(jedis.zcard(“zset1”));
jedis.zrem(“zset1”,“yuwen”);
System.out.println(jedis.zrangeWithScores(“zset1”,0,-1));
}




- **小结**

- Jedis中实现Zset的操作



## 附录一:Jedis Maven依赖

```xml
  <properties>
      <jedis.version>3.2.0</jedis.version>
  </properties>

  <dependencies>
      <!-- Jedis 依赖 -->
      <dependency>
          <groupId>redis.clients</groupId>
          <artifactId>jedis</artifactId>
          <version>${jedis.version}</version>
      </dependency>
      <!-- JUnit 4 依赖 -->
      <dependency>
          <groupId>junit</groupId>
          <artifactId>junit</artifactId>
          <version>4.13</version>
      </dependency>
  </dependencies>

  <build>
      <plugins>
          <plugin>
              <groupId>org.apache.maven.plugins</groupId>
              <artifactId>maven-compiler-plugin</artifactId>
              <version>3.0</version>
              <configuration>
                  <source>1.8</source>
                  <target>1.8</target>
                  <encoding>UTF-8</encoding>
              </configuration>
          </plugin>
      </plugins>
  </build>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值