中间件 | 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<Char>
    动态字符串类似 ArrayList,通过分配冗余空间的方式防止频繁分配内存空间
  • SDS 特性
    • 二进制安全:只讲值按原始的二进制数据进行保存,因此可以用于存储二进制数据,如图片、音频等
    • 拼接 API 安全:不会因拼接导致缓冲区溢出,因为会在操作前校验长度
    • 获取长度时间复杂度 O(1):用 len 属性直接记录了长度(也是因为其二进制安全的特性导致的)
  • 扩容规则
    • < 1M 时,* 2
    • > 1M 时,+ 1M
  • 最大存储 512 M

不同版本实现
SDS 的通用结构如下,同时也是老版本的实现

struct sdshdr{
	int len;//已占用
	int free;//未占用
	chr buf[];
}

但当字符串很小时,会导致 len+free所占用的空间 >buf[] 占用的空间,浪费严重

3.2 版本后,对 SDS 数据结构按存储的字符串的长度不同做了优化,原则为根据 buf[] 长度大小使用不同的数据类型记录其已用、未用长度

  • 一共有 sdshdr5/8/16/32/64 共 5 种结构
  • 通用结构如下
    //sdshdr(x) 与属性的 uint(x) 相呼应
    struct __attribute__ ((__jpacked__)) sdshdr32{
    	uint32_t len;
    	uint32_t alloc;
    	unsigned char flags;
    	char buf[];
    }
    
  • 只有在 sdshdr5 时结构精简
    struct sdshdr5{
    	char flags;
    	char buf[];
    }
    
  • flags 虽然类型是 char 但其实是直接作为 8bit 使用的
    • 高 3 位作为 type:sdshdr 在新版本中有 5 个实现,需要标记当前是哪一种,需要 3bit
    • 低 5 位作为 len:仅在 sdshdr5 中使用,因为正好足够用于标识长度,其他实现中未使用

适用场景与应用

  • 常用于分布式锁、普通存取、点赞(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<key,Map<fieldd,value>>
    需要注意,Map<field,value> 的部分才是 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<key,Map<member,score>>
    • 跳跃表类似 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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值