Day24:内存式NoSQL数据库Redis

Posted 保护胖仔

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Day24:内存式NoSQL数据库Redis相关的知识,希望对你有一定的参考价值。

知识点01:目标

  1. NoSQL与RDBMS区别
    • 技术层次区别
    • 应用层次区别
  2. Redis的介绍
    • 功能
    • 应用场景
    • 特点
  3. Redis的使用【重点】
    • 命令行的使用方式:支持各种增删改查
    • Jedis:Java操作Redis API

知识点02:NoSQL与RDBMS

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

  • 路径

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

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

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

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

- 需求:能实现高并发的数据库,接受高并发请求
  • NoSQL的特点:Not Only SQL:非关系型数据库

    • 工具:Redis、HBASE、MongoDB……

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

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

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

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

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

  • 小结

    • 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数据库

    • 功能特点

      • 功能:提供高性能高并发的数据存储
      • 特点
        • 基于C语言开发的系统,与硬件的交互性能更好
        • 基于内存实现数据读写,读写性能更快
        • 分布式的、扩展性和稳定性更好
        • 支持事务、拥有各种丰富的数据结构
    • 应用场景

      • 缓存:用于实现高并发的数据缓存
      • 数据库:用于实现高性能的数据读写
      • 场景
        • 数据库:永久性存储,高性能的读写结果存储大数据领域中
        • 缓存:临时性存储,业务系统中作为缓存
        • 消息中间件:消息队列MQ,一般不用
  • 小结

    • Redis的功能与应用场景是什么?
      • 功能:提供高性能高并发分布式内存的存储
      • 应用
        • 缓存:高并发的读写
        • 数据库:高性能的读写
      • 特点:C语言、分布式、内存、支持事务、多种数据类型

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

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

  • 路径

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

    • Redis的版本

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

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

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

- 命令目录结构

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

    • step1:启动Redis服务端

- step2:启动Redis客户端


  • step3:执行测试命令

    127.0.0.1:6379> set s1 hadoop
    OK
    127.0.0.1:6379> keys *
    1) "s1"
    127.0.0.1:6379> set s2 hive
    OK
    127.0.0.1:6379> keys *
    1) "s2"
    2) "s1"
    127.0.0.1:6379> get s1
    "hadoop"
    127.0.0.1:6379> get s2
    "hive"
    127.0.0.1:6379>
    
  • 小结

    • 实现Redis的Windows版单机部署

知识点05:Redis的桌面工具

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

  • 实施

    • 解压安装

  • 启动连接

  • 小结

    • 了解Reids桌面工具的使用

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

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

  • 实施

    • 上传源码

      cd /export/software/
      rz
      

  • 解压

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

  • 安装依赖

    yum -y install gcc-c++ tcl
    

  • 编译安装

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

  • 修改配置

    • 复制配置文件

      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集合

        Map<String,T> = Redis存储
        
        • 写:指定K和V
        • 读:指定K
    • 数据类型

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

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

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

        K					V
        person1				name=zhangsan,age=18,sex=1,addr=shanghai
        person2				name=lisi,age=18,sex=1,addr=shanghai
        
    • List类型

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

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

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

    • Redis中的数据是什么结构?
      • KV结构
    • Redis中的数据类型有哪些?
      • K:String
      • V:String、Hash、List、Set、Zset、BitMap、HypeLogLog

