当前位置: 首页 > 科技观察

下面简单说说Redis的高级特性

时间:2023-03-13 11:46:41 科技观察

Redis的数据结构Redis中常用的数据类型有五种:StringHashListSetSortedsetRedis内部使用一个redisObject对象来表示所有的key和value。redis内部存储的String默认是字符串,由redisObject引用。遇到incr、decr等运算时,会转成数值类型进行计算。此时redisObject的编码字段为int。list的实现是一个双向链表,可以支持反向查找和遍历,操作起来比较方便,但是会带来一些额外的内存开销。Redis中的很多实现,包括发送缓冲队列,也都使用了这个数据结构。Value对应的Hash其实里面就是一个HashMap,这里其实有两种不同的实现。当这个Hash的成员比较少的时候,Redis为了节省内存,会使用类一维数组的方式进行紧凑存储,而不是使用真正的HashMap结构。对应值redisObject的编码是zipmap。当成员数量增加时,会自动转换成真正的HashMap。此时编码为ht。Redis存储Redis提供了一系列不同的持久化选项:RDB持久化以指定的时间间隔执行数据集的时间点快照。AOF持久化记录服务器收到的每一次写操作,当服务器启动时会再次执行,重构原始数据集。使用与Redis协议本身相同的格式以追加方式记录命令。RDB的优点:RDB是Redis数据的一种非常紧凑的单文件时间点表示。RDB文件非常适合备份。RDB的缺点:快照不是很持久。如果运行Redis的计算机停止运行、电源线出现故障或您的实例意外终止,则最近写入Redis的数据将丢失。为了使用子进程将RDB保留在磁盘上,RDB需要经常进行分叉。如果数据集很大,fork会很耗时,可能会导致Redis在几毫秒内停止为客户端提供服务,如果数据集非常大且CPU性能很差,甚至会导致一秒。当Redis需要将数据集转储到磁盘时,会发生以下情况:Redis分叉。我们现在有一个子进程和一个父进程。子进程开始将数据集写入临时RDB文件。当子进程完成写入新的RDB文件时,它会替换旧的。AOF的优点:AOF日志是append-only日志,所以如果断电,不会有问题。AOF的缺点:对于相同的数据集,AOF文件通常比等效的RDB文件大。根据确切的fsync策略,AOF可能比RDB慢。Redis在磁盘上同步数据的次数。共有三个选项:每当新命令附加到AOF时进行fsync。非常非常慢而且非常安全。每秒fsyncs。足够快(可能和2.4中的snapshot一样快),万一发生灾难,你可能会丢失1秒的数据。永远不要fsync,只需将您的数据交给操作系统即可。更快、更不安全的方法。日志重写使用与快照相同的写时复制技巧。这是如何工作的:Redis分叉,所以现在我们有子进程和父进程。子进程开始在临时文件中写入新的AOF父进程将所有新更改累积到内存缓冲区中当子进程完成重写文件时,父进程收到信号并将内存缓冲区追加到生成的文件末尾通过该区域的子进程内容。Redis自动将旧文件重命名为新文件,并开始向新文件追加新数据。Redis事务Redis提供的事务机制与传统的数据库事务有些不同。传统的数据库事务必须保持以下特性:原子性、一致性、隔离性、持久性,简称ACID。原子性(Atomicity)Redis本身提供的所有API都是原子操作。但是Redis在事务执行出错的情况下做了一个权衡,即放弃了回滚。Redis官方文档给出的解释是:1、Redis操作失败的原因只能是语法错误或者错误的数据库类型操作。这些都是在开发层面可以发现的问题,不会进入生产环境,所以不需要回滚。2、Redis的内部设计崇尚简洁和高性能,所以不需要回滚能力。一致性(Consistency)一致性是指事务结束后,系统中的数据仍然保证是一致的。Redis放弃了回滚的设计,基本放弃了对数据一致性的有效保证。隔离(Isolation)隔离确保在事务完成之前,事务外无法看到事务中的数据变化。Redis采用单线程设计,隔离性有保障。持久性(Durability)Redis一般只进行内存计算和操作,无法保证持久性。不过Redis也提供了两种数据持久化模式,RDB和AOF。RDB持久化操作和命令操作不同步,无法保证事务持久化。AOF模式是指每条命令的执行都需要系统调用来操作磁盘写文件,可以保证持久化,但是会大大降低Redis的访问性能。Redismaster-slaveRedis的主从结构可以采用主多从或级联结构:全同步Redis全复制一般发生在Slave初始化阶段,Slave需要复制Master上的所有数据。具体步骤如下:1)从服务器连接到主服务器,发送SYNC命令;2)master服务器收到SYNC名称后,开始执行BGSAVE命令生成RDB文件,并使用缓冲区记录此后执行的所有写命令;3)主服务器BGSAVE执行后,向所有从服务器发送快照文件,并在发送过程中继续记录执行过的写命令;4)从服务器接收到快照文件后丢弃所有旧数据,并加载接收到的快照;5)主服务器快照发送后,开始向从服务器发送缓冲区中的写命令;6)完成从服务器加载快照,开始接收命令请求,从主服务器缓冲区执行写命令增量同步。Redis增量复制是指在从服务器初始化并开始正常工作时,将主服务器上发生的写操作同步到从服务器的过程。增量复制的过程主要是主服务器每执行一次写命令就向从服务器发送相同的写命令,从服务器接收并执行收到的写命令。Redis场景下常见的NoSQL解决方案分为四类。K-V存储:解决关系型数据库不能存储数据结构的问题,以Redis为代表。文档数据库:解决关系型数据库模式约束强的问题,以MongoDB为代表。列式数据库:解决关系型数据库大数据场景下的I/O问题,以HBase为代表。全文搜索引擎:解决关系型数据库的全文搜索性能问题,以Elasticsearch为代表。缓存架构设计要点:缓存穿透就是缓存不发挥作用。虽然业务系统去缓存中查询数据,但是缓存中没有数据,业务系统需要再次查询存储系统。通常有两种情况:1、存储的数据不存在。2.缓存数据的生成耗时较长或者资源缓存雪崩是指缓存失效(过期)后系统性能急剧下降的情况。缓存热点的解决方案是复制多个缓存副本,将请求分发到多个缓存服务器,减少缓存热点对单个缓存服务器的压力。读写分离+多级缓存策略首页分流加载