摘抄一点关于redis的简单概念,加深理解同时练习打字
从NoSQL数据库说起:
Nosql的全称是Not Only Sql,可以理解为非关系型数据库,或者理解为不仅仅是Sql,也就是可以应用在某些常见关系型数据库不适合的场景,常用关系型数据库如mysql,sqlserver等,一般用来存储重要信息,应对普通的业务没有问题。但是,随着互联网的高速发展,传统的关系型数据库在应付超大规模,超大流量以及高并发的时候力不从心。而就在这个时候,Nosql得到的高速的发展,常见的NoSQL有Mongodb和Redis等。
关于Redis的简单介绍:
Redis是一种基于键值对(key-value)的NoSQL数据库,与很多键值对数据库不同的地方在于,Redis中的值可以是由string(字符串)、hash(哈希)、list(列表)、set(集合)、zset(有序集合)等数据结构组成。因此,Redis可以满足很多的应用场景。
由于Redis会将所有数据都存放在内存中,因而它的读写性能非常惊人。不仅如此,Redis还可以将内存的数据利用快照和日志的形式保存到硬盘上,这样在发生类似断电或者机器故障的时候,内存中的数据不会“丢失”。
除了上述功能以外,Redis还提供了键过期、发布订阅、事务、流水线、Lua脚本等附加功能。
Redis特性:
1、速度快
2、基于键值对的数据结构服务器
3、丰富的功能
4、简单稳定
5、客户端语言多
6、持久化
7、支持主从复制
8、高可用和分布式
Redis应用场景:
1、缓存
2、排行榜系统
由于一个玩家名次上升x位将会引起x+1位玩家的名次发生变化(包括该玩家),如果采用传统数据库(比如MySQL)来实现排行榜,当玩家人数较多时,将会导致对数据库的频繁修改,性能得不到满足。
3、计数器应用
4、社交网络
5、消息队列系统
Redis单线程架构
Redis是单线程来处理命令的,一条命令从客户端达到服务端不会立刻被执行,所有命令都会进入一个队列,然后逐个被执行。
单线程保证运行速度的方法
1、纯内存访问;
2、非阻塞I/O,Redis使用epoll作为I/O多路复用技术的实现,再加上Redis自身的事件处理模型将epoll中的连接、读写、关闭都转换为事件,不在网络I/O上浪费过多的时间;
3、单线程避免线程切换和竞态产生的消耗。
持久化
Redis是内存型数据库,为了保证数据在断电后不会丢失,需要将内存中的数据持久化到硬盘上。
RDB持久化(SNAPSHOTTING)
将某个时间点的所有数据都存放到硬盘上;
可以将快照复制到其他服务器从而创建具有相同数据的服务器副本;
如果系统发生故障,将会丢失最后一次创建快照之后的数据;
如果数据量很大,保存快照的时间会很长。
AOF持久化
将写命令添加到AOF文件(Append only File)的末尾;
使用AOF持久化需要设置同步选项,从而确保写命令什么时候会同步到磁盘文件。这是由于对文件进行写入并不会马上将内容同步到磁盘上,而是先存储到缓冲区,然后由操作系统决定什么时候同步到磁盘。
注意:
- Redis 默认开启RDB持久化方式,在指定的时间间隔内,执行指定次数的写操作,则将内存中的数据写入到磁盘中。
- RDB 持久化适合大规模的数据恢复但它的数据一致性和完整性较差。
- Redis 需要手动开启AOF持久化方式,默认是每秒将写操作日志追加到AOF文件中。
- AOF 的数据完整性比RDB高,但记录内容多了,会影响数据恢复的效率。
- Redis 针对 AOF文件大的问题,提供重写的瘦身机制。
- 若只打算用Redis 做缓存,可以关闭持久化。
- 若打算使用Redis 的持久化。建议RDB和AOF都开启。其实RDB更适合做数据的备份,留一后手。AOF出问题了,还有RDB
主从复制
slave of ip(主机) port (主机),就可以确定主从关系;一个命令:.redis-sentinel sentinel.conf ,就可以开启哨兵监控。
避免Redis单点故障,实现容灾恢复效果(高可用)。读写分离的架构,满足读多写少的并发应用场景。
哨兵(Sentinel)可以监控集群中的服务器,并在主服务器进入下线状态时,自动从从服务器中选出新的主服务器。
原理
全量复制
实现原理:建立主从关系时,从机会给主机发送sync命令,主机接收命令,后台启动的存盘进程,同时收集所有用于修改命令,传送给从机。
增量复制
实现原理:主机会继续将新收集到的修改命令依次传给从机,实现数据的同步效果。
主从复制的缺点
Redis的主从复制最大的缺点就是延迟,主机负责写,从机负责备份,这个过程有一定的延迟,当系统很繁忙的时候,延迟问题会更加严重,从机器数量的增加也会使这个问题更加严重。
Redis Cluster(Redis集群)
分布式数据库首先要解决把整个数据集按照分区规则映射到多个节点的问题,即把数据集划分到多个节点上,每个节点负责整体数据的一个子集。
https://www.cnblogs.com/itdragon/p/7932178.html
https://www.cnblogs.com/lukexwang/p/4711977.html