Redis
1、 前言
主要是工作中用到redis,有的时候会因为某些点去重复的查询,索性对redis进行一次梳理,大致会从以下几方面去梳理:redis的简介;redis分布式锁;缓存穿透、缓存雪崩、缓存击穿下的解决措施……
2、 简介
Redis是远程内存数据库、非关系型数据库(non-relational database),可以存储键(key)与5种不同类 型的值(value)之间的映射(mapping),可以将存储在内存的键值对数据持久化到硬盘,可以使用复制特性来扩展读性能,还可以使用客户端分片来扩展写性能。
关键点:非关系型数据库、五种不同类型的值、持久化到硬盘的方式、复制特性(主从复制)、客户端分片
3、 关系型数据库和非关系型数据库
关系型数据库
-
定义:
- 采用关系模型来组织数据的数据库
- 简单的说,关系模型指的是二维表格模型,而一个关系型数据库就是由二维表及其之间的联系所组成的一个数据组织
-
优点
- 复杂查询:SQL
- 事务支持
非关系型数据库
-
定义:
- 指代那些非关系型的,分布式的,且一般不保证遵循ACID原则的数据存储系统。非关系型数据库严格上不是一种数据库,应该是一种数据结构化存储方法的集合
-
分类:
-
面向高性能并发读写的key-value数据库
- 特点:具有极高的并发读写性能
- 代表:Redis、Tokyo Cabinet、Flare
-
面向海量数据访问的文档数据库
- 特点:在海量数据中快速查询数据
- 代表:MongoDB、CouchDB
-
面向可扩展性的分布式数据库
- 特点:适应数据量的增加以及数据结构的变化
-
-
优点
- 性能:基于键值对且不需要经过SQL层解析
- 可扩展性:基础键值对,数据之间没有耦合性
4、 五种基本类型
数据类型 | 值类型 | 备注 |
---|---|---|
String | 字符串、整数或者浮点数 | / |
List | 列表 | 1. 可以储存多个相同的字符串<br/>2. 有序 |
Set | 无序集合 | 1. 通过使用散列表来保证自己存储的每个字符串都是各不相同的<br/>2. 无序 |
hash | 散列 | / |
zset | 有序集合 | / |
Redis命令参考:详细链接
5、 持久化
持久化的两种方式
- 参考:http://www.cnblogs.com/Fairy-...
- RDB持久化
- AOF持久化
RDB持久化
- 原理:RDB持久化是指在指定的时间间隔内将内存中的数据集快照写入磁盘,实际操作过程是fork一个子进程,先将数据集写入临时文件,写入成功后,再替换之前的文件,用二进制压缩存储
AOF持久化
- 原理:将Reids的操作日志以追加的方式写入文件
- 同步选项
选项 | 同步频率 | 备注 |
---|---|---|
always | 每个写命令都同步 | 会影响服务器性能 |
everysec | 每秒同步一次 | 比较好,可以保证系统奔溃时只会丢失一秒左右的数据 |
no | 让操作系统来决定何时同步 | 意义不大,会增加系统崩溃时的数据量 |
两种方式的选择
- AOF:牺牲一些性能,换取更高的缓存一致性
- RDB:写操作频繁的时候,不启用备份来换取更高的性能,待手动运行save的时候,再做备份
6、 主从复制
原因
单个Redis服务器会发生单点故障,并且一台服务器需要处理所有的请求负载,压力较大
实现机理
当启动一个Slave进程后,它会向Master发送一个SYNC Command,请求同步连接。无论是第一次连接还是重新连接,Master都会启动一个后台进程,将数据快照保存到数据文件中,同时Master会记录所有修改数据的命令并缓存在数据文件中。后台进程完成缓存操作后,Master就发送数据文件给Slave,Slave端将数据文件保存到硬盘上,然后将其在加载到内存中,接着Master就会所有修改数据的操作,将其发送给Slave端。若Slave出现故障导致宕机,恢复正常后会自动重新连接,Master收到Slave的连接后,将其完整的数据文件发送给Slave,如果Mater同时收到多个Slave发来的同步请求,Master只会在后台启动一个进程保存数据文件,然后将其发送给所有的Slave,确保Slave正常
7、为什么选用redis?
与其它数据库和软件的对比
名称 | 类型 | 数据库存储选项 | 查询类型 | 附加功能 |
---|---|---|---|---|
Redis | 使用内存存储(in-memory)的非关系数据库 | 字符串、列表、集合、散列表、有序集合 | 每种数据类型都有自己的专属命令,另外还有批量操作(bulk operation)和不完全(partial)的事务支持 | 发布与订阅,主从复制(master/slave replication),持久化,脚本(存储过程,stored procedure) |
memcached | 使用内存存储的键值缓存 | 键值之间的映射 | 创建命令、读取命令、更新命令、删除命令以及其他几个命令 | 为提升性能而设的多线程服务器 |
MySQL | 关系数据库 | 每个数据库可以包含多个表,每个表可以包含多个行;可以处理多个表的视图(view);支持空间(spatial)和第三方扩展 | SELECT、 INSERT、 UPDATE、 DELETE、函数、存储过程 | 支持ACID性质(需要使用InnoDB),主从复制和主主复制 (master/master replication) |
PostgreSQL | 关系数据库 | 每个数据库可以包含多个表,每个表可以包含多个行;可以处理多个表的视图;支持空间和第三方扩展;支持可定制类型 | SELECT、 INSERT、 UPDATE、 DELETE、内置函数、自定义的存储过程 | 支持ACID性质,主从复制,由第三方支持的多主复制(multi-master replication) |
MongoDB | 使用硬盘存储(on-disk)的非关系文档存储 | 每个数据库可以包含多个表,每个表可以包含多个无schema(schema-less)的BSON文档 | 创建命令、读取命令、更新命令、删除命令、条件查询命令等 | 支持map-reduce操作,主从复制,分片,空间索引(spatial index) |
优点
-
读写性能优异
- 因为数据存在内存中,类似于HashMap,HashMap的优势就是查找和操作的时间复杂度都是O(1)
- Redis能读的速度是110000次/s,写的速度是81000次/s 。
-
支持丰富数据类型
- string(字符串),list(列表),set(集合),zset(有序集合),hash(散列)
-
支持事务
- 操作都是原子性,所谓的原子性就是对数据的更改要么全部执行,要么全部不执行
-
丰富的特性
- 可用于缓存,消息,按key设置过期时间,过期后将会自动删除
缺点
- 本质上Redis是一个基于内存的cache,在数据落地、持久化方面不如mysql,如果redis达到了最大的内存限制后,会导致所有的写命令失败
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。