• 中间件 | Redis - [redis]


    §1 数据类型与常见应用场景

    下面的数据类型是指 value 的类型

    • string
    • list
    • hash
    • set
    • zset
    • bitmap
    • HyperLogLog
    • GEO
    • stream


    §2 命令速查

    通过官网
    在这里插入图片描述

    通过 redis 自己
    help @关键字


    §3 key 相关指令

    查看所有 key
    keys *
    在这里插入图片描述

    查看 key 是否存在
    exists key
    在这里插入图片描述

    查看 key 的类型
    type key
    在这里插入图片描述

    删除 key
    del key
    在这里插入图片描述
    异步删除 key
    unlink key
    此指令先在 keyspace 中删除 key,随后异步真正删除数据
    在这里插入图片描述
    设置 key 的超时时间
    expire key 10

    • 超时单位为秒
    • -1 表示永久有效
    • -2 表示已经过期

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


    §4 数据库 相关指令

    切换数据库
    select 数据库号
    数据库号 0-15,一共 16 个
    在这里插入图片描述
    查看当前库中 key 的数量
    dbsize
    在这里插入图片描述

    清空当前库
    flushdb

    清空所有库
    flushall


    §5 string

    §5.1 string 基本信息

    数据结构 & 特性

    • 数据结构是 Simple Dynamic String,相当于 ArrayList
      动态字符串类似 ArrayList,通过分配冗余空间的方式防止频繁分配内存空间
    • 扩容
      • < 1M 时,* 2
      • > 1M 时,+ 1M
    • 最大存储 512 M
    • string 是二进制安全的,因此可以存储任意数据(比如图片、序列化对象)

    适用场景与应用

    • 常用于分布式锁、普通存取、点赞(INCR,只需要数量,不能取消)
    • 或其他 长 key 但值单一 的数据
    §5.2 string 指令

    单一存取
    SET key value
    GET key

    批量存取
    MSET key1 value1 key2 value2
    MSET key1 key2

    自增自减
    INCR key
    INCRBY key n
    DECR key
    DECRBY key n

    获取长度
    STRLEN key

    追加
    APPEND KEY value
    用于将 value 追加到 KEY 原 value 的后面

    value 截取
    GETRANGE key start end
    获取值的子串,包含 start、end

    value 插入
    SETRANGE key index value
    将 value 插入原值 index 位置

    原子存
    SETNX key value
    SET key value 超时 标记

    • 超时有两种
      • EX 单位是秒
      • PX 单位是毫秒
    • 标记有两种
      • NX key 不存在时存入,等同于 setnx
      • XX key 存在时覆盖
    • SETNX 也只有批量版本 MSETNX
      但只要有一个值设置不成功,则整个操作都失败

    超时存
    SETEX key expire value
    存 key 时同时设置超时时间

    复写存
    SETGET key value
    存 key 时同时用 value 替换原始值

    查询超时
    TTL key


    §6 hash

    §6.1 hash 基本信息

    数据结构 & 特性

    • 数据结构是 zipList 和 hash 表
      • 数据量较少时,使用压缩列表存储,压缩列表是一块连续的空间
      • 数据量较多时,使用 hash 表
    • Redis 中的 hash 相当于 Map>
      需要注意,Map 的部分才是 hash
    • field 和 value 的类型可以是 String、byte[],相当于是 Object

    适用场景与应用
    对象存储
    可以使用 hash 或 string(存 json str)
    但如果需要对对象进行频繁修改并需要被其他调用者知道,应该使用 hash

    购物车(小型电商)
    下面的 key = prefix:userid,比如 shopcar:u1234
    新增商品 hset key prodid count
    添加商品数量 hset key prodid 1
    商品总数 hlen key
    全选 hgetall key

    §6.2 hash 指令

    单一存取
    HSET key field value
    HGET key field

    批量存取
    HMSET key field1 value1 field1 value1
    HMGET key field1 field2

    较新版本中可以使用 HSET key field1 value1 field1 value1 替代 HMSET key field1 value1 field1 value1

    获取所有字段
    HGETALL key
    获取所有字段和值

    获取 key 中全部 field 数量
    HLEN key

    查看 key 中是否具有 field
    HEXISTS key field

    获取 key 中全部 field
    HKEYS key
    只获取所有字段

    获取 key 中全部 value
    HVALS key

    字段自增
    HINCRBY key field n
    key 的 field 字段增加 n

    删除 key
    HDEL

    原子增加 field
    HSETNX key field value


    §7 list

    §7.1 list 基本信息

    数据结构 & 特性

    • 数据结构是 quickList
      • quickList,即压缩列表 zipList 的链表
      • 数据量较少时,使用压缩列表存储,压缩列表是一块连续的空间
      • 数据量较多时,使用 quickList
        将压缩列表 zipList 作为双向链表的 node 用前后指针串起来
        约定list 左为头,右为尾,即 (head…tail)
        因为虽然可以双向操作,但只有 LRANGE 没有 RRANGE
    • 有序
    • 元素可重复

    适用场景与应用
    简易消息队列(双向列表)
    文章推送、关注列表、消息盒子 LPUSH msg:userid messageid

    §7.2 list 指令

    左右存
    LPUSH key value1 value2
    RPUSH key value1 value2

    左右取(注意不是读,取后元素会移除)
    LPOP key
    RPOP key

    左右取多个
    LPOP key count
    RPOP key count
    相当于循环多次取,因此对 [1,2,3,4,5] 进行 RPOP key 2 得到 5,4

    获取指定范围的元素 list
    LRANGE key start end
    [start,end] 是要获取的范围
    索引 -1 表示最后一个元素

    获取 key 长度
    LLEN key

    获取指定位置的元素
    LINDEX key index

    修改指定位置的元素
    LSET key index value

    以元素为坐标插入
    LINSERT key before/after value new_value

    右侧弹出插入左边
    RPOPLPUSH key1 key2
    从 key1 的右侧弹出元素,并插入 key2 左侧

    左删除
    LREM key n value
    从左侧删除 n 个指定的 value


    §8 set

    §8.1 set 基本信息

    数据结构 & 特性

    • 数据结构是 dist 字典,即 hash 表
    • 增删查的复杂度是 O ( 1 ) O(1) O(1)
    • 无序
    • 无重复

    适用场景与应用
    用于各种社交场景或活动
    抽奖、红包
    SADD candidates 1
    SPOP candidates 1

    点赞(需要记录谁点的,可取消)
    SADD article:id userid
    SREM article:id userid
    SMEMBERS article:id
    SCARD article:id
    SISMEMBER article:id userid

    共同关注的项目
    SINTER watch:userid1 watch:userid1
    watch:userid1 = 用户 1 的关注列表

    共同关注项目的人
    SINTER watch.friens:userid1 watch:project1
    watch:project = 关注项目 1 的人
    SISMEMBER watch:userid2 projectid

    可能认识的人(推送 A 认识但 B 不认识的)
    SDIFF friends.userid1 friends.useri2

    §8.2 set 指令

    增删元素
    SADD key member1 member2
    SREM key member1 member2

    获取所有元素
    SMEMBERS key

    是否包含元素
    SISMEMBER key member

    元素个数
    SCARD key

    随机查元素(不删)
    SRANDMEMBER key conut

    随机获取元素(删)
    SPOP key count

    元素移动至其他集合
    SMOVE source_key dest_key value

    是否包含元素
    SISMEMBER key member

    取交集
    SINTER set1 set2

    取并集(A+B)
    SUNION set1 set2

    取差集(属于左但不属于右,A-B)
    SDIFF set1 set2


    §9 zset

    §9.1 zset 基本信息

    数据结构 & 特性

    • 数据结构是 hash 表和跳跃表 skipList
      • hash 表相当于 Map>
      • 跳跃表类似 treeMap,用于给 hash 部分排序
        • 相当于是一个多层的链表
        • 第 0 层每个元素指向下一个元素
        • 第 1 层每个元素指向第 0 层的下下个元素
        • 第 2 层每个元素指向第 1 层的下下个元素
        • 随着使用,各级跳表可能不在均匀,如下图
    • 无序
    • 无重复
      在这里插入图片描述

    适用场景与应用
    榜单
    ZINCRBY hotest:id 1 member(点赞时,有排名)
    ZREVRANGE prods max min
    按销量、关注度等排序

    §9.2 zset 指令

    增删元素
    ZADD key score1 member1 score2 member2
    ZREM key member1 member2

    查看分数
    ZSCORE key member

    元素加分
    ZINCRBY key score member

    排序并按分数区间返回(分页)
    ZRANGEBYSOCRE key min max
    ZREVRANGEBYSOCRE key min max

    • REV 表示反向排序,先按分数区间筛选,然后反向排序返回

    排序区间返回
    ZRANGE key start end
    ZRANGE key start end withsocres
    ZREVRANGE key start end withsocres

    • 0 表示最小分
    • -1 表示最大分
    • withsocre 表示连同评分一起返回
    • REV 表示反向排序,先按分数反向排序,然后按排名区间返回

    元素排名(正序、倒序)
    ZRANK key member
    ZREVRANK key member

    按排名删
    ZREMRANGEBYRANK key start stop

    获取所有元素
    SMEMBERS key

    元素个数
    ZCARD key

    分数范围内元素个数
    ZCOUNT key min max


    §10 bitmap

    §10.1 bitmap 基本信息

    数据结构 & 特性

    • 数据结构就是 字符串,但相当于将其当做 bit[] 使用
      • 存储时实际就是作为 string 存储
      • 使用上单独提供了一套命令,使使用上达到操作 bit[] 的效果

    适用场景与应用
    标记位、进度标记(多个准备工作同时具备后可以进行下一步)、游戏存档
    适用于每个记录单元仅有两个状态的记录、统计工作,相对传统 set 可以节省大量空间
    - 但若数据量不大,且有大量 0 则不适用(因为用不用无所谓)
    - 同时,极大数据量时,可能位操作的寻址有较大开销,但及其节省空间(可以理解为 64 倍或更多)

    §10.2 bitmap 指令

    设置位
    SETBIT key offset 1/0
    把 key 的 offset 位设置为 1/0
    注意,当偏移量很大时,可能比较慢

    获取位
    GETBIT key offset

    统计位
    COUNTBIT key
    COUNTBIT key start end
    统计 key 中值为 1 的 bit 位的个数
    可以指定开始、结束位
    - 左右都包含
    - 支持负数
    - 按 byte 为单位
    COUNTBIT key 0 1 是统计 key 中前两个字节中 bit 位为 1 的个数

    位运算操作
    BITOP command result_key key1 key2 ...
    对后续的位进行位运算
    command 包括

    • and 与
    • or 或
    • xor 异或
    • not 非


    §11 HyperLogLog

    §11.1 HyperLogLog 基本信息

    数据结构 & 特性

    • 数据结构分为 密集存储结构稀疏存储结构 两种
    • 默认为稀疏存储结构
    • 常说的占用12K内存的是密集存储结构,连续 16384 个 6bit 桶串成的位图
    • HyperLogLog 是不精确的,但误差在 0.81%

    适用场景与应用
    适用于基数问题

    基数问题
    基数问题是指需要在去重的基础上进行统计的问题
    比如 独立访客(UV,Unique Visitor)、独立 IP 数、搜索记录数等

    原始的基数问题可以通过下面方式解决

    • 数据库的 distinct count
    • redis 中的 hash、set、bitmaps等
      但 HyperLogLog 更适用于高数据量、高复杂度的场景
    • 体积小,每个 HyperLogLog 键只占用 12KB 内存
    • 数据量大,每个 HyperLogLog 键可计算约 2 64 2^{64} 264 个元素的基数
    • 但, HyperLogLog 只记录基数,不记录元素本身
    §11.2 HyperLogLog 指令

    基数增
    PFADD key value1 value2 value3...
    增加的时候会自动去重

    基数统计
    PFCOUNT key

    基数合并
    PFMERGE result_key key1 key2
    将 key1 key2 的基数合并到 result_key


    §12 GEO

    §12.1 GEO 基本信息

    数据结构 & 特性

    • 数据结构分为 密集存储结构稀疏存储结构 两种
    • 默认为稀疏存储结构
    • 常说的占用12K内存的是密集存储结构,连续 16384 个 6bit 桶串成的位图

    适用场景与应用
    关于经纬度二维坐标的场景
    GEO 是 Geographic(地理) 的缩写

    §12.2 GEO 指令

    坐标增
    GEOADD key 经度 纬度 name...
    经纬度和 name 可以同时添加多个
    有效经纬度 [-180,180],两极不能直接添加

    取坐标
    GEOPOS key name

    坐标模
    GEODIST key name1 name2 unit
    计算 key 中 name1 name2 两个地点的直线距离
    可以指定距离的单位 unit

    • m:米,默认单位
    • km:千米
    • mi:英里
    • ft:英尺

    坐标半径搜索
    GEORADIUS key 经度 纬度 radius unit
    以指定的经纬度为中心、radius 为半径,查找范围内的元素
    可以指定半径的单位 unit

    • m:米,默认单位
    • km:千米
    • mi:英里
    • ft:英尺


    §13 其他指令

    查看配置
    config get xx

    config get dir 查看当前启动目录,一些文件会输出到这些目录上
    config get requirepass 查看当前的密码

    修改配置
    config set config value

    手动持久化
    rdb
    save

  • 相关阅读:
    Navicat平替工具,一款免费开源的通用数据库工具
    使用git命令修改分支名称
    IllusionDiffusion:OpenAI 推出的图像生成新工具
    grafana接入OpenTSDB设置大盘语法
    港陆证券:电子竞技传来重磅消息!概念股上半年业绩普增
    mybatis学习(4) - SpringBoot中整合mybatis
    8. 基于消影点进行相机内参(主点)的标定
    滴滴线下仿真环境实践:从方案设计到持续运营
    0 至 10 之间,10以内的儿童数学题 生成工具 代码段 JavaScript
    关于toString()方法
  • 原文地址:https://blog.csdn.net/ZEUS00456/article/details/126686281