知识点08:Redis的通用命令

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

  • 实施

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

      • 语法:keys 通配符
    • del key:删除某个KV

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

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

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

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

  • select N:切换数据库的

    • 默认Redis有16个数据库,DB0 ~ DB15
    • 默认自动进入0数据库

  • 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 hive
    OK
    node1:6379> get s1
    "hive"
    node1:6379> mset s2 spark s3 flink
    OK
    node1:6379> keys *
    1) "s3"
    2) "s2"
    3) "s1"
    node1:6379> mget s1 s3
    1) "hive"
    2) "flink"
    node1:6379> setnx s4 oozie
    (integer) 1
    node1:6379> keys *
    1) "s3"
    2) "s4"
    3) "s2"
    4) "s1"
    node1:6379> setnx s4 hive
    (integer) 0
    node1:6379> get s4
    "oozie"
    node1:6379> set s5 2
    OK
    node1:6379> get s5 
    "2"
    node1:6379> incr s5
    (integer) 3
    node1:6379> get s5
    "3"
    node1:6379> incrby s5 3
    (integer) 6
    node1:6379> get s5
    "6"
    node1:6379> decr s5
    (integer) 5
    node1:6379> get s5
    "5"
    node1:6379> decrby s5 2
    (integer) 3
    node1:6379> get s5
    "3"
    node1:6379> set s6 20.5
    OK
    node1:6379> get s6
    "20.5"
    node1:6379> incrbyfloat s6 1.2
    "21.7"
    node1:6379> strlen s1
    (integer) 4
    node1:6379> get s1
    "hive"
    node1:6379> get s1
    "hive"
    node1:6379> get s2
    "spark"
    node1:6379> strlen s2
    (integer) 5
    node1:6379> getrange s2 0 2
    "spa"
    node1:6379> 
    
  • 小结

    • 掌握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> hget m1 name
    "laoda"
    node1:6379> hset m1 age 18
    (integer) 1
    node1:6379> hget m1 age
    "18"
    node1:6379> hmset m1 addr shanghai sex male
    OK
    node1:6379> hmget m1 name sex
    1) "laoda"
    2) "male"
    node1:6379> hgetall m1
    1) "name"
    2) "laoda"
    3) "age"
    4) "18"
    5) "addr"
    6) "shanghai"
    7) "sex"
    8) "male"
    node1:6379> hdel m1 sex
    (integer) 1
    node1:6379> hgetall m1
    1) "name"
    2) "laoda"
    3) "age"
    4) "18"
    5) "addr"
    6) "shanghai"
    node1:6379> hlen m1
    (integer) 3
    node1:6379> hexists m1 name
    (integer) 1
    node1:6379> hexists m1 sex
    (integer) 0
    node1:6379> hgetall m1
    1) "name"
    2) "laoda"
    3) "age"
    4) "18"
    5) "addr"
    6) "shanghai"
    node1:6379> hvals m1
    1) "laoda"
    2) "18"
    3) "shanghai"
    
  • 小结

    • 掌握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 4 
      (integer) 4
      node1:6379> rpush list1 6 7 8 9
      (integer) 8
      node1:6379> rpush list1 1 2
      (integer) 10
      node1:6379> lrange list1 0 2
      1) "4"
      2) "3"
      3) "2"
      node1:6379> lrange list1 0 9
       1) "4"
       2) "3"
       3) "2"
       4) "1"
       5) "6"
       6) "7"
       7) "8"
       8) "9"
       9) "1"
      10) "2"
      node1:6379> lrange list1 0 20
       1) "4"
       2) "3"
       3) "2"
       4) "1"
       5) "6"
       6) "7"
       7) "8"
       8) "9"
       9) "1"
      10) "2"
      node1:6379> llen list1
      (integer) 10
      node1:6379> lrange list1 0 -1
       1) "4"
       2) "3"
       3) "2"
       4) "1"
       5) "6"
       6) "7"
       7) "8"
       8) "9"
       9) "1"
      10) "2"
      node1:6379> lrange list1 -2 -1
      1) "1"
      2) "2"
      node1:6379> lrange list1 0 9
       1) "4"
       2) "3"
       3) "2"
       4) "1"
       5) "6"
       6) "7"
       7) "8"
       8) "9"
       9) "1"
      10) "2"
      node1:6379> lrange list1 -10 -1
       1) "4"
       2) "3"
       3) "2"
       4) "1"
       5) "6"
       6) "7"
       7) "8"
       8) "9"
       9) "1"
      10) "2"
      node1:6379> lpop list1
      "4"
      node1:6379> lrange list1 0 -1
      1) "3"
      2) "2"
      3) "1"
      4) "6"
      5) "7"
      6) "8"
      7) "9"
      8) "1"
      9) "2"
      node1:6379> rpop list1
      "2"
      node1:6379> lrange list1 0 -1
      1) "3"
      2) "2"
      3) "1"
      4) "6"
      5) "7"
      6) "8"
      7) "9"
      8) "1"
      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 0 1 3 1 4 0 5 9 1
    (integer) 6
    node1:6379> smembers set1
    1) "0"
    2) "1"
    3) "3"
    4) "4"
    5) "5"
    6) "9"
    node1:6379> sismember set1 2
    (integer) 0
    node1:6379> sismember set1 9
    (integer) 1
    node1:6379> srem set1 3
    (integer) 1
    node1:6379> smembers set1
    1) "0"
    2) "1"
    3) "4"
    4) "5"
    5) "9"
    node1:6379> scard set1
    (integer) 5
    node1:6379> sadd set2 0 1 3 4 8 6 6 0 1
    (integer) 6
    node1:6379> sunion set1 set2
    1) "0"
    2) "1"
    3) "3"
    4) "4"
    5) "5"
    6) "6"
    7) "8"
    8) "9"
    node1:6379> sinter set1 set2
    1) "0"
    2) "1"
    3) "4"
    node1:6379> 
    
  • 小结

    • 掌握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 30.5 yuwen 70.8 shuxue 12.7 yingyu 99.9 dili
    (integer) 4
    node1:6379> zrange zset1 0 -1
    1) "yingyu"
    2) "yuwen"
    3) "shuxue"
    4) "dili"
    node1:6379> zrevrange zset1 0 -1
    1) "dili"
    2) "shuxue"
    3) "yuwen"
    4) "yingyu"
    node1:6379> zrange zset1 0 -1 withscores
    1) "yingyu"
    2) "12.699999999999999"
    3) "yuwen"
    4) "30.5"
    5) "shuxue"
    6) "70.799999999999997"
    7) "dili"
    8) "99.900000000000006"
    node1:6379> zrem zset1 shuxue
    (integer) 1
    node1:6379> zrange zset1 0 -1
    1) "yingyu"
    2) "yuwen"
    3) "dili"
    node1:6379> zcard zset1
    (integer) 3
    node1:6379> zscore zset1 yuwen
    "30.5"
    node1:6379> 
    
  • 小结

    • 掌握Zset类型的常用命令

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

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

  • 实施

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

