Redis(一) - 简介

Redis

一、 前言

主要是工做中用到redis,有的时候会由于某些点去重复的查询,索性对redis进行一次梳理,大体会从如下几方面去梳理:redis的简介;redis分布式锁;缓存穿透、缓存雪崩、缓存击穿下的解决措施……

二、 简介

Redis是远程内存数据库、非关系型数据库(non-relational database),能够存储键(key)与5种不一样类 型的值(value)之间的映射(mapping),能够将存储在内存的键值对数据持久化到硬盘,可使用复制特性来扩展读性能,还可使用客户端分片来扩展写性能。html

关键点:非关系型数据库、五种不一样类型的值、持久化到硬盘的方式、复制特性(主从复制)、客户端分片mysql

三、 关系型数据库和非关系型数据库

关系型数据库

  • 定义:redis

    • 采用关系模型来组织数据的数据库
    • 简单的说,关系模型指的是二维表格模型,而一个关系型数据库就是由二维表及其之间的联系所组成的一个数据组织
  • 优势sql

    • 复杂查询:SQL
    • 事务支持

非关系型数据库

  • 定义:数据库

    • 指代那些非关系型的,分布式的,且通常不保证遵循ACID原则的数据存储系统。非关系型数据库严格上不是一种数据库,应该是一种数据结构化存储方法的集合
  • 分类:缓存

    • 面向高性能并发读写的key-value数据库服务器

      • 特色:具备极高的并发读写性能
      • 表明:Redis、Tokyo Cabinet、Flare
    • 面向海量数据访问的文档数据库数据结构

      • 特色:在海量数据中快速查询数据
      • 表明:MongoDB、CouchDB
    • 面向可扩展性的分布式数据库多线程

      • 特色:适应数据量的增长以及数据结构的变化
  • 优势并发

    • 性能:基于键值对且不须要通过SQL层解析
    • 可扩展性:基础键值对,数据之间没有耦合性

四、 五种基本类型

数据类型 值类型 备注
String 字符串、整数或者浮点数 /
List 列表 1. 能够储存多个相同的字符串<br/>2. 有序
Set 无序集合 1. 经过使用散列表来保证本身存储的每一个字符串都是各不相同的<br/>2. 无序
hash 散列 /
zset 有序集合 /

Redis命令参考:详细连接

五、 持久化

持久化的两种方式

RDB持久化

  • 原理:RDB持久化是指在指定的时间间隔内将内存中的数据集快照写入磁盘,实际操做过程是fork一个子进程,先将数据集写入临时文件,写入成功后,再替换以前的文件,用二进制压缩存储
    图片描述

AOF持久化

  • 原理:将Reids的操做日志以追加的方式写入文件

    图片描述

  • 同步选项
选项 同步频率 备注
always 每一个写命令都同步 会影响服务器性能
everysec 每秒同步一次 比较好,能够保证系统奔溃时只会丢失一秒左右的数据
no 让操做系统来决定什么时候同步 意义不大,会增长系统崩溃时的数据量

两种方式的选择

  • AOF:牺牲一些性能,换取更高的缓存一致性
  • RDB:写操做频繁的时候,不启用备份来换取更高的性能,待手动运行save的时候,再作备份

六、 主从复制

缘由

单个Redis服务器会发生单点故障,而且一台服务器须要处理全部的请求负载,压力较大

实现机理

当启动一个Slave进程后,它会向Master发送一个SYNC Command,请求同步链接。不管是第一次链接仍是从新链接,Master都会启动一个后台进程,将数据快照保存到数据文件中,同时Master会记录全部修改数据的命令并缓存在数据文件中。后台进程完成缓存操做后,Master就发送数据文件给Slave,Slave端将数据文件保存到硬盘上,而后将其在加载到内存中,接着Master就会全部修改数据的操做,将其发送给Slave端。若Slave出现故障致使宕机,恢复正常后会自动从新链接,Master收到Slave的链接后,将其完整的数据文件发送给Slave,若是Mater同时收到多个Slave发来的同步请求,Master只会在后台启动一个进程保存数据文件,而后将其发送给全部的Slave,确保Slave正常

七、为何选用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达到了最大的内存限制后,会致使全部的写命令失败
相关文章
相关标签/搜索