Redis基础介绍

本文深入介绍了Redis的基础知识,包括与MySQL的对比,以及SQL与NoSQL的区别。接着详细讨论了Redis的持久化机制,如RDB和AOF,并探讨了Redis的高可用性解决方案——哨兵模式,包括其结构、工作方式和故障转移过程。此外,还介绍了Redis Cluster的主要特性和设计,包括数据切片和一致性哈希。文章最后详细阐述了一致性Hash算法,解释了其优势以及如何解决数据倾斜问题。
摘要由CSDN通过智能技术生成

什么是Redis

(1)Redis 是一个开源(BSD许可)的,内存中的数据结构存储系统,它可以用作数据库、缓存和消息中间件。 它支持多种类型的数据结构,如 字符串(strings), 散列(hashes), 列表(lists), 集合(sets), 有序集合(sorted sets) 与范围查询, bitmaps, hyperloglogs 和 地理空间(geospatial) 索引半径查询。 Redis 内置了 复制(replication),LUA脚本(Lua scripting), LRU驱动事件(LRU eviction),事务(transactions) 和不同级别的 磁盘持久化(persistence), 并通过 Redis哨兵(Sentinel)和自动分区(Cluster)提供高可用性(high availability)。
(2)Redis是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。从2010年3月15日起,Redis的开发工作由VMware主持。从2013年5月开始,Redis的开发由Pivotal赞助。
(3)redis是一个key-value存储系统。和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)set(集合)、zset(sorted set --有序集合)和hash(哈希类型)。这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。在此基础上,redis支持各种不同方式的排序。与memcached一样,为了保证效率,数据都是缓存在内存中。区别的是redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。
(4)Redis 是一个高性能的key-value数据库。 redis的出现,很大程度补偿了memcached这类key/value存储的不足,在部 分场合可以对关系数据库起到很好的补充作用。它提供了Java,C/C++,C#,PHP,JavaScript,Perl,Object-C,Python,Ruby,Erlang等客户端,使用很方便。
(5)Redis支持主从同步。数据可以从主服务器向任意数量的从服务器上同步,从服务器可以是关联其他从服务器的主服务器。这使得Redis可执行单层树复制。存盘可以有意无意的对数据进行写操作。由于完全实现了发布/订阅机制,使得从数据库在任何地方同步树时,可订阅一个频道并接收主服务器完整的消息发布记录。同步对读取操作的可扩展性和数据冗余很有帮助。
(6)redis的官网地址,非常好记,是redis.io。(特意查了一下,域名后缀io属于国家域名,是british Indian Ocean territory,即英属印度洋领地)目前,Vmware在资助着redis项目的开发和维护。

redis和mysql的区别

  • mysql和redis的数据库类型
    mysql是关系型数据库,主要用于存放持久化数据,将数据存储在硬盘中,读取速度较慢。
    redis是NOSQL,即非关系型数据库,也是缓存数据库,即将数据存储在缓存中,缓存的读取速度快,
    能够大大的提高运行效率,但是保存时间有限。

  • mysql的运行机制
    mysql作为持久化存储的关系型数据库,相对薄弱的地方在于每次请求访问数据库时,都存在着I/O操作,如果反复频繁的访问数据库。
    第一:会在反复链接数据库上花费大量时间,从而导致运行效率过慢;
    第二:反复的访问数据库也会导致数据库的负载过高,那么此时缓存的概念就衍生了出来。

  • 缓存
    缓存就是数据交换的缓冲区(cache),当浏览器执行请求时,首先会对在缓存中进行查找,如果存在,就获取;否则就访问数据库。
    缓存的好处就是读取速度快

  • redis数据库
    redis数据库就是一款缓存数据库,用于存储使用频繁的数据,这样减少访问数据库的次数,提高运行效率。

MySQL是关系型数据库,是持久化存储的,查询检索的话,会涉及到磁盘IO操作,为了提高性能,可以使用缓存技术,而memcached就是内存数据库,数据存储在内存中(当然也可以进行持久化存储),可以用作缓存数据库。用户首先去memcached查询数据,如果未查询到(即缓存未命中),才去MySQL中查询数据,查询到的数据会更新到缓存数据库中,提供给下次可能进行的查询。提高了数据查询方面的性能。
Redis和memcached都是缓存数据库,可以大大提升高数据量的web访问速度。
但是memcached只是提供了简单的数据结构string,而Redis的value可以是string、list、set、hash、sorted set这些,功能更加强大。
web应用中一般采用MySQL+Redis的方式,web应用每次先访问Redis,如果没有找到数据,才去访问MySQL。
Redis是内存数据库,数据保存在内存中,访问速度快。MySQL是关系型数据库,功能强大,存储在磁盘中,数据访问速度慢。像memcached,MongoDB,Redis等,都属于No sql系列。

sql和nosql的区别

