auto commit

This commit is contained in:
CyC2018 2018-03-14 21:01:16 +08:00
parent 8b4265557e
commit b13b76d5fb
2 changed files with 44 additions and 37 deletions

View File

@ -408,7 +408,6 @@ do {
分表,就是将一张表分成多个小表,这些小表拥有不同的表名;而分区是将一张表的数据分为多个区块,这些区块可以存储在同一个磁盘上,也可以存储在不同的磁盘上,这种方式下表仍然只有一个。
# 故障转移和故障恢复
故障转移也叫做切换,当主库出现故障时就切换到备库,使备库成为主库。故障恢复顾名思义就是从故障中恢复过来,并且保证数据的正确性。

View File

@ -1,11 +1,11 @@
<!-- GFM-TOC -->
* [Redis 是什么](#redis-是什么)
* [Redis 的五种基本类型](#redis-的五种基本类型)
* [Strings](#strings)
* [Lists](#lists)
* [Sets](#sets)
* [Hashs](#hashs)
* [Sorted Sets](#sorted-sets)
* [STRING](#string)
* [LIST](#list)
* [SET](#set)
* [HASH](#hash)
* [ZSET](#zset)
* [键的过期时间](#键的过期时间)
* [发布与订阅](#发布与订阅)
* [事务](#事务)
@ -18,6 +18,8 @@
* [处理故障](#处理故障)
* [分片](#分片)
* [事件](#事件)
* [事件类型](#事件类型)
* [事件的调度与执行](#事件的调度与执行)
* [Redis 与 Memcached 的区别](#redis-与-memcached-的区别)
* [Redis 适用场景](#redis-适用场景)
* [数据淘汰策略](#数据淘汰策略)
@ -38,15 +40,15 @@ Redis 支持很多特性,例如将内存中的数据持久化到硬盘中,
| 数据类型 | 可以存储的值 | 操作 |
| -- | -- | -- |
| Strings | 字符串、整数或者浮点数 | 对整个字符串或者字符串的其中一部分执行操作</br> 对整数和浮点数执行自增或者自减操作 |
| Lists | 链表 | 从两端压入或者弹出元素</br> 读取单个或者多个元素</br> 进行修剪,只保留一个范围内的元素 |
| Sets | 无序集合 | 添加、获取、移除单个元素</br> 检查一个元素是否存在于集合中</br> 计算交集、并集、差集</br> 从集合里面随机获取元素 |
| Hashs | 包含键值对的无序散列表 | 添加、获取、移除单个键值对</br> 获取所有键值对</br> 检查某个键是否存在|
| Sorted Sets | 有序集合 | 添加、获取、删除元素个元素</br> 根据分值范围或者成员来获取元素</br> 计算一个键的排名 |
| STRING | 字符串、整数或者浮点数 | 对整个字符串或者字符串的其中一部分执行操作</br> 对整数和浮点数执行自增或者自减操作 |
| LIST | 链表 | 从两端压入或者弹出元素</br> 读取单个或者多个元素</br> 进行修剪,只保留一个范围内的元素 |
| SET | 无序集合 | 添加、获取、移除单个元素</br> 检查一个元素是否存在于集合中</br> 计算交集、并集、差集</br> 从集合里面随机获取元素 |
| HASH | 包含键值对的无序散列表 | 添加、获取、移除单个键值对</br> 获取所有键值对</br> 检查某个键是否存在|
| ZSET | 有序集合 | 添加、获取、删除元素个元素</br> 根据分值范围或者成员来获取元素</br> 计算一个键的排名 |
> [What Redis data structures look like](https://redislabs.com/ebook/part-1-getting-started/chapter-1-getting-to-know-redis/1-2-what-redis-data-structures-look-like/)
## Strings
## STRING
<div align="center"> <img src="../pics//6019b2db-bc3e-4408-b6d8-96025f4481d6.png" width="400"/> </div><br>
@ -61,7 +63,7 @@ OK
(nil)
```
## Lists
## LIST
<div align="center"> <img src="../pics//fb327611-7e2b-4f2f-9f5b-38592d408f07.png" width="400"/> </div><br>
@ -89,7 +91,7 @@ OK
2) "item"
```
## Sets
## SET
<div align="center"> <img src="../pics//cd5fbcff-3f35-43a6-8ffa-082a93ce0f0e.png" width="400"/> </div><br>
@ -123,7 +125,7 @@ OK
2) "item3"
```
## Hashs
## HASH
<div align="center"> <img src="../pics//7bd202a7-93d4-4f3a-a878-af68ae25539a.png" width="400"/> </div><br>
@ -154,7 +156,7 @@ OK
2) "value1"
```
## Sorted Sets
## ZSET
<div align="center"> <img src="../pics//1202b2d6-9469-4251-bd47-ca6034fb6116.png" width="400"/> </div><br>
@ -246,9 +248,11 @@ always 选项会严重减低服务器的性能everysec 选项比较合适,
## 从服务器连接主服务器的过程
- 主服务器创建快照文件,发送给从服务器,并在发送期间使用缓冲区记录执行的写命令。快照文件发送完毕之后,开始向从服务器发送存储在缓冲区中的写命令;
- 从服务器丢弃所有旧数据,载入主服务器发来的快照文件,之后从服务器开始接受主服务器发来的写命令;
- 主服务器每执行一次写命令,就向从服务器发送相同的写命令。
1. 主服务器创建快照文件,发送给从服务器,并在发送期间使用缓冲区记录执行的写命令。快照文件发送完毕之后,开始向从服务器发送存储在缓冲区中的写命令;
2. 从服务器丢弃所有旧数据,载入主服务器发来的快照文件,之后从服务器开始接受主服务器发来的写命令;
3. 主服务器每执行一次写命令,就向从服务器发送相同的写命令。
## 主从链
@ -270,27 +274,31 @@ Redis 中的分片类似于 MySQL 的分表操作,分片是将数据划分为
假设有 4 个 Reids 实例 R0R1R2R3还有很多表示用户的键 user:1user:2... 等等,有不同的方式来选择一个指定的键存储在哪个实例中。最简单的方式是范围分片,例如用户 id 从 0\~1000 的存储到实例 R0 中,用户 id 从 1001\~2000 的存储到实例 R1 中,等等。但是这样需要维护一张映射范围表,维护操作代价很高。还有一种方式是哈希分片,使用 CRC32 哈希函数将键转换为一个数字,再对实例数量求模就能知道应该存储的实例。
**1. 客户端分片**
**客户端分片**
客户端使用一致性哈希等算法决定键应当分布到哪个节点。
**2. 代理分片**
**代理分片**
将客户端请求发送到代理上,由代理转发请求到正确的节点上。
**3. 服务器分片**
**服务器分片**
Redis Cluster。
# 事件
**1. 事件类型**
## 事件类型
(1) 文件事件:服务器有许多套接字,事件产生时会对这些套接字进行操作,服务器通过监听套接字来处理事件。常见的文件事件有:客户端的连接事件;客户端的命令请求事件;服务器向客户端返回命令结果的事件;
**文件事件**
(2) 时间事件:又分为两类,定时事件是让一段程序在指定的时间之内执行一次;周期性时间是让一段程序每隔指定时间就执行一次。
服务器有许多套接字,事件产生时会对这些套接字进行操作,服务器通过监听套接字来处理事件。常见的文件事件有:客户端的连接事件;客户端的命令请求事件;服务器向客户端返回命令结果的事件;
**2. 事件的调度与执行**
**时间事件**
又分为两类:定时事件是让一段程序在指定的时间之内执行一次;周期性时间是让一段程序每隔指定时间就执行一次。
## 事件的调度与执行
服务器需要不断监听文件事件的套接字才能得到待处理的文件事件,但是不能监听太久,否则时间事件无法在规定的时间内执行,因此监听时间应该根据距离现在最近的时间事件来决定。
@ -302,7 +310,7 @@ def aeProcessEvents():
# 获取到达时间离当前时间最接近的时间事件
time_event = aeSearchNearestTimer()
#计算最接近的时间事件距离到达还有多少毫秒
# 计算最接近的时间事件距离到达还有多少毫秒
remaind_ms = time_event.when - unix_ts_now()
# 如果事件已到达,那么 remaind_ms 的值可能为负数,将它设为 0
@ -338,7 +346,7 @@ def main():
clean_server()
```
事件处理的角度下服务器运行流程如下:
从事件处理的角度来看,服务器运行流程如下:
<div align="center"> <img src="../pics//73b73189-9e95-47e5-91d0-9378b8462e15.png"/> </div><br>
@ -346,21 +354,21 @@ def main():
两者都是非关系型内存键值数据库。有以下主要不同:
**1. 数据类型**
**数据类型**
Memcached 仅支持字符串类型,而 Redis 支持五种不同种类的数据类型,使得它可以更灵活地解决问题。
**2. 数据持久化**
**数据持久化**
Redis 支持两种持久化策略RDB 快照和 AOF 日志,而 Memcached 不支持持久化。
**3. 分布式**
**分布式**
Memcached 不支持分布式,只能通过在客户端使用像一致性哈希这样的分布式算法来实现分布式存储,这种方式在存储和查询时都需要先在客户端计算一次数据所在的节点。
Redis Cluster 实现了分布式的支持。
**4. 内存管理机制**
**内存管理机制**
在 Redis 中,并不是所有数据都一直存储在内存中,可以将一些很久没用的 value 交换到磁盘。而 Memcached 的数据则会一直在内存中。
@ -368,19 +376,19 @@ Memcached 将内存分割成特定长度的块来存储数据,以完全解决
# Redis 适用场景
**1. 缓存**
**缓存**
适用 Redis 作为缓存,将热点数据放到内存中。
**2. 消息队列**
**消息队列**
Redis 的 list 类型是双向链表,很适合用于消息队列。
Redis 的 List 类型是双向链表,很适合用于消息队列。
**3. 计数器**
**计数器**
Redis 这种内存数据库才能支持计数器的频繁读写操作。
**4. 好友关系**
**好友关系**
使用 set 类型的交集很容易就可以知道两个用户的共同好友。