软考架构案例分析-重点回顾笔记3

160 阅读13分钟

1.什么是Redis?它主要用来做什么的? Redis,英文全称是Remote Dictionary Server (远程字典服务),是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。与MySQL数据库不同的是,Redis的数据是存在内存中的。它的读写速度非常快,每秒可以处理超过10万次读写操作。因此redis被广泛应用于缓存,另外,Redis也经常用来做分布式锁。除此之外,Redis支持事务、持久化、LUA脚本、LRU驱动事件、多种集群方案。

2.Redis的基本数据结构类型。 2.1Redis的五种基本数据类型。 字符串、哈希、列表、集合、有序集合。 2.2Redis的三种特殊数据类型。 Geo: Redis3.2推出的, 地理位置定位,用于存储地理位置信息,并对存储的信息进行操作。 HyperLogLog:用来做基数统计算法的数据结构,如统计网站的UV。 Bitmaps:用一个比特位来映射某个元素的状态,在Redis中,它的底层是基于字符串类型实现的,可以把bitmaps比作一个以比特位为单位的数组。

3.Redis为什么这么快? 3.1基于内存存储实现 3.2高效的数据结构: B+树的数据结构。 3.3合理的数据编码:Redis支持多种数据数据类型,每种基本类型,可能对多种数据结构。什么时候,使用什么样数据结构,使用什么样编码,是redis设计者总结优化的结果。 3.4合理的线程模型 IO多路复用: 其实就是一种同步IO模型,它实现了一个线程可以监视多个文件句柄;一旦某个文件句柄就绪,就能够通知应用程序进行相应的读写操作;而没有文件句柄就绪时,就会阻塞应用程序,交出cpu。单线程模型: Redis是单线程模型的,而单线程避免了CPU不必要的上下文切换和竞争锁的消耗。也正因为是单线程,如果某个命令执行过长( 如hgetall命令),会造成阻塞。Redis是 面向快速执行场景的数据库。所以要慎用如smembers和lrange、hgetall等命令。Redis 6.0引入了多线程提速,它的执行命令操作内存的仍然是个单线程。 3.5 虚拟内存机制: Redis直接自己构建了VM机制,不会像一般的系统会调用系统函数处理,会浪费一定的时间去移动和请求。

4.布隆过滤器 应对缓存穿透问题,我们可以使用布隆过滤器。布隆过滤器是什么呢? 布隆过滤器是一种占用空间很小的数据结构,它由一个很长的二进制向量和一组Hash映射函数组成,它用于检索一个元素是否在一个集合中,空间效率和查询时间都比一般的算法要好的多,缺点是有一定的误识别率和删除困难。

  1. Redis底层,使用的什么协议? RESP,英文全称是Redis Serialization Protocol,它是专i门]为redis设计的一套序列化协议.这个协议其实在redis的1.2版本时就已经出现了,但是到了redis2.0才最终成为redis通讯协议的标准。RESP主要有实现简单、解析速度快、可读性好等优点。

  2. 在生成RDB期间,Redis 可以同时处理写请求么? 可以的,Redis提供两个指令生成RDB,分别是save和bgsave。 如果是save指令,会阻塞,因为是主线程执行的。 如果是bgsave指令,是fork一个子进程来写入RDB文件的,快照持久化完全交给子进程来处理,父进程则可以继续处理客户端的请求。

  3. Redis的Hash冲突怎么办? Redis作为一个K-V的内存数据库,它使用一张全局的哈希来保存所有的键值对。这张哈希表由多个哈希桶组成,哈希桶中的entry元素保存了key和value指针,其中*key指向了实际的键,*value指 向了实际的值。哈希表查找速率很快的,有点类似于Java中的HashMap,它让我们在0(1)的时间复杂度快速找到键值对。首先通过key计算哈希值,找到对应的哈希桶位置,然后定位到entry,在entry找到对应的数据。 哈希冲突:通过不同的key,计算出一样的哈希值,导致落在同一个哈希桶中。 Redis为了解决哈希冲突,采用了链式哈希。链式哈希是指同一个哈希桶中,多个元素用一个链表来保存,它们之间依次用指针连接。

  4. Redis事务机制 Redis通过MULTI、EXEC, WATCH等一组命令集合,来实现事务机制。事务支持一次执行多个命令,一个事务中所有命令都会被序列化。在事务执行过程,会按照顺序串行化执行队列中的命令,其他客户端提交的命令请求不会插入到事务执行命令序列中。 简言之,Redis事务就是顺序性、一次性、排他性地执行一个队列中的一系列命令 。 Redis执行事务的流程如下: 开始事务(MULTI)、命令入队、执行事务(EXEC) 、撤销事务(DISCARD)。

