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 count 从offset 开始取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) |