Redis初解之原理

来源:互联网 发布:js对象数组转json 编辑:程序博客网 时间:2024/06/03 21:09

一、Redis是什么?

先看百科描述:

redis是一个key-value存储系统和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sorted set --有序集合)和hash(哈希类型)。这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。在此基础上,redis支持各种不同方式的排序。与memcached一样,为了保证效率,数据都是缓存在内存中。区别的是redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。Redis 是一个高性能的key-value数据库。

我们看到了什么:

1.redis是存储系统

2.与Memcached比较,说明两者同类型,但有扩展。

3.支持存储类型:sting(字符串)、list(链表)、set(集合)、zset(有序集合)、hash(哈希)

4.数据存入内存,并周期性的写入磁盘。

5.存储数据结构:key-value

总结:redis是非关系型数据库的一种,Nosql:no only sql 泛指非关系型数据库。因为数据存入内存中,也叫内存数据库,或者缓存数据库。

我们知道,当我们访问数据库时,建立数据库连接,执行sql,断开连接,而且,从数据库磁盘取出数据。对于计算机来说,这是相当缓慢而且麻烦的过程。如果我们把常用的数据能存入内存中,那么读取起来,不就是很快了么。所以,redis就是用来存储我们常用的数据,而且是直接存入内存,而不需要访问磁盘获取。达到提升系统性能的作用。

memcached:mecached也是常见的缓存数据库的一种,数据结构也是key-value。但是只能存储string类型,而且Key字符串的长度不能超过255个字符;Value字符串的长度不能超过1024 * 1024个字符, 即存储数据不能超过1M;在很多时候,会显得内容不足。

redis:以上解释让我们知道了缓存数据库是啥。redis比之Mamcached的优势:

1.redis不仅仅把数据存入内存,而且会按照策略将数据备份到磁盘中,如果服务器宕机或者重启,redis会自动从磁盘中加载备份的数据放入内存,可以一定程度上防止数据丢失。

2.在数据的存储长度上:弥补了Memcached存储数据不足的缺陷

字符串类型 string 512M

散列类型 hash 2^32-1

列表类型 list 2^32-1

集合类型 set 2^32-1


二、持久化方式

所谓持久化,就是讲内存中的数据存储到硬盘上,让数据能长期保存。

内存存储数据,快速访问数据,redis通常用于互联网行业,采用缓存服务器集群以提升系统运行效率,但是,内存数据会在系统关闭时清除,为了数据安全,redis提供了两种将数据持久化到硬盘上的方式。

1.rdb:save, shutdown, slave 命令会触发这个操作。即将整个进程中的数据都dump下来,放入文件中保存,在触发保存操作之后,内存中的数据会以一定的格式写入.rdb这个文件。在服务器宕机或者意外停止,再重启的时候,redis会自动加载这个文件,将文件中保存的数据读入内存中。

优点:在没有命令或者时间策略控制数据写入硬盘的时候,redis不额外的操作磁盘,redis的效率不受影响(因为做保存这个操作,肯定也需要占用CPU的)。

缺点:如果服务器崩溃,那么没有来得及保存下来的文件,就会丢失。

2.aof: 把写操作指令,持续的写到一个类似日志文件里。(类似于从postgresql等数据库导出sql一样,只记录写操作)粒度较小,crash之后,只有crash之前没有来得及做日志的操作没办法恢复。

优点:以日志方式保存数据,占用空间小与rdb。能更好的将数据保存到磁盘。

缺点:记录日志肯定会消耗CPU的,性能会受影响。

对比总结:rdb是先操作一批数据,然后将这些数据一起写入磁盘。在内存操作数据时效率不受影响,但是写入磁盘的时候数据可能会比较多。

aof是一边操作数据,一边将操作记录以日志的形式写入磁盘。会一边执行缓存操作,一边执行持久化备份操作。

形象点说:rdb是将一篇文章写完了,再点击保存。aof是在写文章的同时,分出一部分cpu来同步保存。


三、redis应用方式(此处只讲原理,不讲命令和配置方式、后文继续补充) :分片、哨兵、集群。

r edis数据库是用来作为数据缓存数据库,以提高系统的读取性能。那么具体如何设计架构呢。


图片有我一贯的风格(不喜勿喷)

讲解一波:

1.前台向后台服务器请求数据

2.后台请求redis缓存数据库

3.redis返回结果判断

4.有数据,则返回后台。无数据,则请求数据库。

5.数据库查询数据,

6.数据库查询结果返回后台并存入redis一份,以便下次访问

原理如上,如此配置的理由很简单,数据库无法同时支撑大量的链接,高并发会崩溃。而redis数据在内存,可以抗住大量并发,而且查询速度快。

未完待续.....

redis应用层次:分片、哨兵、集群。其具体原理和配置,待后续更新。