Redis的数据类型全面总结

前面总结了Redis常见数据结构:Redis-数据结构,接下来总结一下Redis的数据类型

借鉴文章:小林coding

数据类型是基于数据结构实现,每一种数据类型底层对应一种数据结构,也有数据类型可由多个数据结构实现

Redis主要有以下的数据类型:

  • String字符串,Hash表,List集合,Set集合,Zset有序集合,BitMap(2.2版本),HyperLogLog(2.8版本新增),GEO(3.2版本新增),Stream(5.0版本新增)

                  目录

一、String字符串

二、List

三、Hash

四、Set

五、Zset

六、BitMap

七、HyperLogLog

八、GEO

九、Stream

Redis底层结构:dictEntry[]数组保存Redis键值对key-value结构,key-value都指向redisObject,redisObiject包含三个字段:对象类型,底层数据结构,指向底层数据结构的指针

一、String字符串

String字符串是指Redis的key-value结构中value保存形式为String字符串或整数浮点数。value最多可容纳的数据长度是512M

value保存的是整数时,编码方式被设置为int,底层数据结构变成long指向具体数据

value保存的是字符串时:

  • 字符串长度小于等于32字节,编码方式设置为embstr,底层数据结构指向SDS,分配一块连续内存空间保存redisObject和SDS,但若字符串长度变化则需分配新内存造成效率下降

  • 字符串长度大于32字节,编码方式设置为raw,底层数据结构指向SDS,redisObject和SDS内存不连续

String字符串常用命令:

SET key value
MSET key1 value1 key2 value2:批量插入
GET key
MGET key1 key2:批量获取
EXISTS key:判断该key是否存在
STRLEN key:返回该key对应value字符串的长度
DEL key:删除该key对应value
INCR key:将该key对应整数value值加一(可实现访问量,点赞量等统计功能,redis是单线程所以操作都是原子操作)
DECR key:将该key对应整数value值减一
INCRBY key 10:将该key对应整数value值加10
DECRBY key 10:将该key对应整数value值减10
EXPIRE key 60:设置该key对应key-value在60s后过期
TTL key:查看该key对应key-value过期时间
SETNX key 60 value/SET key value NX 60:插入key-value并设置过期时间
SETNX key value:当该key不存在时则插入该key-value (可实现Redis分布式锁,成功插入则获取锁成功,反之则反)

二、List

List的底层由压缩列表或双向链表实现:

  • 当数据个数小于512个,数据每个值都小于64字节时,List采用压缩列表数据结构实现,反之则采用双向链表实现

3.2版本后,List底层只由quicklist数据结构实现

List常用命令:

LPUSH / RPUSH key value:将value从左 / 右插入链表key中
LPOP / RPOP key:从左 / 右返回并移除链表key 中一个数据
BLPOP / BRPOP key:从左 / 右返回并移除链表key 中一个数据,若无数据则阻塞(可实现消息队列,有消息则处理,无消息则阻塞;添加备用List可对数据进行备份)
LRANGE key:返回链表key中指定区间的数据

三、Hash

Hash的底层由压缩列表或哈希表实现:

  • 当数据个数小于512个,数据每个值都小于64字节时,Hash采用压缩列表数据结构实现,反之则采用哈希表实现

7.0版本后,压缩列表舍弃,由listpack数据结构实现

Hash常用命令:

HSET key key1 value1 / HMSET key key1 value1 key2 value2:将一个/多个键值对存入Hash表key中
HGET key key1 / HMGET key key1 key2:获取Hash表key中一个/多个键值对
HDEL key key1 key2:删除Hash表key中的键值对
HLEN key:获取Hash表key的长度
HGETALL key:获取Hash表key中所有键值对
HINCRBY key key1 number:给Hash表key的key1键对应值增加增量number
  • Hash表适合存储Java对象,便于对对象每一个值进行处理
  • Hash表可实现购物车功能,以用户ID为hash表key值可分离不同用户的购物车信息,再以商品ID作为Hash表key的键,数量作为Hash表key的值,即可对每件商品数量进行记录

四、Set

Set是一个无序数据唯一的元素集合,每个key对应的value集合最多可存储2^32-1个数据

Set的底层由整数集合或哈希表实现

  • 当Set集合中数据全为整数且数据个数小于512个时,Set集合采用整数集合数据结构实现,反之采用哈希表数据结构实现

Set集合常用命令:

SADD key value:向Set集合key中添加value值
SREM key value:从Set集合key中删除value值
SMEMBERS key:获取Set集合key中所有value值
SCARD key:获取Set集合key中value数据个数
SISMEMBER key value:判断Set集合key中是否存在value值
SRANDMEMBER key count:从Set集合中随机选取count个value值,不删除元素
SPOP key count:从Set集合随机选取count个value值,并删除元素