9.什么是热Key问题,如何解决热key问题 什么是热Key呢?在Redis中,我们把访问频率高的key,称为热点key。 如果某一热点key的请求到服务器主机时,由于请求量特别大,可能会导致主机资源不足,甚至宕机,从而影响正常的服务。 而热点Key是怎么产生的呢?主要原因有两个: 用户消费的数据远大于生产的数据,如秒杀、热点新闻等读多写少的场景。 请求分片集中,超过单Redis服务器的性能,比如固定名称key, Hash落入同一台服务器,瞬间访问量极大,超过机器瓶颈,产生热点Key问题。 如何解决热key问题? Redis集群扩容: 增加分片副本,均衡读流量; 将热key分散到不同的服务器中; 使用二级缓存,即JVM本地缓存,减少Redis的读请求。

10.Redis的常用应用场景 10.1 缓存:我们一提到redis, 自然而然就想到缓存,国内外中大型的网站都离不开缓存。合理地利用缓存,比如缓存热点数据,不仅可以提升网站的访问速度,还可以降低数据库DB的压力。并且,Redis相比于memcached,还提供了丰富的数据结构,并且提供RDB和AOF等持久化机制。 10.2排行榜:当今互联网应用,有各种各样的排行榜,如电商网站的月度销量排行榜、社交APP的礼物排行榜、小程序的投票排行榜等等。Redis提供的zset数据类型能够实现这些复杂的排行榜。 以下是针对ZSet的常用操作命令: (1 )ZADD key score member [score member ..] 将一个或多个成员元素及其分数值加入到有序集合中。 (2) ZCARD key 返回有序集合中的成员数量。 (3)ZSCORE key member 返回有序集合中指定成员的分数。 (4)ZRANGE key start stop [WITHSCORES] 返回有序集合中指定索引范围内的成员,可选择返回成员的分数。 (5)ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count] 返回有序集合中分数范围内的成员,可选择返回成员的分数,并可指定返回结果的偏移量和数量。 (6) ZREM key member [member .. 移除有序集合中的一个或多个成员。 (7) ZINCRBY key increment member 将有序集合中指定成员的分数增加增量increment。 (8)ZCOUNT key min max 计算有序集合中分数范围内的成员数量。 (9)ZREVRANGE key start stop [WITHSCORES] 返回有序集合中指定逆序索引范围内的成员,可选择返回成员的分数。 (10)ZREVRANGEBYSCORE key max min [WITHSCORES] [LIMIT offset count] 返回有序集合中指定逆序分数范围内的成员,可选择返回成员的分数,并可指定返回结果的偏移量和数量。 10.3计数器应用:各大网站、APP应用经常需要计数器的功能,如短视频的播放数、电商网站的浏览数。这些播放数、浏览数一般要求实时的,每一次播放和浏览都要做加1的操作,如果并发量很大对于传统关系型数据的性能是一种挑战。Redis天然支持计数功能而且计数的性能也非常好,可以说是计数器系统的重要选择。 10.4共享Session:如果一个分布式Web服务将用户的Session信息保存在各自服务器,用户刷新一次可能就需要重新登录了,这样显然有问题。实际上,可以使用Redis将用户的Session进行集中管理,每次用户更新或者查询登录信息都直接从Redis中集中获取。 10.5 分布式锁:几乎每个互联网公司中都使用了分布式部署,分布式服务下,就会遇到对同一个资源的并发访问的技术难题,如秒杀、下单减库存等场景。可以用Redis的setnx来实现分布式的锁。 10.6 社交网络: 赞/踩、粉丝、共同好友/喜好、推送、下拉刷新等是社交网站的必备功能,由于社交网站访问量通常比较大,而且传统的关系型数据不太适保存这种类型的数据, Redis提供的数据结构可以相对比较容易地实现这些功能。 10.7 消息队列:是大型网站必用中间件,如ActiveMQ、 RabbitMQ、 Kafka等流行的消息队列中间件,主要用于业务解耦、流量削峰及异步处理实时性低的业务。Redis提供了发布/订阅及阻塞队列功能,能实现一个简单的消息队列系统。另外,这个不能和专业的消息中间件相比。 10.8 位操作: 用于数据量上亿的场景下,例如几亿用户系统的签到,去重登录次数统计,某用户是否在线状态等等。腾讯10亿用户,要几个毫秒内查询到某个用户是否在线,能怎么做?这里要用到位操作—使用setbit、getbit、 bitcount命令。原理是: redis内构建一个足够长的数组,每个数组元素只能是0和1两个值,然后这个数组的下标index用来表示用户id (必须是数字哈),那么很显然,这个几亿长的大数组就能通过下标和元素值(0和1)来构建一个记忆系统。

著作权权利(重点★★★★★)

  • 根据著作权法及实施条例规定,著作权人对作品享有 5 种权利

著作权法的主体(重点★★★★★)

.著作权权利(重点★★★★★)

保护期限(重点★★★★★)

层次结构的概念 1.层次式体系结构设计是将系统组成一个层次结构,每一层为上层服务,并作为下层客户。 2.层次式结构的内部结构只对相邻的层可见。 3.连接件通过决定层间如何交互的协议来定义,拓扑约束包括对相邻层间交互的约束。每一层最多只能影响两层,同时只要给相邻层提供相同的接口,允许每层使用不同的方法实现。 4.分层架构的一个特性是关注分离。 层次结构的设计原则 1."污水池反模式"即请求简单地穿过各层而没有实质性的业务逻辑。如果超过 20%的请求存在这种情况,应该考虑让一些层变得更加开放。 2.分层架构的缺点:

  • 分布模式复杂
  • 健壮性下降
  • 可靠性和性能下降
  • 代码规模膨胀 .表现层(重点★★★★★) 1.MVC (Model-View-Controller)模式。将应用程序的输入、处理和输出流程按照视图、控制和模型的方式进行分离。

3.MVP (Model-View-Presenter)模式。

  • 也包括模型、视图和控制器/呈现者三部分。
  • 与 MVC 的区别是视图和模型之间不直接交互,而是通过 Presenter 来进行。
  • MVP模式的优点包括模型与视图完全分离,可以更高效使用模型,可以将一个Presenter 用于多个视图等。

1.MVVM(Model-View-ViewModel)模式。

  • 为解决 MVP 中视图种类增多、接口增加的问题而提出。
  • 核心是视图模型 ViewModel,它通过数据绑定实现视图和模型的双向绑定。MVVM 更适用于数据驱动的场景,特别是数据操作频繁的场景。

1.表现层动态生成设计思想(重点★★★★★)

中间层架构设计(重点★★★★★)

  • 采用 Domain Model-Service-Control 的思想,实现业务层的解耦和重用。 1.Domain Model 表示领域对象 2.Service实现业务逻辑 3.Control负责服务之间的协调
  • 这些提高系统灵活性和扩展性

.数据访问层设计(重点★★★★★) 数据访问模式(重点★★★★★) 1.在线访问模式。是最基本的数据访问模式 2.DAO(Data Access Object)模式

  • 将底层数据访问操作与高层业务逻辑分离。DAO类包含访问特定数据源数据的具体逻辑。 1.DTO(Data Transfer Object)模式。
  • DTO 是用于跨进程或网络传输数据的对象容器,不包含业务逻辑。可以使用编程语言内置的集合对象或自定义类实现 DTO。 1.离线数据模式。
  • 数据从数据源获取后按预定义结构存放在系统中,与数据源连接或事务独立。
  • 可方便地与 XML 格式转换,不依赖具体数据源。 1.对象/关系映射。
  • 将应用程序中的对象转换为关系型数据库中的记录。 工厂模式在数据访问层的应用(重点★★★★★) 1.定义一个数据访问接口,根据不同数据库类型实例化相应的具体实现类。 2.通过工厂类根据数据库类型返回合适的数据访问实现 ORM 设计思想(重点★★★★★) 1.ORM(Object-Relation Mapping)。ORM 在关系型数据库和对象之间建立映射,应用程序可以像操作对象一样操作数据库。 2.使用ORM 可以大幅减少数据访问层的开发工作,专注于实现业务逻辑。 3.ORM通过缓存机制优化性能,将数据库存储和业务层解耦。
  • Hibernate 是一个功能强大的 ORM 框架,可以自动完成从 Java对象到数据库表的映射。
  • Hibernate 提供了对象化的数据访问接口,开发者可以专注于面向对象开发,不需要关心底层 SQL。

事务处理(重点★★★★★)

  • 事务应该遵循 ACID 原则,即原子性、一致性、隔离性和持久性。 连接对象管理(重点★★★★★) 1.数据库连接管理是关键性能因素。 2.可以使用连接池模式进行优化。 3.连接池在系统初始化时分配连接,并提供灵活的连接分配和释放策略。 4.连接池可以有效复用数据库连接,减少连接建立和关闭的开销 物联网层次架构设计 1.感知层 2.网络层 3.应用层 ————————————————

                          版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
                      
    

原文链接:blog.csdn.net/wjianwei666…