Redis十大数据类型

类型

这里的类型是Value,Key一般都是String

  • Strings
  • Lists
  • Sets
  • Sorted Sets (ZSET)
  • Hashes
  • Streams
  • Geospatial
  • HyperLogLog
  • Bitmaps
  • Bitfields

String 字符串

  • Redis中最基本的类型,一个Key可以对应一个Value
  • 二进制安全的(可以包含任何数据,比如图片或者序列化的对象)
  • 一个Redis中的字符串value最多可以是512M

List 列表

  • 简单的字符串列表,按照被插入的顺序排序,你可以添加一个元素到列表的头部(左边)或者尾部(右边)
  • 底层是个双端链表,最多可以包含2^32-1个元素(4294967295,超过40亿个元素)
  • 对两端操作性能很高,通过索引下标操作中间节点性能会比较差

Set 集合

  • String类型的集合
  • 不允许重复 + 无序
  • 集合对象的编码可以是intset和hashtable(底层)
  • 通过哈希表实现的,所以查询、删除、添加的时间复杂度都是O(1)
  • 可以包含2^32-1个元素(4294967295,超过40亿个元素)
  • 应用场景
    • 微信抽奖小程序(sadd/spop/srandmember)
    • 朋友圈的点赞
    • QQ可能认识的人

Sorted Set /ZSet 有序集合

  • 与Set一样是String类型的集合
  • 不同的是每个元素都会关联一个double类型的分数(给Redis从小到大排序用的)
    • value变成了一个键值对:score1 value1
    • key1 score1 value1 key2 score2 value2
  • ZSet的成员是唯一的,但分数(score)可以重复
  • 通过哈希表实现的,所以查询、删除、添加的时间复杂度都是O(1)
  • 可以包含2^32-1个元素(4294967295,超过40亿个元素)
  • 应用场景
    • 各种排行榜

Hash 哈希表

  • K-V 键值对
  • 可以包含2^32-1个元素(4294967295,超过40亿个元素)

GEO 地理空间

  • 原理(实际上是个ZSet,score变成了经纬度)
    • 核心思想:将球体转换为平面,区块转换为一点
    • 主要分为3步:
      • 将三维地球变为二维坐标
      • 将二维坐标转换为一维的点块
      • 将一维的点块转换为二进制再通过base32编码
  • 主要用于存储地理位置信息,并对存储的信息进行操作,包括
    • 添加地理位置的坐标
    • 获取地理位置的坐标
    • 计算两个位置之间的距离
    • ……
  • 应用场景
    • 美团地图位置附近的酒店
    • 高德地图附近的核酸点

HyperLogLog 基数统计

  • 用完做基数统计的算法
    • 基数:是一种数据集,去重后的真实个数
    • 基数统计:用于统计一个几乎中不重复的元素的个数,就是对集合去重后剩余元素的计算,即去重脱水后的真实数据
  • 优点是在输入元素的数量或者体积特别大时,计算基数所需的空间总是固定且很小的
    • 每个HyperLogLog键只需要12kb内存,就可以计算出接近2^64个不同的元素的基数
    • 这和元素越多耗费内存越多的集合产生了鲜明的对比
  • 但HyperLogLog并不会记录每个元素的具体值
  • 可用于统计某个网站/文章的UV、用户搜索🔍关键词的数量、用户每天搜索不同词条的个数
    • UV unique visitor 独立访客(一般为用户IP)

Bitmap 位图

  • Bit arrays(or simply bitmaps)Bitmap是用String作为底层数据结构实现的一种统计二值状态的数据类型
  • 一个字节占8位(1 byte = 8 bit)
  • 由0和1组成的二进制位的bit数组(1 bit 只能存1个0/1)
  • 一般用于状态记录📝
    • 用户是否登陆过
    • 电影广告是否被点击播放过
    • 上下班打卡统计

BitField 位域

  • 可以一次性操作多个比特位域(连续的多个比特位),它会执行一系列操作并返回一个响应数组,这个数组中的元素对应参数列表中的相应操作的执行结果(其实就是一次性对多个比特位进行操作)

Stream 流

  • Redis 5.0 新增的数据结构 : MQ消息中间件+阻塞队列
  • 主要用于消息队列(MQ,Message Queue)
    • 支持消息队列的持久化
    • 支持自动生成全局唯一ID
    • 支持ack确认消息的模式
    • 支持消费组(多个消费者)模式等
  • Redis本身有一个发布/订阅来实现消息队列的功能,但他的缺点是消息无法持久化,如果出现网络断开、Redis宕机等,消息就会被丢弃
    • 即发布/订阅可以分发消息,但无法记录历史消息
  • Redis的Stream提供了消息的持久化以及主从备份复制功能,可以让任何客户端访问任何时刻的数据,并且能记住每一个客户端的访问位置,还能保证消息不丢失,让消息队列更加稳定和可靠

常用命令

key 操作指令

指令 作用 备注
key * 查看当前库所有key
exists key 判断某个key是否存在
type key 查看某个key的类型
del key 删除指定的key 原子的
unlink key 非阻塞删除(仅将key从keyspace元数据中移除)
ttl key 查看还有多少秒过期(-1表示永不过期,-2表示已过期)
expire key 秒钟 为给定的key设置过期时间
move key dbindex 将当前数据库的key移动到给定的数据库db中(dbindex的值为0-15) 默认0
dbsize 查看当前数据库key的数量
flushdb 清空当前库
flushall 清空全部库

String 操作指令

