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 上追加内容

除了上面那些命令外,还有其他的比如获取字符串的部分值,修改字符串的部分值等操作。

1
2
3
4
5
6
7
8
$ 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 从列表种裁剪元素,只保留区间内的数据

列表还支持不同的列表之间进行数据的转移

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
$ 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 从集合中取出一个特定的数据并且转移到另一个集合中

集合中还支持集合的各种交并集的运算

1
2
3
4
5
6
7
8
9
10
$ 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 必须为浮点数)

1
2
3
4
5
6
7
8
9
10
11
$ 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 返回某个数据的排名

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
$ 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 命令:

1
2
3
4
5
6
# 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)来进行数据共享、并提供复制和故障转移功能

(完)

  1. Redis 设计与实现
  2. Redis In Action

微信公众号

© 2018 ray