- Redis中一个String最大支持512M =  2^32次方,1字节 = 8位
- 使用时,可以指定每一位对应的值,要么为0,要么为1,默认全部为0

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

  • 举例:统计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
      

node1:6379> setbit bit1 0 1
(integer) 0
node1:6379> setbit bit1 9 1
(integer) 0
node1:6379> getbit bit1 0
(integer) 1
node1:6379> getbit bit1 1
(integer) 0
node1:6379> getbit bit1 9
(integer) 1
node1:6379> getbit bit1 10
(integer) 0
node1:6379> bitcount bit1
(integer) 2
node1:6379> bitcount bit1 0 1
(integer) 2
node1:6379> bitcount bit1 0 0
(integer) 1
node1:6379> setbit bit2 0 1
(integer) 0
node1:6379> setbit bit2 10 1
(integer) 0
node1:6379> bitop and bit3 bit1 bit2
(integer) 2
node1:6379> bitcount bit3
(integer) 1
node1:6379> getbit bit3 0
(integer) 1
  • 小结

    • 掌握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依赖

      • 构建模块

      • 参考附录一添加依赖

  • 小结

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

知识点17:Jedis:构建连接

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

  • 实施

        //todo:1-构建连接
        Jedis jedis = null;
    
        @Before
        public void getConnection()
            //方式一:直接构建一个连接对象
            //实例化一个客户端连接对象,指定服务端地址
    //        jedis = new Jedis("node1",6379);
            //方式二:通过连接池来构建连接
            //构建连接池,并且配置连接池属性
            JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
            jedisPoolConfig.setMaxTotal(20);//最大连接数
            jedisPoolConfig.setMaxIdle(10);//最大空闲连接
            jedisPoolConfig.setMaxWaitMillis(1500);//最大等待时间
            //构建连接池:连接池配置对象,主机名,端口
            JedisPool jedisPool = new JedisPool(jedisPoolConfig,"node1",6379);
            //从连接池中获取连接对象
            jedis = jedisPool.getResource();
        
    
        //todo:3-释放连接
        @After
        public void close()
            jedis.close();
        
    
  • 小结

    • 实现Jedis的客户端连接

知识点18:Jedis:String操作

  • 目标Jedis中实现String的操作

  • 实施

    set/get/incr/exists/expire/setexp/ttl
    
        @Test
        public void stringTest()
            //set/get/incr/setex/expire/ttl/exists
    //        jedis.set("s1","hadoop");
    //        String s1 = jedis.get("s1");
    //        System.out.println(s1);
    //        jedis.set("s2","2");
    //        jedis.incr("s2");
    //        String s2 = jedis.get("s2");
    //        System.out.println(s2);
    //        jedis.expire("s2",20);
    //        while(true)
    //            System.out.println(jedis.ttl("s2"));
    //        
    //        System.out.println(jedis.exists("s1"));
    //        System.out.println(jedis.exists("s2"));
            jedis.setex("s2",10,"hive");
        
    
  • 小结

    • Jedis中实现String的操作

知识点19:Jedis:Hash操作

  • 目标Jedis中实现Hash的操作

  • 实施

    hset/hmset/hget/hgetall/hdel/hlen/hexists
    
        @Test
        public void hashTest()
            //hset/hmset/hget/hgetall/hdel/hlen/hexists
    //        jedis.hset("m1","name","zhangsan");
    //        String name = jedis.hget("m1", "name");
    //        System.out.println(name);
    //        System.out.println("==========================");
    //        Map<String,String> maps = new HashMap<>();
    //        maps.put("age","20");
    //        maps.put("sex","male");
    //        jedis.hmset("m1",maps);
    //        List<String> hmget = jedis.hmget("m1", "name", "age", "sex");
    //        System.out.println(hmget);
            Map<String, String> m1 = jedis.hgetAll("m1");
            for(Map.Entry map1 : m1.entrySet())
                System.out.println(map1.getKey()+"\\t"+map1.getValue());
            
    
            jedis.hdel("m1","name");
    
            Long m11 = jedis.hlen("m1");
            System.out.println(m11);
            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 listTest()
            //lpush/rpush/lrange/llen/lpop/rpop
            jedis.lpush("list1","1","2","3","4");
            jedis.rpush("list1","5","6","7","8");
            List<String> list1 = jedis.lrange("list1", 0, -1);
            System.out.println(list1);
            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操作