redis 创始人🧔叫萨尔瓦多·桑菲利波普 Salvatore Sanfilippo(Antirez),意大利人,比起各种名校 buff 加身的互联网大佬,redis 之父只进入了一所普通大学,甚至到了大三辍学去做了系统管理员,可能作者本人也没有想到他会对今天的互联网产生如此大的影响。
redis 默认端口号是 6379
,6379
在手机按键上是 “MERZ” 对应的号码,而 “MERZ” 取自意大利广告女郎 AlessiaMerz 的名字,据说创始人当时也没有多想,给 redis 选择端口号的时候直接就把 “MERZ” 对应的 6379
拿来用了。
作为非关系型数据库(NoSQL),redis 存储方式非常简单,只支持 key-value
模式存储,有点像很多语言库函数里自带的 Map,不过 redis 在性能和功能上比 Map 强大的多。
redis 究竟能干点啥呢?
redis 主要是用来充当缓存用的,在需要高频访问数据的场景,redis 可以帮助传统的数据库减少 IO 操作,常见的场景比如:
总之就是数据不是很复杂,用不上关系型数据库,但又对速度有很高的要求,这个时候就该 redis 上场了。
redis 中默认有 16 个数据库(db[0] ~ db[15]
),默认使用第一个数据库(db[0]
),数据库的数量在配置文件中可以修改。
进入数据库客户端 redis-cli
可以对数据库进行操作,这个是安装 redis 时自带的。
(redis 的命令不区分大小写,按下 Tab
键可以自动补全)
切换数据库:select 数字
从默认数据库切换到数据库 3,再从数据库 3 切换回默认数据库。
存储内容:set key value
,redis 是 key-value 型数据库,数据库中的每一个数据都有一个 key 与其对应。
向数据库中添加两个数据。
使用 get key
可以获取到 key 所对应的数据。
查看数据库中所有的 key:keys *
目前数据库中有 “name” 与 “age” 两个 key。
查看数据库的大小:DBSIZE
清除当前数据库:flushdb
清除数据库以后再次查看数据库大小和 key,会发现它们都为空。
清除全部数据库:FLUSHALL
分别向数据库 0 与数据库 3 添加两个数据,执行 FLUSHALL
会发现这两个数据库都被清空了。
这里再额外补充一些命令:
命令 | 描述 |
---|---|
exists key | 判断某个 key 是否存在 |
type key | 查看数据类型 |
del key | 删除指定的数据 |
expire key 100 | 为给定的 key 设置过期时间(0 表示永久) |
ttl key | 查看 key 是否过期,-1 表示永不过期,-2 表示已过期 |
还有一个 shutdown
命令,用来关闭 redis 服务。如果仅仅是退出客户端 redis-cli,可以按下 CTRL + C
。
redis 中有五大常用的数据类型:字符串(String)、列表(List)、集合(Set)、哈希(Hash)、有序集合(Zset),这些在很多高级语言里面都见怪不怪了,然而 redis 还给我们准备了三个针对特定场景的特殊类型:地理位置(Geospatial)、基数统计(Hyperloglog)、位图(Bitmap)。
其中最常用的类型是 String,redis 中的 String 非常强大,不仅能存文本信息,还能存数字,甚至是图片,音频。
字符串的使用和 Java 中的类似,获取字符串长度,追加字符等等操作都是支持的~
在 redis 中,字符串可以存储不同种类的信息,比如图片,音频等,这是由于数据的二进制信息放入 string 中是什么样,取出来就是什么样,redis 不会关心我们存储的具体内容,只会严格按照二进制信息存取,不会妄图以某种特殊格式解析数据,我们将这种特点称为“二进制安全”。
redis 中的字符串可以加双引号 " "
,也可以省略。
常用命令参考:
命令 | 描述 |
---|---|
set | 添加键值对 |
get | 查看键对应的值 |
append | 将给定的 value 添加至原字符串末尾 |
strlen | 获取 key 对应的字符串长度 |
setnx | 仅当 key 不存在时 设置 key 的值 |
incr 与 decr | 将 key 中存储的数字值加 1 或者减 1 |
incrby 与 decrby | 将 key 中存储的数字值增加或减少指定的数值 |
mset | 同时设置多个 key-value |
mget | 同时获取多个 value |
msetnx | 同时设置多个 key-value,仅当所有给定的 key 都不存在 |
getrange | 获取指定范围内的子字符串 |
setrange | 复写 key 所存储的字符串,从<起始位置>开始 |
setex | 设置键值同时指定一个过期时间(单位秒) |
getset | 设置新的键值同时获得旧值 |
要注意的是 getrange
中的区间范围是左闭右闭的,比如:
redis 中的 List 既可以当成列表,也可以当作队列、栈和阻塞队列来用。
list 的底层是一个双向链表,可以添加一个元素到列表的头部(左边)或尾部(右边)。操作列表中间结点的性能会比两端的稍差一些。
常用命令:
lpush/rpush
:从左边/右边插入一个或多个值。
lpop/rpop
:从左边/右边弹出一个值。当列表中没有元素时,键(key)会跟着销毁。(值在键在,值光键亡)
rpoplpush
:从
列表右边弹出一个值,插入到
列表左边。
lrange
:获得指定范围内的元素。(从左到右)
lrange mylist 0 -1
表示获取列表中的所有元素。(-1 表示右边第一个)
我们在列表中用 lpush
插入四个姓名,取出范围 1 - 3 内的元素:
可以发现插入操作是每个元素都往最左边放,同时取元素时指定的范围是闭区间。
lindex
:获取指定索引下标的元素。
llen
:获得列表长度。
linsert
:在
的前面插入
值。
lrem
:从左边删除 n 个 指定的元素。
lset
:将列表 key 下标为 index 的值替换成 value。
set 对外提供的功能与 list 类似,特殊之处在于 set 是可以自动去重,当你需要存储一个列表数据,又不希望出现重复数据时,set 是一个很好的选择,并且 set 提供了判断某个成员是否在一个 set 集合内的重要接口,这个也是 list 所不能提供的。
比如我们尝试在集合中重复添加字符串 “apple”,set 会只保留一个数据元素:
常用命令:
命令 | 描述 |
---|---|
sadd | 将一个或多个 member 元素加入到集合 key 中,已经存在的 member 元素将被忽略 |
smembers | 取出该集合的所有值 |
sismember | 判断集合 key 是否为含有该 value 值,有1,没有0 |
scard | 返回该集合的元素个数 |
srem | 删除集合中的指定元素 |
spop | 随机从该集合中弹出一个值 |
srandmember | 随机从该集合中取出 n 个值,不会从集合中删除 |
smove | 把集合中一个值从一个集合移动到另一个集合 |
sinter | 返回两个集合的交集元素 |
sunion | 返回两个集合的并集元素 |
sdiff | 返回两个集合的差集元素(key1中的,不包含key2中的) |
hash 是一个 string 类型的 field 和 value 的映射表,hash 特别适合用于存储对象。类似Java里面的Map
。
比如要存储用户信息,可以用 ID 作为 key,将个人信息以 field - value 的形式保存在 hash 中:
有点 Map 里嵌套了一个 Map 的感觉~
常用命令:
命令 | 描述 |
---|---|
hset | 给 key 集合中的 field 键赋值 value |
hget | 从 key 集合 field 取出 value |
hmset | 批量设置 hash 的值 |
hexists | 查看哈希表 key 中,给定域 field 是否存在 |
hkeys | 列出该 hash 集合的所有 field |
hvals | 列出该hash集合的所有 value |
hincrby | 为哈希表 key 中的域 field 的值加上增量(可以是负数) |
hsetnx | 将哈希表 key 中的域 field 的值设置为 value ,当且仅当域 field 不存在 |
一个 hash 的简单示例:
有序集合 zset 与普通集合 set 非常相似,是一个没有重复元素的字符串集合。不同之处是有序集合的每个成员都关联了一个评分 score,这个评分被用来按照从最低分到最高分的方式排序集合中的成员。集合的成员是唯一的,但是评分可以是重复的 。
因为元素是有序的, 所以你也可以很快的根据评分(score)或者次序(position)来获取一个范围内的元素。
常用命令:
命令 | 描述 |
---|---|
zadd | 将一个或多个 member 元素及其 score 值加入到有序集 key 当中 |
zrange | 返回有序集 key 中,下标在 start 与 stop 之间的元素 |
zrangebyscore | 返回有序集 key 中,所有 score 值介于 min 和 max 之间的成员,按 score 值递增排序 |
zrevrangebyscore | 同上,改为从大到小排列 |
zrem | 删除该集合下,指定值的元素 |
zcount | 统计该集合,分数区间内的元素个数 |
zrank | 返回该值在集合中的排名,从0 开始 |
zrange
命令最后可以带一个可选项 WITHSCORES
,可以让分数一起和值返回到结果集:zrange
zrangebyscore
命令也可以带可选项:zrangebyscore key minmax [withscores] [limit offset count]
,其中可选项 [limit offset count]
用来进行分页处理,表示从第 offset 起,共取得 count 个数据。例如 limit 10 20
表示从第 10 条数据开始,取 20 条数据。
利用 zset 实现一个分数排行榜:
🚀redis 系列专栏:Redis 快速入门
❤整理不易❤ 还请各位读者老爷们三连支持一下╰( ̄ω ̄o)