SINTER key1 key2 key3 / SINTERSTORE key key1 key2 key3:计算key1,key2,key3集合的交集/并将结果存储到新集合key中
SUNION key1 key2 key3 / SUNIONSTORE key key1 key2 key3:计算key1,key2,key3集合的并集/并将结果存储到新集合key中
SDIFF key1 key2 key3 / SDIFFSTORE key key1 key2 key3:计算key1,key2,key3集合的差集/并将结果存储到新集合key中
  • Set集合适合存储元素无序且需要去重的数据
  • Set集合可实现用户点赞功能,key保存文章的ID,value保存用户ID,可实现一个用户对一个文章只能一次点赞,并且可获取文章点赞的用户信息
  • Set集合支持交集运算,则可以实现多个用户共同关注功能,key存储用户ID,value存储该用户关注的用户ID
  • Set具有去重功能,可实现一个奖项的中奖人不重复的抽奖活动,从集合中随机抽取对应数量的用户

五、Zset

Zset在Set集合基础上增加了可排序功能,Zset集合的key-value结构中,value存储具体数据及一个排序值

Zset的底层由压缩列表或跳表实现

  • 当Zset集合数据个数小于128个,且每个数据的内存小于64字节,Zset使用压缩列表数据结构实现,反之使用跳表数据结构实现

7.0版本后,压缩列表舍弃,由listpack实现

Zset集合常用命令:

ZADD key number value:向Zset集合key中添加value值和对应排序值
ZREM key value:删除Zset集合key中value值
ZSCORE key value:获取Zset集合key中value对应排序值
ZCARD key:获取Zset集合中value值个数
ZINCRBY key increment value:将Zset集合key中value对应排序值增加increment
ZRANGE key start stop / ZREVRANGE key start stop:正序/逆序获取Zset集合key中下标start到stop的value值
ZRANGEBYSCORE key min max:获取Zset集合key中排序值在min到max区间的value值
ZRANGEBYLEX key min max
ZREVRANGEBYLEX key max min

ZUNIONSTORE destkey numberkeys key1 key2
ZINTERSTORE destkey numberkeys key1 key2
  • Zset具有排序功能,适合存储需要去重且排序的数据
  • 可实现点赞排行榜功能,排序值存储点赞数量,value值存储文章ID

六、BitMap

BitMap (位图) 是一串以bit为单位的二进制数组

BitMap底层由String类型实现,String类型保存二进制的字节数组,相当于一个bit数组,每一个bit位只能存储0或1,用来表示两个不同的状态,其定义了一个偏移量offset用来定位bit位

BitMap常用命令:

SETBIT key offset value:向BitMap位图key中的offset偏移量位置设置value值
GETBIT key offset:获取BitMap位图中的offset偏移量位置的value值
BITCOUNT key start end:获取BitMap位图key中start到end范围内为1的偏移量个数

BITOP AND/OR/XOR/NOT result key1 key2 key3:对BitMap位图进行与运算/或运算/异或/取反
BITPOS key value:返回BitMap位图key中第一次出现指定value值的偏移量位置
  • BitMap为bit数组,适合存储需要统计的数据
  • BitMap位图可实现签到统计功能,value表示一个月的签到情况,每一个bit位对应每一天的签到情况
  • BitMap位图可实现用户登录统计功能,登录则用1表示,使用BITCOUNT方法统计对应时间内用户的登录次数
  • BitMap位图可实现用户连续签到统计功能,签到则用1表示,使用与运算若结果为1则表示连续签到

七、HyperLogLog

HyperLogLog用于统计去重的基数,基于概率完成的统计不精确

HyperLogLog常用命令:

PFADD key value:向HyperLogLog key中添加value数据
PFCOUNT key:获取HyperLogLog key中的技术统计数
PFMERGE destkey key1 key2:将多个HyperLogLog合并为一个HyperLogLog
  • 在数据特别大的情况下,HyperLogLog计算基数所需的内存空间总是固定较小的,HyperLogLog只需用12KB内存即可计算2^64左右个不同元素的基数
  • HyperLogLog可实现大量UV统计

八、GEO

GEO类型使用GeoHash编码方法实现了经纬度到Sorted Set中元素权重分数的转换,将地图划分为无数区间,每个区间有不同的编码,用区间编码来表示不同区间的经纬度

GEO常用命令:

GEOADD key longitude latitude member:将经度(longitude)、维度(latitude)、位置名称(member)添加到GEO key中
GEOPOS key member:获取GEO key中的指定位置名称对应的经度和维度,不存在则返回nil
GEODIST key member1 member2:返回GEO key中两个指定位置名称之间的距离
GEORADIUS key longitude latitude radius
  • GEO可存储相对位置,可实现显示附近商家功能

九、Stream

Stream是Redis专门为消息队列设计的数据类型,Stream解决了List链表消息队列消息不能重复消费的缺点

Stream实现的消息队列支持消息持久化,支持全局唯一ID的生成,支持ACK确认消息的模式,支持消费组模式等

Stream常用命令:

XADD:插入消息,保证有序,可以自动生成全局唯一ID
XLEN:查询消息长度
XREAD:用于读取消息,可以按ID读取数据
XDEL:根据消息ID删除消息
DEL:删除整个Stream
XRANGE:读取区间消息
XREADGROUP:按消费组形式读取消息
XPENDING:命令可以用来查询每个消费组内所有消费者「已读取、但尚未确认」的消息
XACK:命令用于向消息队列确认消息处理已完成
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值