大家好,我是指北君。
Redis 作为一个内存数据库已经被许许多多的公司使用,它的性能非常的优秀,读写速度支持非常快而且支持 10W 的 QPS 。今天我们就来学习下它的丰富的数据类型。
Redis 数据类型
Redis支持五种数据类型:string(字符串),hash(哈希),list(列表),set(集合)及zset(有序集合)。
string(字符串)
字符串类型是Redis的最基本数据结构。 字符串类型的值实际可以为字符串,数字,二进制,但是值最大不能超过512M。
key | value |
---|---|
hello | world |
counter | 1 |
bits | 10000100 |
json | {“id”:1,”name”:”xiaocai”,”age”:18} |
string命令
设置
set key value [EX seconds] [PX milliseconds] [NX | XX] |
get key
1 |
|
过期
setex key seconds value
1 |
|
不存在才能设置成功或者必须存在才能设置成功
1 |
|
批量设置
1 |
|
计数
incr key
incrby key increment
1 |
|
删除
del key [key …]
1 |
|
内部编码
- int 8个字节的长整型
- embstr 小于等于39个字节的字符串
- raw 大于39个字节的字符串
1 |
|
list(列表)
list类型是用来存储多个有序的字符串。每列字符串称之为元素。一个list的最大存储为2^32-1个元素。可以对列表进行双端插入和弹出,也可以指定索引下标获取元素。
list命令
头部和尾部添加元素
lpush key value [value …]
rpush key value [value …]
lrange key start stop
1 |
|
头部和尾部弹出元素
lpop key
rpop key
1 |
|
索引操作 索引需要对全部list进行遍历,性能会随着元素个数的增大而变差
lrange key start stop
lindex key index
ltrim key start stop
len key
1 |
|
插入
insert key BEFORE | AFTER pivot value |
1 |
|
修改
set key index value
1 |
|
内部编码
- ziplist(压缩列表):小于3.2版本,当元素个数小于list-max-ziplist-entries配置(默认512个),同时每个元素的值长度都小于list-max-ziplist-value配置(默认64字节)
- linkedlist(链表):小于3.2版本,不满足ziplist的条件
- quicklist:Redis 3.2版本,以一个ziplist为节点的linkedlist
1 |
|
hash (哈希)
hash是一个string类型的field和value的映射表。 它适合用于存储对象,它是无序的,不能使用索引操作。
hash命令
设置
hset key field value
1 |
|
获取和获取所有的field-value
hget key field
hgetall key
1 |
|
删除
hdel key field [field …]
1 |
|
长度
hlen key
1 |
|
批量设置
hmset key field value [field value …]
1 |
|
是否存在
hexists key field
1 |
|
所有的field和所有的value
hkeys key
hvals key
1 |
|
内部编码
- ziplist(压缩列表):当元素个数小于hash-max-ziplist-entries配置(默认512个)和每个元素大小小于hash-max-ziplist-value配置(默认64字节)时
- hashtable(哈希表):不满足ziplist条件时
1 |
|
修改配置文件hash-max-ziplist-entries为5
1 |
|
set(集合)
用来保存多个字符串元素,无序的,不能有重复元素,不能使用索引下标获取元素。一个集合可以存储2^32-1个元素。
set命令
增加
add key member [member …]
1 |
|
删除
srem key member [member …]
1 |
|
个数
scard key
1 |
|
是否存在
sismember key member
1 |
|
随机返回指定个数
srandmember key [count]
1 |
|
随机弹出
spop key [count]
1 |
|
所有个数
smembers key
1 |
|
交集
sinter key [key …]
1 |
|
并集
sunion key [key …]
1 |
|
差集
sdiff key [key …]
1 |
|
内部编码
- intset(整数集合):元素都是整数和元素个数小于set-max-intset-entries配置(默认512个)时
- hashtable(哈希表):不满足intset时
1 |
|
zset(有序集合)
zset保证了元素不能重复,每个元素都有一个分数(score)作为排序的依据。
zset命令
添加
zadd key [NX | XX] [CH] [INCR] score member [score member …] |
1 |
|
个数
zcard key
1 |
|
升序返回范围的成员
zrange key start stop [WITHSCORES]
1 |
|
升序返回成员时带上分数
1 |
|
- 精度问题:内部 score 使用 double 类型进行存储,所以存在小数点精度问题
- withscores:带上分数
降序
zrevrange key start stop [WITHSCORES]
1 |
|
指定value的score
zscore key member
1 |
|
根据score的数值区间升序
zrangebyscore key min max [WITHSCORES] [LIMIT offset count]
1 |
|
根据score的数值区间降序
zrevrangebyscore key max min [WITHSCORES] [LIMIT offset count]
1 |
|
根据score的数值降序输出所有元素
1 |
|
- +inf 正无穷
- -inf 负无穷
删除
zrem key member [member …]
1 |
|
增加分数
zincrby key increment member
1 |
|
交集
zinterstore destination numkeys key [key …] [WEIGHTS weight] [AGGREGATE
1 |
|
并集
zunionstore destination numkeys key [key …] [WEIGHTS weight] [AGGREGATE
1 |
|
内部编码
- ziplist(压缩列表):元素个数小于zset-max-ziplist-entries配置(默认128个)和元素长度小于zset-max-ziplist-value配置(默认64B)时
- skiplist(跳跃表):不满足ziplist时
1 |
|
总结
这篇文章主要是学会基础的 Redis 数据类型和基本的 API 以及每个数据类型背后的原理。