指令 作用 可选项说明及备注
set key value [NX XX] [GET][EX seconds PX milliseconds EXAT unit-time-milliseconds
批处理 mset key value [key value …] 同时设置多个值
mget key value [key value …] 同时获取多个值
msetnx key value key不存在才设置 所有的key都不存在才会设置成功
getrange key start end 获取指定区域内的值 start 开始下标(从0开始)end 结束下标
setrange key offset vaue 设置指定区域内的值 offset 开始下标vaue 设置数量
数值增减(必须是数字才行) INCR key 递增数字
INCRBY key increment 增加减少指定的参数 increment 指步长
DECR key 递减数值
DECRBY key decrement 减少指定的参数
STRLEN key 获取字符串长度
APPENG key value 内容追加
分布式锁(原子操作) setnx key value key不存在才设置 nx: set if not exsit
setex key seconds value 同时设置值和过期时间 ex: set with expire
getset key value 先get后set 等价于 set key value get

List 操作指令

指令 作用 可选项说明及备注
lpush key value 从左边👈设置/添加
rpush key value 从右边👉设置/添加
lrange key start stop 从左边👈开始遍历 start 开始下标(从0开始)stop 结束下标lrange key 0 -1 表示遍历全部
lpop 弹出最左边的值
rpop 弹出最右边的值
lindex 按照索引下标获得元素(从上到下) 左(上)右(下)
llen 获取list中的元素个数
lrem key N value 删除N值为value的元素 N 表示删除值的个数
ltrim key start stop 截取指定索引范围的值再赋值给key start 开始下标(从0开始)stop 结束下标
rpoplpush key1 key2 从key1中弹出最右边的,加入到key2的最左端并返回
lset key index value 将key中序号为index的值设置为value index 要设置的值的序号(没有该序号则会报错)
linsert key before/after pivot element 在key中值为pivot的元素前/后插入值为element的元素 pivot 已有值element 插入值从上向向下👇第一个等于pivot的值

Set 操作指令

指令 作用 可选项说明及备注
sadd key member [member…] 添加元素 自动去重
smembers key 遍历所有元素
sismember key member 判断元素是否在集合中
srem key member[member…] 删除元素
scard key 获取集合里面的元素个数
srandmember key [n] 从集合中随机展现n个元素,不删除 n 展示元素的个数
spop key [n] 从集合中随机弹出/删除n个元素 n 弹出/删除元素的个数
smove key1 key2 [value] 将key1中的某个值value赋值给key2 value:key1中的某个值
集合运算 sdiff key [key…] 差集运算 A - B
sunion key [key…] 并运算 A U B
sinter key [key…] 交运算 A n B
sintercard numkeys key [key…] [limit num] 只返回基数(去重统计数) num 返回个数

ZSet 操作指令

指令 作用 可选项说明及备注
zadd key [NX XX] [GT LT] [CH] [INCR] score member [score member …]
zrange key start stop [withscores] 按照元素分数从小到大的顺序,返回索引从start到stop之间的所有元素 withscores 带分数start 开始下标(从0开始)stop 结束下标
zrevrange key start stop [withscores] zrange的反转(从大到小) withscores 带分数start 开始下标(从0开始)stop 结束下标
zrangebyscore key min max [withscores][limit offset count] 获取指定分数范围的元素 (min 不包含limit offset countoffset开始取count
zscore key member 获取元素的分数
zcard key 获取集合中元素的数量
zrem key member 删除值为指定分数的元素 member 要删除元素的value值
zincrby key increment member 增加某个元素的分数 increment 增加的值
zcount key min max 获取指定分数范围内的元素个数 min 开始max 结束
zmpop 从键名列表中的第一个非空排序集中弹出一个或多个元素,他们是成员分数对
zrank key values 获取下标值(从0开始)
zrevrank key values 逆序获取下标值

Hash操作指令

指令 作用 可选项说明及备注
hset key field value [field value…] 添加/设置 field value 也是某个元素内的属性键值对
hget key field 获取键为key的元素中的field属性的值
批处理 hmset key field value [field value…] 批量添加/设置
hget key field [field …] 批量获取
hgetall key 获取键为key的元素中的全部属性
hlen key 获取某个key内的全部数量
hexists key 判断是否存在键值为key值(0不存在)
hkeys key 获取键值为key值元素的所有字段名(field
hvals key 获取键值为key值元素的所有字段值(value
hincrby/hincrbyfloat key field increment 给键值为key值元素中field的字段值加increment hincrby 加整数hincrbyfloat 加小数
hsetnx key field value [field value…] 不存在才会新建成功

GEO 操作指令

指令 作用 可选项说明及备注
geoadd key 添加经纬度坐标 出现中文乱码,redis-cli启动时加个--raw
geopos 从键里面返回所有给定元素的位置(经纬度)
geodist key member1 member2 [m km ft
georadius key longitude latitude radius `m km ft
georadiusbymember key member radius `m km ft
geohash 返回坐标的geohash表示 geohash算法生成的base32编码值

HyperLogLog 操作指令

指令 作用 可选项说明及备注
pfadd key element [element]… 添加指定的元素
pfcount key [key …] 返回给定的基数估计值
pfmerge destkey sourcekey [sourcekey…] 合并统计

Bitmap 操作指令

指令 作用 可选项说明及备注 时间复杂度
setbit key offset value 为键为key的元素序号为offset的值设置值为value offset 偏移量(从0开始)value O(1)
getbit key offset 获取指定key的第offset O(1)
strlen key 统计字节数占用多少(按字节) O(1)
bitcount key start end 返回指定范围[start, end]内值为1的数量 start 开始序号end 结束序号 O(n)
bitop operation destkey key 对不同的二进制存储数据进行位运算(AND、OR、NOT、XOR) operation 包括AND、OR、NOT、XORdestkey 新产生的值的key O(n)