Redis学习
现在网站的特点:
- 1.高并发读写
- Web2.0网站,数据库并发负载非常高,往往达到每秒上万次的读写请求
- 2.高容量存储和高校存储
- Web2.0网站通常需要在后台数据库中存储海量数据,如何存储海量数据并进行高效的查询往往是一个挑战
- 3.高扩展性和高可用性
- 随着系统的用户量和访问量与日俱增,需要数据库能够很方便的进行扩展、维护。
NoSql数据库优势
1.易扩展
2.大数据量,高性能
3.灵活的数据模型
4高可用
Redis特点
1.Redis支持数据的持久化,可以将内存中的数据保持在磁盘中,重启的时候可以再次加载进行使用
2.Redis不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据结构的存储
3.Redis支持数据的备份,即master-slave(主从)模式的数据备份
Redis优势
1.性能极高-Redis能读的速度是110000次/s,写的速度是81000次/s
2.丰富的数据类型-Redis支持二进制安利的Strings,Lists,Hashes,Sets及Ordered Sets数据类型操作
3.原子-Redis的所有操作都是原子性的,同时Redis还支持对几个操作全并后的原子性执行
4.丰富的特性-Redis还支持publish/subscribe,通知key过期等等特性
5.采用单线程,避免了不必要的上下文切换和竞争条件,也不存在多线程或者多线程导致的切换而消耗CPU,不用去考虑各种锁的问题,不存在加锁释放锁操作,没有因为可能出现死锁而导致的性能消耗
6.使用多路I/O复用模型,非阻塞IO
Redis事务管理
Redis事务可以一次执行多个命令,并且带有以下两个重要的 保证:
事务是一个单独的隔离操作:事务中的所有命令都会序列化/按顺序地执行。事务在执行的过程中,不会被其他客户端发送来的命令请求所打断。
事务是一个原子操作:事务中的命令要么全部被执行,要么全部都不执行。
一个事务从开始到执行会经历以下三个阶段:
开始事务
命令入队
执行事务
Redis持久化
由于Redis的值放在内存中,为防止突然断电等特殊情况的发生,需要对数据进行持久化备份。即将内存数据保存到硬盘
Redis持久化存储方式
RDB持久化
RDB是以二进制文件,是在某个时间点将数据写入一个临时文件,持久化结束后,用这个临时文件替换上次持久化的文件,达到数据恢复。
优点:使用单独子进程来进行持久化,主进程不会进行任何IO操作,保证了Redis的高性能
缺点:RDB是间隔一段时间进行持久化,如果持久化之间Redis发生故障,会发生数据丢失。所以这种方式更适合数据要求不严谨的时候。
这里说的这个执行数据写入到临时文件的时间点是可以通过配置来自己确定的,通过配置Redis在n秒内如果超过m个key被修改这执行一次RDB操作,这个操作就类似于在这个时间点来保存一次Redis的所有数据,一次快照数据。所以这个持久化方法也通常叫做snapshots
AOF持久化
Append-Only File,将“操作+数据”以格式化指令的方式追加到操作日志文件的尾部,在append操作返回后(已经写入到文件或者将要写入),才进行实际的数据变更,“日志文件”保存了历史所有的做错过程;当server需要数据恢复时,可以直接replay此日志文件,即可还原所有的操作过程。AOF相对可靠,AOF文件内容是字符串,非常容易阅读和解析。
优点:可以保持更高的数据完整性,如果设置追加file的时间是1s,如果redis发生故障,最多会丢失1s的数据;且如果日志写入不完整支持redis-check-aof来进行日志修复;AOF文件没被rewrit之前(文件过大时会对命令进行合并重写),可以删除其中的某些命令(比如误操作的flushall)
缺点:AOF文件比RDB文件大,且回复速度慢
Redis主从复制
- 持久化保证了即使Redis服务重启也不会丢失数据,但是当Redis服务器的硬盘损坏了可能会导致数据丢失,通过Redis的主从复制机制就可以避免这种单点故障(单点服务器的故障)。
- 主Redis中的数据和从上的保持实时同步,当主Redis写入数据时通过主从复制机制复制到两个从服务上。
- 主从复制不会阻塞master,在同步数据时,master可以继续处理client请求。
- 主机master配置:无需配置。
工作中一般选用:一主两从或一主一从
主机一旦发生增删改操作,那么从机会自动将数据同步到从机中
从机不能执行写操作,只能读
复制的过程原理
- 当从库和主库建立MS(master slaver)关系后,会向主数据库发送SYNC命令;
- 主库接收到SYNC命令后会开始在后台保存快照(RDB持久化过程),并将期间接受到的写命令缓存起来;
- 快照完成后,主Redis会将快照文件和所有缓存的写命令发送给从Redis;
- 从Redis接收到后,会载入快照文件并且执行收到的缓存命令;
- 主Redis每当接收到写命令时就会将命令发送从Redis,保证数据的一致;[内部完成,所以不支持客户端在从机人为写数据]
复制架构中出现宕机情况?
从Redis宕机:重启就好
**主Redis宕机:**从数据库(从机)中执行SLAVEOF NO ONE命令,断开主从关系并且提升为主库继续服务[把一个从作为主机,这个时候新主机[之前的从机]就具备写入的能力];主服务器修好后,重新启动后,执行SLAVEOF命令,将其设置为从库[老主机设置为从机]。
Redis哨兵模式
**哨兵模式:**给集群分配一个站岗的
监控主数据库和从数据库是否运行正常
主数据出现故障后自动将从数据库转化为主数据库
如果主机宕机,开启选举工作,选择一个从机作为主机
环境准备:一主两从,启动任一从机时,启动哨兵模式
Redis集群方案
架构细节:
- 所有的Redis节点彼此互联(PING-PONG机制),内部使用二进制协议优化传输速度和宽带;
- 节点的fail是通过集群中超过半数的节点检测有效时整个集群才生效;
- 客户端与Redis节点直连,不需要中间proxy层,客户端不需要连接集群所有节点,连接集群中任何一个可用节点即可;
- Redis-cluster把所有的物理节点映射到[0-16383]slot上,cluster负责维护node->slot->value
Redis集群中内置了16384个哈希槽,当需要在Redis集群中放置一个key-value时,redis先对key使用crc16算法算出一个结果,然后把结果对16384求余数,这样每个key都会对应一个编号在0-16383之间的哈希槽,Redis会根据节点数量大致均等的将哈希槽映射到不同的节点