Redis 是一个键值对数据库(key-value DB),数据库的值可以是字符串,散列表,列表,集合,有序集合,而数据库的键则总是字符串对象。
String类型
字符串是Redis中最基本的数据类型,它能够存储任何类型的字符串,包含二进制数据,并且是二进制安全的。所谓二进制安全就是输入任何字节都能正确处理, 即使包含零值字节(‘\0’)。
如果有一种使用空字符来分割多个单词的特殊数据格式,如图所示,那么这种格式就不能使用C字符串来保存
对于上图,sds认为这个字符串是“hello world”,而C语言的字符处理函数就会把空格当作结束标志,认为这个字符串是“hello”。
正因为String类型是二进制安全的,所以才可以用于存储邮箱,JSON化的对象,甚至是一张图片,一个字符串允许存储的最大容量为512MB。字符串是其他四种类型的基础,与其他几种类型的区别从本质上来说只是组织字符串的方式不同而已。
命令
set key value : 设置 key 对应 string 类型的值, 返回 1 表示成功, 0 失败。(说明,设置key多次会覆盖)
setnx(not exist) key value: 如果 key 不存在进行设置,存在就不需要进行设置了,返回0
set key value ex time: 设置值的同时设置过期时间
get key: 获取 key 对应的 string 值,如果 key 不存在返回 nil(在redis中nil代表为空)
getset key value : 先获取 key 的值,再设置 key 的值。
mget key1 key2 … keyN : 一次获取多个 key 的值
mset key1 value1 … : 一次设置多个 key 的值, 成功返回 1 表示所有的值都设置了,失败返回 0 表示没有任何值被设置。
msetnx key1 value1 … : 一次设置多个 key 的值,但是不会覆盖已经存在的 key
incr key: 递增,注意 incr 一个不是 int 的 value 会返回错误,incr 一个不在的 key,则设置 key 值为 1。
decr key : 递减, decr 一个不存在 key,则设置 key 值为-1。
incrby key integer: 对 key 加上指定值 , key 不存在设置 key,并认为原来的 value是 0。
decrby key integer: 对 key 减去指定值。decrby 完全是为了可读性,我们完全可以通过 incrby一个负值来实现同样效果,反之一样。
append[key]方法: 字符串追加方法
strien[key]方法: 获取字符串的长度
setrange key 10 value:(10表示从第几位开始替换,后面跟上替换的字符串)
应用场景
适合计数场景:
- 分布式Session
- 分布式ID
- 分布式锁
- 点赞数 评论数 转发数
- 软限流
- 短信验证次数、库存数量
Hash类型
Hash类型是String类型的field和value的映射表,或者说一个String集合。它它特别适合存储对象相比较而言,将一个对象类型存储在Hash类型里要比存储在String类型里占用更少的内存空间并方便存取整个对象
命令
hset key field value: 设置 hash field 为指定值,如果 key 不存在,则创建
hget key field : 获取指定的 hash field。
hmget key filed1…fieldN : 获取全部指定的 hash filed。
hmset key filed1 value1 … filedN valueN : 同时设置 hash 的多个 field。
hincrby key field integer: 指定步长增加。成功返回 hash filed 变更后的值。
hexists key field : 检测指定 field 是否存在。
hdel key field: 删除指定的 hash field。
hlen key: 返回指定 hash 的 field 数量。
hkeys key: 返回 hash 的所有 field。
hvals key : 返回 hash 的所有 value。
hgetall : 返回 hash 的所有 filed 和 value
应用场景
用一个对象来存储用户信息,商品信息,订单信息等等。
缓存对象类型的数据
统计类型的数据
购物车 (但是不会做)因为购物车数据比较重要
List类型
list类型是一个链表结构的集合,其主要功能有push,pop,获取元素等。更详细的说,list类型是一个双端链表的结构,我们可以通过相关操纵进行集合的头部或尾部添加删除元素,list的设计简单精巧,既可以作为栈,又可以作为队列,满足绝大多数需求。
命令
lpush方法:从头部加入元素(栈)先进后出
lpush key string: 在 key 对应 list 的头部添加字符串元素,返回 1 表示成功, 0 表示 key 存在且不是 list 类型。
rpush方法:从尾部加入元素(队列)先进先出
rpush key string: 在 key 对应 list 的尾部添加字符串元素
len key: 返回 key 对应 list 的长度, 如果 key 不存在返回 0
lrange key start end: 返回指定区间内的元素, 下标从 0 开始, 负值表示从后面计算, -1 表示倒数第一个元素 , key 不存在返回空列表。
ltrim key start end : 截取 list 指定区间内元素,成功返回 1, key 不存在返回错误。
lset key index value: 设置 list 中指定下标的元素值,成功返回 1, key 或者下标不存在返回错误。
lrem key count value : 从 List 的头部(count 正数)或尾部(count 负数)删除一定数量(count)匹配 value 的元素,返回删除的元素数量。count 为 0 时候删除全部。
lpop key: 从 list 的头部删除并返回删除元素。
rpop key: 从 list 的尾部删除并返回删除元素
rpoplpush: 第一步从尾部删除元素,然后第二步并从头部加入元素
lindex: 返回名称为key的list中index位置的元素
应用场景
rpush方法就相当于将消息放入到队列中,lpop/rpop就相当于从队列中拿去消息进行消费。
所有的有序列表 都适合时间线的列表
- 朋友圈 最新消息排行
- 好友列表,粉丝列表
- 消息队列,但是不建议做,因为有专业的MQ组件,Kafka,RabbitMq,RocketMQ, 它们都有ACK机制,而Redis不能确认消息是否收到。Redis属于ACP模型中的AP模型,它优先保证数据的高可用,不能保证数据的不丢失。
set集合
set集合是string类型的无序集合,不允许重复元素,set是通过hashtable实现的,对集合我们可以取交集,并集,差集。
命令
add key member: 添加一个 string 元素到 key 对应 set 集合中,成功返回 1,如果元素以及在集合中则返回 0, key 对应的 set 不存在则返回错误。
srem key member: 从 key 对应 set 中移除指定元素,成功返回 1,如果 member 在集合中不存在或者 key 不存在返回 0,如果 key 对应的不是 set 类型的值返回错误。
spop key : 删除并返回 key 对应 set 中随机的一个元素,如果 set 是空或者 key 不存在返回nil。
srandmember key: 随机取 set 中的一个元素,但是不删除元素。
smove srckey dstkey member: 从 srckey 对应 set 中移除 member 并添加到 dstkey 对应 set 中,整个操作是原子的。 成功返回 1,如果 member 在 srckey 中不存在返回 0, 如果 key 不是 set类型返回错误。相当于剪切复制
scard key: 返回 set 的元素个数,如果 set 是空或者 key 不存在返回 0。
sismember key member: 判断 member 是否在 set 中,存在返回 1, 0 表示不存在或者 key 不存在。
sinter key1 key2 …… keyN : 返回所有给定 key 的交集。
sinterstore dstkey key1 … keyN : 返回所有给定 key 的交集, 并保存交集存到 dstkey 下。
sunion key1 key2 … keyN: 返回所有给定 key 的并集。
sunionstore dstkey key1 … keyN: 返回所有给定 key 的并集, 并保存并集到 dstkey
sdiff key1 key2 … keyN: 返回所有给定 key 的差集。
sdiffstore dstkey key1 … keyN: 返回所有给定 key 的差集,并保存差集到 dstkey
smembers key: 返回 key 对应 set 的所有元素,结果是无序的
应用场景
- 抽奖。 Set 类型因为有去重功能,可以保证同一个用户不会中奖两次。 如果允许重复中奖,可以使用 SRANDMEMBER 命令。如果不允许重复中奖,可以使用 SPOP 命令。
- 点赞、签到等 sadd 集合存储
- 共同好友、共同兴趣、分类标签
sorted set 类型
sorted set 是有序集合, 它在 set 的基础上增加了一个顺序属性,这一属性在添加修改元素的时候可以指定, 每次指定后, 会自动重新按新的值调整顺序。 可以理解了有两列的mysql表,一列存 value,一列存顺序。操作中 key 理解为 sorted set 的名字
命令
zdd key score member: 添加元素到集合,元素在集合中存在则更新对应 score。
zrem key member: 删除指定元素, 1 表示成功,如果元素不存在返回 0。
zincrby key incr member : 增加对应 member 的 score 值, 然后移动元素并保持 skip list 保持有
序。返回更新后的 score 值。
zrank key member : 返回指定元素在集合中的排名(下标), 集合中元素是按 score 从小到大排序的。
zrevrank key member : 同上,但是集合中元素是按 score 从大到小排序。
zrange key start end : 类似 lrange 操作从集合中去指定区间的元素。返回的是有序结果
zrevrange key start end: 同上,返回结果是按 score 逆序的。
zrangebyscore key min max: 返回集合中 score 在给定区间的元素。
zcount key min max: 返回集合中 score 在给定区间的数量。
zcard key: 返回集合中元素个数。
zscore key element: 返回给定元素对应的 score
应用场景
排行榜
这个排行榜一般在公司的使用是在任何排行的地方都可以用到,像销售榜、热搜榜、游戏评分学生成绩的排名榜、视频播放排名等等
BitMap
Bitmap,即位图,是一串连续的二进制数组(0和1),可以通过偏移量(offset)定位元素。BitMap通过最小的单位bit来进行0|1的设置,表示某个元素的值或者状态,时间复杂度为O(1)。
由于 bit 是计算机中最小的单位,使用它进行储存将非常节省空间,特别适合一些数据量大且使用二值统计的场景。
常用命令
#设置值,其中value只能是 0 和 1
SETBIT key offset value
#获取值
GETBIT key offset
#获取指定范围内值为 1 的个数
#start 和 end 以字节为单位
BITCOUNT key start end
bitmap 运算操作:
# BitMap间的运算
# operations 位移操作符,枚举值
AND 与运算 &
OR 或运算 |
XOR 异或 ^
NOT 取反 ~
# result 计算的结果,会存储在该key中
# key1 … keyn 参与运算的key,可以有多个,空格分割,not运算只能一个key
# 当 BITOP 处理不同长度的字符串时,较短的那个字符串所缺少的部分会被看作 0。返回值是保存到 destkey 的字符串的长度(以字节byte为单位),和输入 key 中最长的字符串长度相等。
BITOP [operations] [result] [key1] [keyn…]
# 返回指定key中第一次出现指定value(0/1)的位置
BITPOS [key] [value]
应用场景
Bitmap 类型非常适合二值状态统计的场景,这里的二值状态就是指集合元素的取值就只有 0 和 1 两种,在记录海量数据时,Bitmap 能够有效地节省内存空间
签到统计
在签到打卡的场景中,我们只用记录签到(1)或未签到(0),所以它就是非常典型的二值状态。
签到统计时,每个用户一天的签到用 1 个 bit 位就能表示,一个月(假设是 31 天)的签到情况用 31 个 bit 位就可以,而一年的签到也只需要用 365 个 bit 位,根本不用太复杂的集合类型。
判断用户登陆态
Bitmap 提供了 GETBIT、SETBIT 操作,通过一个偏移值 offset 对 bit 数组的 offset 位置的 bit 位进行读写操作,需要注意的是 offset 从 0 开始。
只需要一个 key = login_status 表示存储用户登陆状态集合数据, 将用户 ID 作为 offset,在线就设置为 1,下线设置 0。通过 GETBIT判断对应的用户是否在线。 5000 万用户只需要 6 MB 的空间。
连续签到用户总数
布隆过滤器
通用命令
- keys * : 查询所有的键
- type key : 获取键对应的value的类型
- del key:删除指定的key value
- expire key second:设置key的过期时间
- ttl key:查看key的有效期5.Ttl key:查看key的有效期, ttl key值为-1,意思为持久保存,值为-2,意思是不存在/已经删掉了
- persist key:清除key的过期时间。Key持久化。
参考《redis中文入门手册》