前面总结了Redis常见数据结构:Redis-数据结构,接下来总结一下Redis的数据类型
借鉴文章:小林coding
数据类型是基于数据结构实现,每一种数据类型底层对应一种数据结构,也有数据类型可由多个数据结构实现
Redis主要有以下的数据类型:
- String字符串,Hash表,List集合,Set集合,Zset有序集合,BitMap(2.2版本),HyperLogLog(2.8版本新增),GEO(3.2版本新增),Stream(5.0版本新增)
目录
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:命令用于向消息队列确认消息处理已完成