Redis 教程
Redis 教程
REmote DIctionary Server(Redis) 是一个由 Salvatore Sanfilippo 写的 key-value 存储系统。
Redis 是一个开源的使用 ANSI C 语言编写、遵守 BSD 协议、支持网络、可基于内存亦可持久化的日志型、Key-Value 数据库,并提供多种语言的 API。
它通常被称为数据结构服务器,因为值(value)可以是 字符串 (String), 哈希 (Hash), 列表 (list), 集合 (sets) 和 有序集合 (sorted sets) 等类型。
除了您现在看到的 Redis 教程 外,本站还有一个 Redis 命令 的文档,可以了解一下
阅读本教程前,您需要了解的知识?
阅读本教程前,你需要了解基本的数据结构,例如以下几种:
- String: 字符串
- Hash: 散列
- List: 列表
- Set: 集合
- Sorted Set: 有序集合
在阅读本教程前,你需要了解基本的数据结构。
数据模型
Redis 的外围由一个键、值映射的字典构成。与其他非关系型数据库主要不同在于:Redis 中值的类型不仅限于字符串,还支持如下抽象数据类型:
- 字符串列表
- 无序不重复的字符串集合
- 有序不重复的字符串集合
- 键、值都为字符串的哈希表
值的类型决定了值本身支持的操作。Redis 支持不同无序、有序的列表,无序、有序的集合间的交集、并集等高级服务器端原子操作。
持久化
Redis 通常将全部的数据存储在内存中。2.4 版本后可配置为使用虚拟内存, 一部分数据集存储在硬盘上,但这个特性废弃了。
当前通过两种方式实现持久化:
- 使用快照,一种半持久耐用模式。不时的将数据集以异步方式从内存以 RDB 格式写入硬盘。
- 1.1 版本开始使用更安全的 AOF 格式替代,一种只能追加的日志类型。将数据集修改操作记录起来。Redis 能够在后台对只可追加的记录作修改来避免无限增长的日志。
同步
Redis 支持主从同步。数据可以从主服务器向任意数量的从服务器上同步,从服务器可以是关联其他从服务器的主服务器。这使得 Redis 可执行单层树复制。从盘可以有意无意的对数据进行写操作。由于完全实现了发布 / 订阅机制,使得从数据库在任何地方同步树时,可订阅一个频道并接收主服务器完整的消息发布记录。同步对读取操作的可扩展性和数据冗余很有帮助。
性能
当数据依赖不再需要,Redis 这种基于内存的性质,与在执行一个事务时将每个变化都写入硬盘的数据库系统相比就显得执行效率非常高。写与读操作速度没有明显差别。
下面是官方的 bench-mark 数据:
- 测试完成了 50 个并发执行 100000 个请求。
- 设置和获取的值是一个 256 字节字符串。
- Linux box 是运行 Linux 2.6, 这是 X3320 Xeon 2.5 ghz。
- 文本执行使用 loopback 接口 (127.0.0.1)。
- 结果:读的速度是 110000 次 /s, 写的速度是 81000 次 /s 。
支持语言编辑
许多语言都包含 Redis 支持,包括:
- ActionScript
- C
- C++
- C#
- Clojure
- Common Lisp
- Dart
- Erlang
- Go
- Haskell
- Haxe
- Io
- Java
- Node.js
- Lua
- Objective-C
- Perl
- PHP
- Pure Data
- Python
- R
- Ruby
- Scala
- Smalltalk
- Tcl
存储
redis 使用了两种文件格式:全量数据和增量请求。
全量数据格式是把内存中的数据写入磁盘,便于下次读取文件进行加载;
增量请求文件则是把内存中的数据序列化为操作请求,用于读取文件进行 replay 得到数据,序列化的操作包括 SET、RPUSH、SADD、ZADD。
redis 的存储分为内存存储、磁盘存储和 log 文件三部分,配置文件中有三个参数对其进行配置。
save seconds updates,save 配置,指出在多长时间内,有多少次更新操作,就将数据同步到数据文件。这个可以多个条件配合,比如默认配置文件中的设置,就设置了三个条件。
appendonly yes/no ,appendonly 配置,指出是否在每次更新操作后进行日志记录,如果不开启,可能会在断电时导致一段时间内的数据丢失。因为 redis 本身同步数据文件是按上面的 save 条件来同步的,所以有的数据会在一段时间内只存在于内存中。
appendfsync no/always/everysec ,appendfsync 配置,no 表示等操作系统进行数据缓存同步到磁盘,always 表示每次更新操作后手动调用 fsync() 将数据写到磁盘,everysec 表示每秒同步一次。
相关资源
Redis 官网:https://redis.io/