1. Redis 概述
1.1 特点
-
key-value 储存
-
支持的 value 类型很多,包括 string、list、set、zset(有序集合)、hash
-
支持的数据类型都支持 push/pop、add/remove、取交并补差及更丰富的操作,且这些操作都是原子性的
-
支持不同方式的排序
-
为了保证效率,数据都缓存在内存中
-
会周期性将更新的数据落盘,或将修改操作追加入日志文件
-
实现了主从同步(master-slave)
1.2 安装目录
-
redis-benchmark:性能测试工具
-
redis-check-aof:修复有问题 AOF 文件
-
redis-check-dump:修复有问题的 dump.rdb 文件
-
redis-sentinel:Redis 集群使用
-
redis-server:Redis 服务器启动命令
-
redis-cli:客户端,操作入口
2. 常用的五大数据类型
2.1 Redis key
指令 | 作用 |
---|---|
keys <*> | 查看当前库所有 key (* 为通配符) |
exists <key> | 判断某个 key 是否存在 |
type <key> | 查看 key 的类型 |
del <key> | 删除指定的 key |
unlink <key> | 根据 value 选择非阻塞删除 (仅将 key 从元数据中删除,真正的删除后续异步进行) |
expire <key> <time> | 给指定 key 设置过期时间 (time 单位为秒) |
ttl <key> | 查看 key 还有多少秒过期,-1 表示永不过期,-2 表示已过期 |
2.2 String
2.2.1 特点
-
Redis 最基本的数据类型,即 key 和 value 默认都是 string
-
String 类型是二进制安全的,即 Redis 的 string 可以包含任何数据,包括图片和序列化对象
-
Redis 中字符串 value 大小最大为 512 MB
2.2.2 常用命令
指令 | 作用 |
---|---|
set <key> <time> <value> | 设置 key-value 值,可设置过期时间 |
get <key> | 查询对应键值 |
append <key> <value> | 将给定的 value 追加到指定 key 的 value 末尾 |
strlen <key> | 获取指定 key 的 value 的长度 |
setnx <key> <time> <value> | 仅当 key 不存在时,设置给定的 key-value,可设置过期时间 (可用于实现分布式锁) |
incr/decr <key> | 将 key 中储存的数字值 +1/ -1 (只能对数字值操作) |
incrby/decrby <key> <step> | 将 key 中储存的数字值按指定步长增减 |
mset <key1> <value1> <key2> <value2>... | 一次设置多个 key-value |
msetnx <key1> <value1> <key2> <value2>... | 一次设置多个 key-value,仅当 key 都不存在时才能设置成功 (原子性) |
getrange <key> <start> <end> | 获取指定 key 的 value 的子串 (闭区间) |
setrange <key> <start> <value> | 从指定位置开始覆写指定 key 的 value 值 |
setex <key> <time> <value> | 设置 key-value 的,如果 key 存在则替换旧值,可设置过期时间 |
getset <key> <value> | 设置新 value 时同时返回旧 value |
2.2.3 数据结构
String 的数据结构为简单动态字符串 (Simple Dynamic String, SDS),内部结构类似于 ArrayList,采用预分配冗余空间来减少内存的频繁分配
设 string 容量为 capacity
capacity < 1MB:字符串容量扩容为原来的 2 倍
capacity > 1MB:一次只扩容 1MB 的空间
capacity 最大为 512 MB
2.3 List
2.3.1 特点
-
单键多值
-
Redis 列表是字符串列表
-
Redis 列表底层是双向链表
2.3.2 常用命令
指令 | 作用 |
---|---|
lpush|rpush <key> <value1> <value2>... | 从左边/右边插入一个或多个值 |
lpop|rpop <key> | 从左边/右边弹出一个值 (当所有值都弹出后,key 也会被删除) |
rpop|push <key1> <key2> | 从 key1 列表右边弹出一个值,插入 key2 列表左边 |
lrange <key> <start> <stop> | 按照索引下标获取元素,stop = -1表示一直取到结尾 (从左到右取) |
lindex <key> <index> | 按照索引下标获取元素 (从左到右数) |
llen <key> | 获取列表长度 |
linsert <key> before|after <value> <newvalue> | 在指定的 value 前面/后面插入 newvalue |
lrem <key> <n> <value> | 从左到右删除 n 个 value |
lset <key> <index> <value> | 将 key 列表下表为 index 的值替换为 value |
2.3.3 数据结构
List 的数据结构为快速链表 (quicklist)
列表元素较少时会使用一块连续的内存储存,此时结构是压缩链表 (ziplist)
列表元素较多时会改成快速链表
快速链表是由多个压缩链表构成的双向链表,这样既满足了快速插入删除的性能,由不会出现太大的空间冗余
2.4 Set
2.4.1 特点
-
Redis 集合功能类似于列表,当可以自动排重
-
Redis 集合提供了判断成员是否在其中的方法
-
Redis 集合是 string 类型的无序集合,底层是一个 value 为 null 的 hash 表,增删改查操作时间复杂度为 O(1)
2.4.2 常用指令
指令 | 作用 |
---|---|
sadd <key> <value1> <value2> ... | 将一个或多个元素加入 key 集合 |
smembers <key> | 取出 key 集合的所有值 (当所有值都弹出后,key 也会被删除) |
sismember <key> <value> | 判断 key 集合中是否就有指定 value,有返回 1,否则返回 0 |
scard <key> | 返回 key 集合的元素个数 |
srem <key> <value1> <value2> ... | 删除 key 集合中的一个或多个指定元素 |
spop <key> | 随机从 key 集合中弹出一个值 |
srandmember <key> <n> | 随机从 key 集合中取出 n 个值,不会删除这些值 |
smove <key1> <key2> <value> | 将 key1 集合中的指定 value 移动到 key2 集合中 |
sinter <key1> <key2> | 返回 key1 集合和 key2 集合的交集 |
sunion <key1> <key2> | 返回 key1 集合和 key2 集合的并集 |
sdiff <key1> <key2> | 返回 key1 集合和 key2 集合的差集 |
2.4.3 数据结构
Set 的数据结构为 dict 字典,使用 hash 表实现的,但 hash 表的所有 value 都指向 null
2.5 Hash
2.5.1 特点
-
Redis hash 是一个键值对集合
-
Redis hash 是一个 string 类型的 field-value 映射表
2.5.2 常用命令
指令 | 作用 |
---|---|
hset <key> <field> <value> | 给 key 哈希表中的 field 键赋值 value |
hget <key> <field> | 从 key 哈希表中取出 field 键的值 |
hmset <key> <field1> <value1> <field2> <value2> ... | 批量设置 key 哈希表的键值对 |
hexists <key> <field> | 查看 key 哈希表中 field 键是否存在 |
hkeys <key> | 返回 key 哈希表的所有键 |
hvals <key> | 返回 key 哈希表的所有值 |
hincrby <key> <field> <increment> | 给 key 哈希表的 field 键的 value 加上指定数值 (value 需为数字) |
hsetnx <key> <field> <value> | 如果 key 哈希表中不存在 field 键,则给 field 键赋值 value |
2.5.3 数据结构
Hash 的数据结构有两种:ziplist、hashtable
当 field-value 长度较短且个数较少时,使用 ziplist,否则使用 hashtable
2.6 Zset
2.6.1 特点
-
Redis 有序集合与 set 相似,也是一个无重复元素的字符串集合
-
Redis 有序集合每个成员都关联了一个评分 (score),用于进行排序,评分可重复
-
因为元素是有序的,可以很快根据评分或次序来获取一个范围的元素
2.6.2 常用命令
指令 | 作用 |
---|---|
zadd <key> <score1> <value1> <score2> <value2> ... | 将一个或多个元素连同其评分加入 key 有序集合中 |
zrange <key> <start> <stop> [withscores] | 返回 key 有序集合中下标在 start 到 stop 间的元素,加上 withscores 可以连评分一起显示 |
zrangebyscore <key> minmax [withscores] [limit offset count] | 返回 key 有序集合中评分介于 min 和 max 间的元素,并按照评分从小到大排序 |
zrevrangebyscore <key> maxmin [withscores] [limit offset count] | 返回 key 有序集合中评分介于 min 和 max 间的元素,并按照评分从大到小排序 |
zincrby <key> <increment> <value> | 给 key 有序集合的元素 value 的评分加上指定值 |
zrem <key> <min> <max> | 统计 key 有序集合中评分介于 min 和 max 间的元素个数 |
zrank <key> <value> | 返回 key 有序集合中指定值 value 在 key 中的排名,从 0 开始 |
2.6.3 数据结构
Zset 底层使用了两个数据结构
-
hash 表,其作用是关联元素 value 和评分 score,确保 value 的唯一性,可以通过 value 找到对应个 score
-
跳跃表,用于给元素 value 排序即根据 score 返回获取元素列表