• 02Redis --Redis入门、安装、启动、性能测试、基础知识


    文章目录

    😹 作者: gh-xiaohe
    😻 gh-xiaohe的博客
    😽 觉得博主文章写的不错的话,希望大家三连(✌关注,✌点赞,✌评论),多多支持一下!!!


    官网:Redis

    中文网: Redis中文网CRUG

    🚏 安装Redis

    🚀 Windows安装Redis

    🚬 1、解压安装包

    在这里插入图片描述

    🚬 2、开启redis-server.exe

    在这里插入图片描述

    🚬 3、启动redis-cli.exe测试

    在这里插入图片描述
    Window下使用确实简单,但是Redis 推荐我们使用Linux 去开发使用!

    🚄 Linux安装Redis

    🚬 1、下载安装包:redis-6.2.5.tar.gz

    🚬 2、解压Redis的安装包!程序一般放在 /opt 目录下

    [root@gh gh]# mv redis-6.2.5.tar.gz /opt    #移动到 opt目录下
    [root@gh gh]# cd /opt
    [root@gh opt]# ls
    containerd  redis-6.2.5.tar.gz            
    [root@gh opt]# tar -zxvf redis-6.2.5.tar.gz     #解压
    
    • 1
    • 2
    • 3
    • 4
    • 5

    🚬 3、进入解压文件后,可以看到redis的配置文件

    在这里插入图片描述

    🚬 4、基本的环境安装

     # yum install gcc-c++
     # gcc -v
    
     # 在redis目录下
     # make  # 把所有需要的文件给配置上
     
     # make install 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    🚬 5、redis的默认安装路径 /usr/local/bin

    cd  /usr/local/bin
    
    • 1

    在这里插入图片描述

    🚬 6、将redis的配置文件,复制到我们的当前目录下

    在这里插入图片描述

    🚬 7、redis默认不是后台启动的,修改配置文件!

    在这里插入图片描述

    🚬 8、启动redis服务

    通过制定的配置文件启动 redis-server gconfig/redis.conf

    [root@gh bin]# redis-server gconfig/redis.conf 
    
    • 1

    🚬 9、使用redis-cli进行测试链接

    [root@gh bin]# redis-server gconfig/redis.conf 
    [root@gh bin]# redis-cli -p 6379
    127.0.0.1:6379> ping
    PONG
    127.0.0.1:6379> 
    [root@gh bin]# ls
    gconfig          jemalloc.sh  libmcrypt-config  luajit-2.0.4  mdecrypt         redis-check-aof  redis-cli       redis-server
    jemalloc-config  jeprof       luajit            mcrypt        redis-benchmark  redis-check-rdb  redis-sentinel
    [root@gh bin]# redis-cli -p 6379
    127.0.0.1:6379> ping
    PONG
    127.0.0.1:6379> set name gh
    OK
    127.0.0.1:6379> get name1
    (nil)
    127.0.0.1:6379> get name
    "gh"
    127.0.0.1:6379> key *
    (error) ERR unknown command `key`, with args beginning with: `*`, 
    127.0.0.1:6379> keys *
    1) "name"
    127.0.0.1:6379> 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WFbx9Ll5-1662466094734)(data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==)]

    🚬 10、查看redis 的进程是否开启

    在这里插入图片描述

    🚬 11、关闭redis服务 shutdown

    在这里插入图片描述

    🚏 启动Redis

    [root@gh ~]# cd  /usr/local/bin
    [root@gh bin]# redis-server gconfig/redis.conf 
    [root@gh bin]# redis-cli -p 6379
    
    ********* 关闭  ***************
    shutdown
    exit
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    🚏 测试性能

    redis-benchmark: Redis官方提供的性能测试工具,参数选项如下:

    在这里插入图片描述
    测试

    测试 100个并发链接 100000请求
    [root@gh /]# redis-benchmark -h localhost -p 6379 -c 100 -n 100000
    
    • 1
    • 2

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XvvgQvUF-1662466886056)(data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==)]

    🚏 基础知识

    🚬 redis默认有16个数据库,默认使用的是第0个

    在这里插入图片描述

    🚬 1、可以使用select 进行切换数据库

    127.0.0.1:6379> select 3
    OK
    127.0.0.1:6379[3]> 
    
    • 1
    • 2
    • 3

    🚬 2、查看数据库大小 dbsize

    127.0.0.1:6379[3]> dbsize
    (integer) 0
    127.0.0.1:6379[3]> set name gh
    OK
    127.0.0.1:6379[3]> dbsize
    (integer) 1
    127.0.0.1:6379[3]> 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    🚬 3、查看所有得key keys *

    🚬 4、清空当前数据库 flushdb

    🚬 5、清空全部数据库内容 flushall

    🚬 6、redis是单线程的

        redis很快 ,redis基于内存操作cpu 不是redis性能瓶颈 ,redis的瓶颈是根据机器的内存和网络带宽 ,既然可以使用单线程来实现,就使用单线程。

        redis是c语言写的,官方数据是100000+的QPS ,这个不必同样使用key-value的Memecache差

    🚬 7、redis为什么单线程还这么快

    • 误区一:高性能的服务器一定是多线程的?
    • 误区二:多线程(cpu上下文切换)一定比单线程高!

    🚬 8、核心:

        redis将所有数据全部放在内存中,所以说使用单线程去操作效率高,多线程(cpu上下文切换:耗时操作),对于内存系统来说,如果没有上下文切换效率是最高的,多次读写都是在一个cpu上的,在内存情况下,这个就是最佳方案!

    💒 Redis-五大基本数据类型

    redis中文网更多命令可以参考
    在这里插入图片描述

    🚀 Redis-key

    🚬 判断当前key 是否存在 exists

    127.0.0.1:6379> flushall
    OK
    127.0.0.1:6379> set name gh
    OK
    127.0.0.1:6379> keys *
    1) "name"
    127.0.0.1:6379> set age 1
    OK
    127.0.0.1:6379> keys * 
    1) "age"
    2) "name"
    127.0.0.1:6379> exists name     # 判断当前的key 是否存在 返回 1 存在
    (integer) 1
    127.0.0.1:6379> exists name1
    (integer) 0
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    🚬 移除当前key move

    127.0.0.1:6379> move name 1     # 移除 当前的key  设置为1 从当前数据库 移除
    (integer) 1                     # 过期:缓存、热点数据、cookie、session
    127.0.0.1:6379> KEYS *
    1) "age"
    127.0.0.1:6379> set name gh
    OK
    127.0.0.1:6379> KEYS *
    1) "name"
    2) "age"
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    🚬 设置key 过期时间 expire

    127.0.0.1:6379> expire name 10   # 设置过期的时间 10 秒
    (integer) 1
    
    
    • 1
    • 2
    • 3

    🚬 查看key 所剩的过期时间 ttl -2 -1

    127.0.0.1:6379> ttl name         # 查看当前key 的剩余时间
    (integer) 7
    127.0.0.1:6379> ttl name
    (integer) 5
    127.0.0.1:6379> ttl name         # -2 代表过期
    (integer) -2
    127.0.0.1:6379> ttl age          # -1 永不过期
    (integer) -1
    127.0.0.1:6379> get name        # 时间一个过, 获取不到
    (nil)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    🚬 查看key 的类型 type

    127.0.0.1:6379> set name gh
    OK
    127.0.0.1:6379> KEYS *
    1) "name"
    2) "age"
    127.0.0.1:6379> type name       # 查看当前 key 的类型
    string
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    🚄 一、string(字符串)类型

        追加字符串 append 不存在 key 就相当于 set key

    🚬 1、获取字符串的长度 strlen

    127.0.0.1:6379> set key1 v1
    OK
    127.0.0.1:6379> get key1
    "v1"
    127.0.0.1:6379> KEYS *
    1) "key1"
    127.0.0.1:6379> exists key1
    (integer) 1
    127.0.0.1:6379> APPEND key1 "hello"  # 追加字符串,不存在 就相当于 set key
    (integer) 7
    127.0.0.1:6379> get key1
    "v1hello"
    127.0.0.1:6379> strlen key1
    (integer) 7
    127.0.0.1:6379> append key1 "gh"
    (integer) 9
    127.0.0.1:6379> get key1
    "v1hellogh"
    127.0.0.1:6379> append name "zhangsan"
    (integer) 8
    127.0.0.1:6379> KEYS *
    1) "key1"
    2) "name"
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

    🚬 2、i++/i-- incr/decr 步长 i+=/i-= incrby/decrby

    127.0.0.1:6379> set views 0
    OK
    127.0.0.1:6379> get views
    "0"
    127.0.0.1:6379> incr views   # 浏览量 + 1
    (integer) 1
    127.0.0.1:6379> incr views
    (integer) 2
    127.0.0.1:6379> get views
    "2"
    127.0.0.1:6379> decr views   # 浏览量 - 1
    (integer) 1
    127.0.0.1:6379> get views
    "1"
    127.0.0.1:6379> INCRBY views 10  # 浏览量 + 10 
    (integer) 11
    127.0.0.1:6379> get views
    "11"
    127.0.0.1:6379> DECRBY views 10  # 浏览量 - 10 
    (integer) 1
    127.0.0.1:6379> get views
    "1"
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

    🚬 3、字符串范围 getrange

    127.0.0.1:6379> keys *
    (empty array)
    127.0.0.1:6379> set key1 "hello,word"
    OK
    127.0.0.1:6379> get key1
    "hello,word"
    127.0.0.1:6379> getrange key1 0 4      # 获取字符串的范围
    "hello"
    127.0.0.1:6379> getrange key1 0 -1     # 获取全部的字符串
    "hello,word"
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    🚬 4、替换制定位置开始的字符串 setrange

    127.0.0.1:6379> set key2 1234567
    OK
    127.0.0.1:6379> get key2
    "1234567"
    127.0.0.1:6379> setrange key2 1 xx  # 替换 索引为1 后的两个字符
    (integer) 7
    127.0.0.1:6379> get key2
    "1xx4567"
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    🚬 5、setex (set with expire) # 设置过期时间

    127.0.0.1:6379> setex key3 30 "hello"   # 设置过期时间 30 秒
    OK
    127.0.0.1:6379> ttl key3                # 显示 还剩多长时间过期
    (integer) 23
    127.0.0.1:6379> get key3
    "hello"
    127.0.0.1:6379> KEYS *                  # key3 已经过期
    1) "key1"
    2) "myley"
    3) "key2"
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    🚬 6、setnx (set if not exist) (在分布式锁中常常会使用)

    不存在 在设置

    • 返回 1 设置成功

    • 返回 0 设置失败

    127.0.0.1:6379> setnx mykey "redis"      # 不存在 mykey 在创建 mykey   1 成功
    (integer) 1
    127.0.0.1:6379> KEYS *
    1) "key1"
    2) "myley"
    3) "key2"
    127.0.0.1:6379> setnx myley "1234567"    # 存在 mykey 创建不成功 返回 0  
    (integer) 0
    127.0.0.1:6379> get myley
    "redis"
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    🚬 7、批量设置mset/获取mget

    127.0.0.1:6379> mset k1 v1 k2 v2 k3 v3  # 批量设置值
    OK
    127.0.0.1:6379> mget k1 k2 k3           # 批量获取值
    1) "v1"
    2) "v2"
    3) "v3"
    127.0.0.1:6379> msetnx k1 v1 k4 v3      # 批量设置 存在设置
    (integer) 0                               发现 是原子性操作 要么一起成功 一起失败
    127.0.0.1:6379> get k4
    (nil)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    🚬 8、对象

        set user2 {name:lisi,age:3} # 设置一个user:2 对象 值为json 字符串来保存对象

    127.0.0.1:6379> set user2 {name:lisi,age:3}
    OK
    127.0.0.1:6379> get user2
    "{name:lisi,age:3}"
    
    • 1
    • 2
    • 3
    • 4

        这里的key是一个巧妙的设计: user:{id}:{filed},如此设计在redis中是完全OK

    127.0.0.1:6379> mset user:1:name zhangsan user:1:age 2
    OK
    127.0.0.1:6379> mget user:1:name user:1:age
    1) "zhangsan"
    2) "2"
    
    • 1
    • 2
    • 3
    • 4
    • 5

    🚬 9、先get在set getset

    127.0.0.1:6379> getset db redis   # 如果不存在值,则返回 nil
    (nil)
    127.0.0.1:6379> get db
    "redis"
    127.0.0.1:6379> getset db mongodb # 如果存在值,获取原来的值,并设置新的值
    "redis"
    127.0.0.1:6379> get db
    "mongodb"
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    🚬 String类型的使用的场景:

    • value除了是我们的字符串还可以是我们的数字!

      • 计数器

      • 统计多单位的数量

      • 对象缓存存储

      • 粉丝数

    🚒 二、List(列表)类型

    • 可以存储重复的值
    • 所有的list命令都是以 l 开头的
    • 应用: 在redis里面,我们可以把list玩成栈,堆、队列、阻塞队列!

    在这里插入图片描述

    🚬 1、头部插入值 lpush

    🚬 2、尾部插入值 rpush

    🚬 3、获取list中的值 lrange 0 -1

    🚬 4、获取list区间的值 lrange [ ]

    127.0.0.1:6379> lpush list one   # 将一个或多个值,插入到列表的头部 (左)
    (integer) 1
    127.0.0.1:6379> lpush list two
    (integer) 2
    127.0.0.1:6379> lpush list three
    (integer) 3
    127.0.0.1:6379> lrange list 0 -1 # 获取list中的值   注意:索引是反过来的
    1) "three"                            0
    2) "two"                              1  
    3) "one"                              2  
    127.0.0.1:6379> lrange list 0 1 # 通过区间获取具体的值
    1) "three"
    2) "two"
     
    127.0.0.1:6379> RPUSH list right   #  # 将一个或多个值,插入到列表的 尾部 (右)
    (integer) 4
    127.0.0.1:6379> lrange list 0 -1
    1) "three"
    2) "two"
    3) "one"
    4) "right"
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    🚬 5、左边移除 lpop

    🚬 6、右边移除 rpop

    127.0.0.1:6379> lrange list 0 -1
    1) "three"
    2) "two"
    3) "one"
    4) "right"
    127.0.0.1:6379> lpop list           # 移除list的第一个元素
    "three"
    127.0.0.1:6379> rpop list           # 移除list的最后一个元素
    "right"
    127.0.0.1:6379> lrange list 0 -1
    1) "two"
    2) "one"
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    127.0.0.1:6379> lpush list 1
    (integer) 1
    127.0.0.1:6379> lpush list 2
    (integer) 2
    127.0.0.1:6379> lpush list 3
    (integer) 3
    127.0.0.1:6379> lpush list 4
    (integer) 4
    127.0.0.1:6379> lpush list 5
    (integer) 5
    127.0.0.1:6379> lpush list 6
    (integer) 6
    127.0.0.1:6379> lpush list 7
    (integer) 7
    127.0.0.1:6379> lpush list 8
    (integer) 8
    127.0.0.1:6379> lpush list 9
    (integer) 9
    127.0.0.1:6379> lrange list 0 -1
    1) "9"
    2) "8"
    3) "7"
    4) "6"
    5) "5"
    6) "4"
    7) "3"
    8) "2"
    9) "1"
    127.0.0.1:6379> lpop list 2        # 移除list的 头 2 个元素
    1) "9"
    2) "8"
    127.0.0.1:6379> lrange list 0 -1
    1) "7"
    2) "6"
    3) "5"
    4) "4"
    5) "3"
    6) "2"
    7) "1"
    127.0.0.1:6379> rpop list 2       # 移除list的尾部 2 个元素
    1) "1"
    2) "2"
    127.0.0.1:6379> lrange list 0 -1
    1) "7"
    2) "6"
    3) "5"
    4) "4"
    5) "3"
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48

    🚬 7、通过下表获取list中的某一个值 lindex

    127.0.0.1:6379> lrange list 0 -1
    1) "6"
    2) "5"
    3) "4"
    4) "3"
    5) "2"
    6) "1"
    127.0.0.1:6379> lindex list 0
    "6"
    127.0.0.1:6379> lindex list 5
    "1"
    127.0.0.1:6379> lindex list 2
    "4"
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    🚬 8、返回list列表的长度 llen

    127.0.0.1:6379> lrange list 0 -1
    1) "6"
    2) "5"
    3) "4"
    4) "3"
    5) "2"
    6) "1"
    127.0.0.1:6379> llen list
    (integer) 6
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    🚬 9、移除指定的值 lrem

    127.0.0.1:6379> lrange list 0 -1   # 可以存在相同的值
    1) "1"
    2) "6"
    3) "5"
    4) "4"
    5) "3"
    6) "2"
    7) "1"
    127.0.0.1:6379> lrem list 1 2     # 移除一个 2   移除list集合中制定个数的value,精确匹配
    (integer) 1
    127.0.0.1:6379> lrange list 0 -1
    1) "1"
    2) "6"
    3) "5"
    4) "4"
    5) "3"
    6) "1"
    127.0.0.1:6379> lrem list 2 1    # 移除两个 1
    (integer) 2
    127.0.0.1:6379> lrange list 0 -1
    1) "6"
    2) "5"
    3) "4"
    4) "3"
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24

    🚬 10、通过下表截取制定的长度 list 已经被改变了 ltrim

    127.0.0.1:6379> lrange mylist 0 -1
    1) "hello4"
    2) "hello3"
    3) "hello2"
    4) "hello1"
    127.0.0.1:6379> ltrim mylist 1 2
    OK
    127.0.0.1:6379> lrange mylist 0 -1
    1) "hello3"
    2) "hello2"
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    🚬 11、移除列表的最后一个元素,将他移动到新的列表中 rpoplush

    127.0.0.1:6379> lrange list 0 -1
    1) "hello1"
    2) "hello2"
    3) "hello3"
    127.0.0.1:6379> rpoplpush list mylist # 将list中的字符串,移除要新的列表中
    "hello3"
    127.0.0.1:6379> lrange list 0 -1  # 查看原来的列表
    1) "hello1"
    2) "hello2"
    127.0.0.1:6379> lrange mylist 0 -1 # 查看目标列表中,确实存在该值
    1) "hello3"
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    🚬 12、lset 将列表中制定下标的值替换为另一个值,更新操作

    127.0.0.1:6379> exists list         # 判断这个列表是否存在
    (integer) 0
    127.0.0.1:6379> lset list 0 item    # 如果不存在列表我们去更新就会报错
    (error) ERR no such key
    127.0.0.1:6379> lpush list value1
    (integer) 1
    127.0.0.1:6379> lrange list 0 0
    1) "value1"
    127.0.0.1:6379> lset list 0 item    # 如果存在,更新当前下表的值
    OK
    127.0.0.1:6379> lrange list 0 -1
    1) "item"
    127.0.0.1:6379> lset list 1 0 ther  # 如果不存在,则会报错  
    (error) ERR wrong number of arguments for 'lset' command
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    🚬 13、将value插入到 列表 中某个元素的前面或者后面 linsert

    linsert before/after “字符串” 内容

    127.0.0.1:6379> lrange list 0 -1
    1) "hello"
    2) "word"
    127.0.0.1:6379> linsert list before word one  # 在 word 的前面赠加一个 one
    (integer) 3
    127.0.0.1:6379> lrange list 0 -1
    1) "hello"
    2) "one"
    3) "word"
    127.0.0.1:6379> linsert list after  word two # 在 word 的后面赠加一个 two 
    (integer) 4
    127.0.0.1:6379> lrange list 0 -1
    1) "hello"
    2) "one"
    3) "word"
    4) "two"
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    🚬 小结

    • 实际上是一个双向链表 before Node after ,left ,right 都可以插入值
    • key不存在,创建新链表
    • 如果key 存在,新增内容
    • 移除所有元素,空链表也代表不存在
    • 在两边插入或者改动值,效率高,中间元素,相对效率低

    消息队列(Lpush Rpop),栈 (Lpush Lpop)

    🚤 三、Set(集合)类型

    • set无序不重复集合
    • set的命令都是以s开头
      在这里插入图片描述

    🚬 1、像set 中添加 值 sadd

    🚬 2、查看的set中的全部值 smembers

    🚬 3、判断 值 是否在 set 集合中 sismember

        smember 网络释义:查询特定值是否存在

    127.0.0.1:6379> sadd set hello1       # set 结合中添加 值
    (integer) 1
    127.0.0.1:6379> sadd set hello2
    (integer) 1
    127.0.0.1:6379> sadd set hello3
    (integer) 1
    127.0.0.1:6379> smembers set          # 查看指定set的 所有值  
    1) "hello1"
    2) "hello3"
    3) "hello2"
    127.0.0.1:6379> sismember set hello1  # 判断某一个值是不是在set集合中  
    (integer) 1                             存在 返回 1
    127.0.0.1:6379> sismember set word    
    (integer) 0                             不存在 返回 0   
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    🚬 4、获取set集合中的个数 scard

    127.0.0.1:6379> scard set   # 获取 set 集合中的内容元素的个数
    (integer) 3
    127.0.0.1:6379> sadd set 12306
    (integer) 1
    127.0.0.1:6379> esembers set
    1) "hello1"
    2) "hello3"
    3) "hello2"
    4) "12306"
    127.0.0.1:6379> scard set
    (integer) 4
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    🚬 5、移除set 集合中的指定元素 srem

    127.0.0.1:6379> smembers set 
    1) "hello1"
    2) "hello3"
    3) "hello2"
    4) "12306"
    127.0.0.1:6379> srem set hello3   # 移除set 中指定的元素
    (integer) 1
    127.0.0.1:6379> scard set
    (integer) 3
    127.0.0.1:6379> smembers set
    1) "hello1"
    2) "hello2"
    3) "12306"
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    🚬 6、set 无序不重复集合,随机抽取 srandmember

    127.0.0.1:6379> smembers myset
    1) "k4"
    2) "k3"
    3) "k1"
    4) "k2"
    127.0.0.1:6379> SRANDMEMBER myset   # 随机抽取一个元素
    "k4"
    127.0.0.1:6379> SRANDMEMBER myset
    "k2"
    127.0.0.1:6379> SRANDMEMBER myset
    "k4"
    127.0.0.1:6379> SRANDMEMBER myset
    "k3"
    127.0.0.1:6379> SRANDMEMBER myset 2 # 随机抽取两个元素
    1) "k1"
    2) "k2"
    127.0.0.1:6379> SRANDMEMBER myset 2
    1) "k3"
    2) "k4"
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    🚬 7、随机删除set 集合中的元素 spop

    127.0.0.1:6379> smembers myset
    1) "k4"
    2) "k3"
    3) "k1"
    4) "k2" 
    127.0.0.1:6379> spop myset   # 随机删除set 集合中的元素
    "k2"
    127.0.0.1:6379> spop myset 
    "k4"
    127.0.0.1:6379> smembers myset
    1) "k3"
    2) "k1"
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    🚬 8、将指定的一个值,移动到另外一个set集合中 smove

    127.0.0.1:6379> smembers set
    1) "hello1"
    2) "hello3"
    3) "hello2"
    127.0.0.1:6379> smembers myset
    1) "hello4"
    127.0.0.1:6379> smove set myset hello2  # 将指定的值,移动到另外一个set集合
    (integer) 1
    127.0.0.1:6379> smembers set
    1) "hello1"
    2) "hello3"
    127.0.0.1:6379> smembers myset
    1) "hello4"
    2) "hello2"
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    🚬 9、数字类型集合 差集 SDIFF、交集 SINTER、并集 SUNION

    127.0.0.1:6379> smembers k1
    1) "v3"
    2) "v1"
    3) "v2"
    127.0.0.1:6379> smembers k2
    1) "v2"
    2) "v4"
    127.0.0.1:6379> SDIFF k1 k2  # 差集
    1) "v1" 
    2) "v3"
    127.0.0.1:6379> SINTER k1 k2 # 交集
    1) "v2"
    127.0.0.1:6379> SUNION k1 k2 # 并集
    1) "v1"
    2) "v3"
    3) "v2"
    4) "v4"
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    🚬 应用场景

        微博,将a用户所有关注的人放在一个集合中,将他的粉丝也放在一个集合中!共同关注,共同爱好

    🚗 四、Hash(哈希)类型

    • Map集合 key - key - map 值是map集合
    • Hash的命令都是以l开头
    • 本质: 和String 没有太大的区别,还是简单的key - value 不过是value 变成了一个 map

    在这里插入图片描述

    🚬 1、设置和获取hash的值 hset hget

    🚬 2、设置多个 和 获取多个 hash 的值 hmset hmget

    🚬 3、获取全部的数据 hgetall

    🚬 4、删除hash指定的字段!对应的value也随之消失 hdel

    127.0.0.1:6379> hset myhash k1 v1        # set 一个具体的 key-value
    (integer) 1
    127.0.0.1:6379> hget myhash k1           # 获取一个字段值 
    "v1"
    127.0.0.1:6379> hmset myhash k1 v2 k2 v3 # set 多个 key-value
    OK
    127.0.0.1:6379> hmget myhash k1 k2       # 获取多个 字段值
    1) "v2"
    2) "v3"
    127.0.0.1:6379> hgetall myhash           # 获取全部的数据
    1) "k1"
    2) "v2"
    3) "k2"
    4) "v3"
    127.0.0.1:6379> hdel myhash k1
    (integer) 1
    127.0.0.1:6379> hgetall myhash
    1) "k2"
    2) "v3"
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    🚬 5、获取hash表的字段数量 hlen

    127.0.0.1:6379> hgetall myhash
    1) "k2"
    2) "v3"
    3) "k1"
    4) "v1"
    127.0.0.1:6379> hlen myhash
    (integer) 2
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    🚬 6、判断hash中指定字段是否存在! hexists

    127.0.0.1:6379> HEXISTS myhash k1 
    (integer) 1
    127.0.0.1:6379> HEXISTS myhash k3
    (integer) 0
    
    • 1
    • 2
    • 3
    • 4

    🚬 7、只获得所有的key 只获得所有的value hkeys / hvals

    127.0.0.1:6379> hgetall myhash
    1) "k2"
    2) "v3"
    3) "k1"
    4) "v1"
    127.0.0.1:6379> hkeys myhash   # 只获取所有的flield
    1) "k2"
    2) "k1"
    127.0.0.1:6379> hvals myhash   # 只获获取所有的value
    1) "v3"
    2) "v1"
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    🚬 8、hincrby hdecrby hsetnx

    127.0.0.1:6379> hgetall myhash
    1) "k1"
    2) "1"
    3) "k2"
    4) "3"
    127.0.0.1:6379> HINCRBY myhash k1 3     # 指定增量
    (integer) 4
    127.0.0.1:6379> HGETALL myhash
    1) "k1"
    2) "4"
    3) "k2"
    4) "3"
    127.0.0.1:6379> hsetnx myhash k3 hello   # 如果不存在则可以设置
    (integer) 1
    127.0.0.1:6379> hsetnx myhash k3 hello   # 如果存在不能设置
    (integer) 0
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    🚬 9、存储对象

    127.0.0.1:6379> hmset user:2 name zhangsan age 12  student idea
    OK
    127.0.0.1:6379> hmget user:2 name age student
    1) "zhangsan"
    2) "12"
    3) "idea"
    127.0.0.1:6379> hgetall user:2
    1) "name"
    2) "zhangsan"
    3) "age"
    4) "12"
    5) "student"
    6) "idea"
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    🚬 小结

        Hash变更数据 User Name Age,尤其是Hash变更数据 。经常变动的信息!Hash更适合对象的存储,String 更适合字符串的存储

    🚲 五、Zset(有序结合)类型

    在这里插入图片描述

    🚬 1、添加一个值 zadd

    🚬 2、查看Zset中的数据 zrange

    127.0.0.1:6379> zadd myset 1 one         # 添加一个值
    (integer) 1 
    127.0.0.1:6379> zadd myset 2 two 3 three # 添加多个值
    (integer) 2
    127.0.0.1:6379> zrange myset 0 -1
    1) "one"
    2) "two"
    3) "three"
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    🚬 3、从小到大排序 带 【参数】 zrangebyscore 【withsocres】

    🚬 4、从大到小排序 带 【参数】zrevrange 【withsocres】

    127.0.0.1:6379> zadd salary 2500 xiaoming   #添加三个用户
    (integer) 1
    127.0.0.1:6379> zadd salary 500 zhangfei
    (integer) 1
    127.0.0.1:6379> zadd salary 3000 lisi  
    (integer) 1
    127.0.0.1:6379> ZRANGEBYSCORE salary -inf +inf  # 显示全部的用户 从小到大
    1) "zhangfei"
    2) "xiaoming"
    3) "lisi"
    127.0.0.1:6379> ZRANGEBYSCORE salary -inf +inf withscores # 显示全部的用户 从小到大 并带薪水
    1) "zhangfei"
    2) "500"
    3) "xiaoming"
    4) "2500"
    5) "lisi"
    6) "3000"
    127.0.0.1:6379> ZREVRANGE salary 0 -1  # 显示全部的用户 从大到小  
    1) "lisi"
    2) "xiaoming"
    3) "zhangfei"
    127.0.0.1:6379> ZREVRANGE salary 0 -1 withscores  # 显示全部的用户 从大到小  并带薪水
    1) "lisi"
    2) "3000"
    3) "xiaoming"
    4) "2500"
    5) "zhangfei"
    6) "500"
    127.0.0.1:6379> ZRANGEBYSCORE salary -inf 2500 withscores  显示工资小于 2500 员工的升序排序
    1) "zhangfei"
    2) "500"
    3) "xiaoming"
    4) "2500"
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33

    🚬 5、移除Zset中的元素 zrem

    🚬 6、获取有序集合Zset中的个数 zcard

    127.0.0.1:6379> zrange salary 0 -1
    1) "zhangfei"
    2) "xiaoming"
    3) "lisi"
    127.0.0.1:6379> zcard salary          # 获取zset集合中的个数
    (integer) 3
    127.0.0.1:6379> zrem salary xiaoming  # 移除zset集合中的元素
    (integer) 1
    127.0.0.1:6379> zcard salary
    (integer) 2
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    🚬 7、获取定区间的成员变量 zcount

    127.0.0.1:6379> zrange myset 0 -1
    1) "hello"
    2) "word"
    3) "haerbin"
    127.0.0.1:6379> zcount myset 1 3  # 获取指定区间的成员数量!
    (integer) 3
    127.0.0.1:6379> zcount myset 1 2
    (integer) 2
    127.0.0.1:6379> zcount myset 2 3
    (integer) 2
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    🚬 案例思路:

        set 排序,存储班级成绩表,工资表排序 、排行榜应用

  • 相关阅读:
    微服务架构推动精益数字化管理体系建设,构建大数据分析平台
    IAST技术进阶系列(五):共生进化,自适应云原生
    二叉树--递归和回溯
    简单个人网页设计作业 静态HTML个人主题网页作业 DW个人网站模板下载 大学生简单个人网页作品代码 个人网页制作 学生个人网页Dreamweaver设计作业
    ORACLE RAC的一些基本理论知识
    801a qcn文件IMEI修改
    Golang中的GC原理(介于三个不同版本)
    db.sqlite3
    Air780E涂鸦云远程开关-LuatOS
    C++ 虚函数表原理和类的内存分布
  • 原文地址:https://blog.csdn.net/gh_xiaohe/article/details/126732233