SQL (Structured Query Language) 数据库,指关系型数据库。主要代表:SQL
Server,Oracle,MySQL(开源),PostgreSQL(开源) NoSQL(Not Only
SQL)泛指非关系型数据库。主要代表:MongoDB,Redis,CouchDB

  • 存储方式
    SQL数据存在特定结构的表中;而NoSQL则更加灵活和可扩展,存储方式可以省是JSON文档、哈希表或者其他方式。
    SQL通常以数据库表形式存储数据

  • 表/数据集合的数据的关系
    在SQL中,必须定义好表和字段结构后才能添加数据,例如定义表的主键(primary key),索引(index),触发器(trigger),存储过程(stored procedure)等。表结构可以在被定义之后更新,但是如果有比较大的结构变更的话就会变得比较复杂。
    在NoSQL中,数据可以在任何时候任何地方添加,不需要先定义表。
    NoSQL也可以在数据集中建立索引。以MongoDB为例,会自动在数据集合创建后创建唯一值_id字段,
    这样的话就可以在数据集创建后增加索引。
    从这点来看,NoSQL可能更加适合初始化数据还不明确或者未定的项目中。

  • 外部数据存储
    SQL中如何需要增加外部关联数据的话,规范化做法是在原表中增加一个外键,关联外部数据表。
    而在NoSQL中除了这种规范化的外部数据表做法以外,我们还能用非规范化方式把外部数据直接放到原数据集中,以提高查询效率。

  • SQL中的JOIN查询
    SQL中可以使用JOIN表链接方式将多个关系数据表中的数据用一条简单的查询语句查询出来。
    NoSQL暂未提供类似JOIN的查询方式对多个数据集中的数据做查询。所以大部分NoSQL使用非规范化的数据存储方式存储数据。

  • 数据耦合性
    SQL中不允许删除已经被使用的外部数据,以保证数据完整性。而NoSQL中则没有这种强耦合的概念,可以随时删除任何数据。

  • 事务
    SQL中如果多张表数据需要同批次被更新,即如果其中一张表更新失败的话其他表也不能更新成功。
    这种场景可以通过事务来控制,可以在所有命令完成后再统一提交事务。
    而NoSQL中没有事务这个概念,每一个数据集的操作都是原子级的。

  • 查询性能
    在相同水平的系统设计的前提下,因为NoSQL中省略了JOIN查询的消耗,故理论上性能上是优于SQL的。

目前许多大型互联网项目都会选用MySQL(或任何关系型数据库) + NoSQL的组合方案。

关系型数据库适合存储结构化数据
1)这些数据通常需要做结构化查询(嗯,好像是废话),比如join,这时候,关系型数据库就要胜出一筹
2)这些数据的规模、增长的速度通常是可以预期的
3)事务性、一致性

NoSQL适合存储非结构化数据,
1)这些数据通常用于模糊处理,如全文搜索、机器学习
2)这些数据是海量的,而且增长的速度是难以预期的,
3)根据数据的特点,NoSQL数据库通常具有无限(至少接近)伸缩性
4)按key获取数据效率很高,但是对join或其他结构化查询的支持就比较差
基于它们的适用范围不同,目前主流架构才会采用组合方案,一个也不能少。
目前为止,还没有出现一个能够通吃各种场景的数据库,而且根据CAP理论,这样的数据库是不存在的。
redis是Nosql数据库,是一个key-value存储系统
虽然redis是key-value的存储系统,但是redis支持的value存储类型是非常的多,比如字符串、链表、集合、有序集合和哈希
那么为什么要使用类似redis这样的Nosql数据库呢?
(1) 当数据量的总大小一个机器放不下时;
(2)数据索引一个机器的内存放不下时;
(3)访问量(读写混合)一个实例放不下时。
单机时代,存储只用一台机器装mysql,如果每次存储成千上万条数据,这样很会导致mysql的性能很差,存储以及读取速度很慢,然后就演变成缓存+mysql+垂直拆分的方式。
Cache作为中间缓存时代,将所有的数据先保存到缓存中,然后再存入mysql中,减小数据库压力,提高效率。
但是当数据再次增加到又一个量级,上面的方式也不能满足需求,由于数据库的写入压力增加,缓存只能缓解数据库的读取压力。读写集中在一个数据库上让数据库不堪重负,大部分网站开始使用主从复制技术来达到读写分离,以提高读写性能和读库的可扩展性。Mysql的master-slave模式成为这个时候的网站标配了。
主从分离模式时代,在redis的高速缓存,MySQL的主从复制,读写分离的基础之上,这时MySQL主库的写压力开始出现瓶颈,而数据量的持续猛增,由于MyISAM使用表锁,在高并发下会出现严重的锁问题,大量的高并发MySQL应用开始使用InnoDB引擎代替MyISAM。

Nosql数据库的优势

(1)易扩展
这些类型的数据存储不需要固定的模式,无需多余的操作就可以进行横向的扩展。
相对于关系型数据库可以减少表和字段特别多的情况。也无型之间在架构的层面上带来了可扩展的能力
(2)大数据量提高性能
(3)多样灵活的数据模型

redis的应用

Redis 在 Java Web 中的应用
Redis 在 Java Web 主要有两个应用场景:
存储缓存用的数据;需要高速读/写的场合使用它快速读/写;

持久化

RDB快照(snapshot)

在默认情况下, Redis 将内存数据库快照保存在名字为dump.rdb的二进制文件中。
你可以对 Redis 进行设置, 让它在N秒内数据集至少有M个改动这一条件被满足时, 自动保存一次数据集。
比如说, 以下设置会让 Redis 在满足60秒内有至少有
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值