Redis 简明教程
Redis 是一个非常快的非关系型的数据库,通过 key-value 的形式保存数据。key 总是字符串,而 value 支持 5 种类型(字符串、列表、集合、哈希表、有序集合),单个 value 的大小不超过 512 M。Redis 的键值对是存储在内存中的,但是也能持久化到硬盘中。
5 种数据类型和基本操作
字符串
字符串中可以存储的内容有字符串,数值等,针对不同的值,可以进行不同的操作,以下是字符串的值常用的操作。
命令 | 备注 |
---|---|
GET | 通过给定的 key 获取 value |
SET | 通过给定的 key 存储 value |
DEL | 通过给定的 key 删除 value |
INCR | 通过给定的 key 给 value 增加 1(value 必须为整数) |
DECR | 通过给定的 key 给 value 减 1(value 必须为整数) |
INCRBY | 通过给定的 key 给 value 增加特定的值(value 必须为整数) |
DECRBY | 通过给定的 key 给 value 减少特定的值(value 必须为整数) |
INCRBYFLOAT | 通过给定的 key 给 value 减少特定的值(value 必须为浮点数) |
APPEND | 通过给定的 key 在 value 上追加内容 |
除了上面那些命令外,还有其他的比如获取字符串的部分值,修改字符串的部分值等操作。
$ 127.0.0.1:6379> set hello world
OK
$ 127.0.0.1:6379> get hello
"world"
$ 127.0.0.1:6379> del hello
(integer) 1
$ 127.0.0.1:6379> get hello
(nil)
列表
列表实际上是一个双向链表,在插入数据的时候可以选择从头部插入,也可以选择从尾部插入。
命令 | 备注 |
---|---|
LPUSH | 从列表的头部插入数据 |
RPUSH | 从列表的尾部插入数据 |
LPOP | 从列表的头部取出一个数据 |
RPOP | 从列表的尾部取出一个数据 |
LRANGE | 从列表种查询某个范围的数据 |
LINDEX | 从列表种查询给定位置的数据 |
LTRIM | 从列表种裁剪元素,只保留区间内的数据 |
列表还支持不同的列表之间进行数据的转移
$ 127.0.0.1:6379> rpush list-key item
(integer) 5
$ 127.0.0.1:6379> lpush list-key item
(integer) 6
$ 127.0.0.1:6379> lrange list-key 0 -1
1) "item"
2) "item"
3) "item2"
4) "item"
5) "item"
6) "item"
$ 127.0.0.1:6379> lindex list-key 1
"item"
$ 127.0.0.1:6379> lpop list-key
"item"
$ 127.0.0.1:6379> rpop list-key
"item"
集合
集合中存储的都是不重复的值,但是所有的值都不是有序的。
命令 | 备注 |
---|---|
SADD | 在集合中添加一项 |
SMEMBERS | 返回集合中所有的项 |
SISMEMBER | 检查某一项是否在集合中 |
SREM | 如果某项在集合中存在,就删除 |
SCARD | 计算集合中数据的个数 |
SRANDMEMBER | 从集合中随机取出几个数据 |
SPOP | 从集合中随机取出一个数据 |
SMOVE | 从集合中取出一个特定的数据并且转移到另一个集合中 |
集合中还支持集合的各种交并集的运算
$ 127.0.0.1:6379> sadd set-key item3
(integer) 1
$ 127.0.0.1:6379> smembers set-key
1) "item1"
2) "item3"
3) "item"
$ 127.0.0.1:6379> sismember set-key item3
(integer) 1
$ 127.0.0.1:6379> srem set-key item1
(integer) 1
哈希
哈希对象的每个 key 都是不重复而且无序的。
命令 | 备注 |
---|---|
HSET | 在 hash 种添加一个键值对 |
HGET | 通过 key 在 hash 中获取一个键值对 |
HGETALL | 查询 hash 中所有的键值对 |
HDEL | 通过 key 在 hash 中删除一个键值对 |
HLEN | 返回 hash 中键值对的个数 |
HMGET | 通过多个 key 在 hash 中获取值 |
HMSET | 批量在 hash 中添加键值对 |
HEXISTS | 判断 hash 中某个键值对是否存在 |
HKEYS | 返回 hash 中所有的 key |
HVALS | 返回 hash 中所有的 value |
HINCRBY | 为 hash 中键值对的值添加特定的整数(value 必须为整数) |
HINCRBYFLOAT | 为 hash 中键值对的值添加特定的浮点数 (value 必须为浮点数) |
$ 127.0.0.1:6379> hset hash-key sub-key3 value6
(integer) 1
$ 127.0.0.1:6379> hgetall hash-key
1) "sub-key1"
2) "value6"
3) "sub-key3"
4) "value6"
$ 127.0.0.1:6379> hget hash-key sub-key1
"value6"
$ 127.0.0.1:6379> hdel hash-key subkey1
(integer) 0
有序集合
有序集合类似哈希,存储的是键值对,但是有序集合是按照 value 的顺序排列的,value 必须是浮点数。
命令 | 备注 |
---|---|
ZADD | 在有序集合中添加数据 |
ZRANGE | 根据范围查询数据 |
ZRANGEBYSCORE | 根据 value 的范围查询数据 |
ZREM | 从有序集合中删除数据 |
ZCARD | 获取集合中数据的条数 |
ZINCRBY | 给某个数据添加特定的值 |
ZCOUNT | 获取给定的范围内数据的个数 |
ZSCORE | 返回某个数据的数值 |
ZRANK | 返回某个数据的排名 |
$ 127.0.0.1:6379> zadd zset-key 666 memeber4
(integer) 1
$ 127.0.0.1:6379> zrange zset-key 0 -1 withscores
1) "member4"
2) "123"
3) "member2"
4) "635"
5) "memeber4"
6) "666"
$ 127.0.0.1:6379> zrangebyscore zset-key 0 800 withscores
1) "member4"
2) "123"
3) "member2"
4) "635"
5) "memeber4"
6) "666"
$ 127.0.0.1:6379> zrem zset-key member2
(integer) 1
Redis 中完整的命令可以在这里查找到。
Redis 中的数据结构
数据结构 | 用途 | 备注 |
---|---|---|
简单动态字符串 | Redis 默认字符串的表示 | |
双向链表 | 列表键、发布与订阅、慢查询、监视器 | |
字典 | 数据库 | 数据库的增删改查也是在字典的基础上 |
跳表 | 有序集合键 | |
整数集合 | 集合键 | |
压缩列表 | 列表键、哈希键 |
上面的这些数据结构在 Redis 种都有用到,但是 Redis 并不是直接使用这些数据结构,而是在这些数据结构的基础上创建了一个对象系统、这个系统中有字符串对象、列表对象、哈希对象、集合对象以及有序集合对象这五种对象。每个对象都至少用到了一种表中的数据结构。
Redis 数据持久化
Redis 数据是基于内存进行存储的,为了保证数据在 Redis 服务退出后还可以存在,就得使用持久化的方法就数据保存下来。
Redis 提供了两种持久化的方法,一种是 RDB,一种是 AOF。
RDB 持久化
RDB持久化锁生成的 RDB 文件实际上是一个经过了压缩的二进制文件。通过该文件可以还原生成 RDB 文件时候的数据库状态。
RDB 文件的生成有两个命令,一个是 SAVE,一个是 BGSAVE。
- SAVE:阻塞 Redis 服务器进程,直到 RDB 文件创建完成
- BGSAVE: 不会阻塞 Redis 服务器进程,由子进程去创建 RDB 文件
可以通过设置 save 选项,让服务器每隔一段时间自动执行一次 BGSAVE 命令:
# 900 秒内,对数据库至少进行了一次修改就执行 BGSAVE
$ save 900 1
# 300 秒内,对数据库至少进行了 10 次修改
$ save 300 10
# 60 秒内,对数据库至少进行了 10000 次修改
$ save 60 10000
AOF 持久化
与 RDB 将整个 Redis 种的数据就行保存来记录数据库状态不同,AOF 持久化时通过保存 Redis 服务器锁执行的写命令来保存数据库。
AOF 执行的策略有三种:
策略 | 备注 |
---|---|
always | 每个写命令都同步 |
everysec | 每秒同步一次 |
no | 让操作系统来决定何时同步 |
Redis 其他特性
Redis 除了支持基本的存储之外,也提供了很多的工具,帮助应对更加复杂的业务场景。
特性 | 使用方式 | 备注 |
---|---|---|
发布与订阅 | 使用 PUBLISH 发布频道、SUBSCRIBE 订阅、UNSUBSCRIBE取消订阅、PSUBSCRIBE 支持正则模式订阅 | |
事务 | 如果一次想保证原子性支持多个写命令,就需要使用事务,事务通过 MULTI、EXEC、WATCH 命令来实现事务 | |
排序 | 通过 sort 命令可以对列表键、集合键或者有序集合键进行排序 | |
慢查询日志 | 用于记录执行时间超过给定时长的命令请求、可以通过这个来监视和优化查询速度 | |
监视器 | 通过 monitor 命令,客户端可以讲自身编程一个监视器,实时的接收并且打印服务器当前处理的命令 |
Redis 分布式和高可用方案
Redis 对于分布式环境下的部署有着成熟的解决方案,常用的方式如下:
方案 | 部署方式 | 备注 |
---|---|---|
复制 | 通过 slaveof 去配置主从服务器 | 主从服务器上的数据一致 |
Sentinel | 高可用的解决方案,实际上是在 复制方案的上层添加了一个 sentilnel 系统,来监视所有 redis 服务器,一旦主服务器宕机之后,会把其中一台从服务器选择为主服务器 | |
集群 | Redis 分布式数据库的方案,通过分片(sharding)来进行数据共享、并提供复制和故障转移功能 |
(完)
- Redis 设计与实现
- Redis In Action