基本信息
数据结构
Redis 存储的所有数据都是以唯一的 key 字符串作为名称,以及与之相应的 Value 数据;它有五种基础数据结构,分别为:string(字符串)、list(列表)、hash(字典)、set(合集)和 zset(有序合集)。
string
字符串是 Redis 最简单的数据结构,它的内部就是一个字符串数组;用途非常广泛,常见的如缓存用户信息
存储
Redis 的字符串是动态字符串,可以修改,采用预分配冗余空间的方式来减少内存的频繁分配;一般分配的空间会高于实际字符串长度(容量) len。
当字符串长度(容量)小于 1MB 时,扩容都是加倍现有的空间;如果长度(容量)超过 1MB,扩容时一次只会多扩 1MB 。
字符串最大长度(容量)为 512MB。
操作
#设置
set name junyu
#获取
get name
#校验
exists name
#删除
del name
#批量设置
mset name junyu age 30
#批量获取
mget name age
list
Redis 的列表是链表不是数组,意味着 list 的插入和删除操作非常快,时间复杂度为 O (1);但索引定位很慢,时间复杂度为 O (n)。
列表中的每一个元素都可以使用双向指针顺序,串起来可以同时支持向前或向后遍历;当列表弹出最后一个元素之后,该数据结构被自动删除,内存被回收。
Redis 的列表常用来做异步队列使用,将需要延后处理的任务结构体序列化成字符串,塞进 Redis 列表中,另一个线程从这个列表中轮询数据进行处理。
存储
- 队列:先进先出的数据结构,常用于消息队列异步逻辑处理,确保元素的访问顺序性
-
操作
#创建,入操作
rpush l A B C
#统计长度
llen
#出操作
lpop
#创建,入操作
rpush l A B C
#出操作
rpop
hash
Redis 的字典是无序字典,内部存储了很多键值对;都是 “数组 + 链表”的二维结构,采用了渐进式 rehash 的策略。
渐进式 rehash 会在 rehash 的同时,保留新旧两个 hash 结构,查询时会同时查询两个 hash 结构,然后在后续的定时任务或操作指令中,渐进的将旧的 Hash 内容一点点移动到新的 Hash 结构中。当移动完成,就会使用新的 hash 结构代替。存储
当 hash 移除最后一个元素之后,该数据结构会被自动删除,内存被回收。
hash 结构也可以用于存储用户信息,并且不需要序列化,可以直接对用户的每个字段单独存储。当我们需要获取用户信息时可以部分获取,而以字符串存储用户信息只能全部读取,这样会浪费网络流量。
hash 也有缺点,hash 结构的存储消耗要远高于单个字符串,到底该使用 hash 还是字符串,应该根据实际情况再三权衡。操作
hset
hlen
hget
set
Redis 的集合内部键值对是无序的,唯一的;相当于一个特殊的字典,字典中所有的 Value 值都是 NULL。
因为有去重功能,set 可以用来存储活动中奖的用户 ID,可以确保同一用户不会多次中将。存储
当集合中最后一个元素被移除后,数据结构被自动删除,内存被回收。
操作
#添加条目
sadd
#查看集合(无序)
smembers
#获取长度
scard
#出操作
spop
zset
zset 可能是 Redis 中提供的最具有特色的数据结构,叫“跳跃列表”;一方面它是一个 set 保证了内部 Value 唯一性,另一方面它可以给每一个内部 Value 赋予一个 score,代表这个 value 的排位权重。
存储粉丝列表,value 存粉丝 ID,score 为关注时间,按照关注时间进行排序
存储学生成绩,value 存学生 ID,score 为考试成绩,按照分数排名得到名次
存储
zset 中的最后一个 value 被移除后,数据结构被自动删除,内存被回收。
操作
#插入数据
zadd demo 1 "aaa"
zadd demo 2 "bbb"
zadd demo 3 "ccc"
#按 score 顺序列出
zrange demo 0 -1
#按 score 逆序列出
zrevrange demo 0 -1
#计数
zcard demo
#获取指定 value 的 score 值
zscore demo "ccc"
#获取 value 的排名(从 0 开始)
zrank demo "ccc"
# 删除 value
zrem demo "ccc"
通用规则
list、set、hash、set 这四种数据结构是容器型的数据结构,它们共享下面两条通用的规则:
create if not exists:容器不存在,那就创建一个,在进行操作
- drop if no elements:容器为空,立即自动删除容器,释放缓存
生命周期
Redis 的所有数据都可以已对象为单位设置过期时间,时间一过自动删除相应的对象;都已经存在的对象使用了 set 方法过期时间会取消。#设置过期时间
expire demo 5
#查看剩余时间
ttl demo