Laravel框架中控制反转和依赖注入功能是怎么实现的?
其实控制反转和依赖注入是一种设计思想,它最早源于Java Spring框架设计中的机制,所以身边如果有做Java开发的小伙伴~简单聊聊就能明白许多。
1.依赖注入
依赖注入(Dependency Injection),通俗的解释是当我们构建对象时需要的参数,只要不是手动创建而是以实例对象的形式注入都可以称为依赖注入。
举个例子,一个小游戏中玩家可以创建不同的职业。
1 | // 职业接口 |
Laravel框架中控制反转和依赖注入功能是怎么实现的?
其实控制反转和依赖注入是一种设计思想,它最早源于Java Spring框架设计中的机制,所以身边如果有做Java开发的小伙伴~简单聊聊就能明白许多。
依赖注入(Dependency Injection),通俗的解释是当我们构建对象时需要的参数,只要不是手动创建而是以实例对象的形式注入都可以称为依赖注入。
举个例子,一个小游戏中玩家可以创建不同的职业。
1 | // 职业接口 |
之前简单了解过Mysql的索引,今天来学习一下Mysql(InnoDB)的聚簇索引以及SQL为什么会产生回表查询?
都知道Mysql存储的数据结构是B+Tree,所以当查询数据的时候能最快找到叶子节点的检索方式时是最快的。比如:主键直接定位行记录,而有些查询需要先检索索引树找到叶子节点的主键值,再通过主键值定位行记录这种扫描2次索引树的方式就叫做回表查询。
如何确定SQL语句会不会造成回表查询?如下表:
1 | CREATE TABLE `users` ( |
2种查询方式:
网上购物看到自己喜欢的东西加入购物车然后付款,但是在付款的突然不想要了 … 往往这个订单会给一个30分钟的支付时间,时间一到就自动关闭了 所以这是怎么做到的呢?
1 | 脚本每隔一定时间就去数据表检查一下状态,是否过期需要关闭。 |
1 | 创建订单时开始计时,计时结束后直接处理关闭订单。 |
1 | 数据库建立检查事件,每隔一定时间去执行一次存储过程。 |
1 | 对于更改任何Redis Key的每个操作,都可以配置Redis将消息发布到Pub/Sub,然后订阅这些通知。 |
不多说,直接上SQL
碰上github网络抽风的时候,恰巧你又需要拉取github上托管的项目,这个时候看着2kb/s的下载速度是不是很抓狂?
打开ipaddress查询以下三个域名的ip,写到hosts文件中。
在现在大数据、高并发,到处都充斥着流量的互联网时代,能不能应对高并发俨然已经发展成一个衡量服务端架构是否合格的标准,作为程序媛我们思考如何利用语言在代码层面最优设计能应对并发的程序去并行处理任务。在程序中对于任务并行处理一般趋于使用:进程、线程,以及另外一种:协程。支持协程的语言有很多,比如:C/C++、Ruby、 Python(2.5+)、Golang等等,它们有些是本身语言支持协程,有些则是需要引入第三方包来使用。不过,我们主要来学习一下Golang这门语言(简称Go),它是如何理解以及实现协程的。
都知道一台计算机的核心是CPU,它承担着所有的运算。而计算机承载的操作系统(内核)则是负责所有任务的处理和调度CPU以及资源的分配。如果用人类来比喻,大脑是CPU,思维则是操作系统(内核)。
最早的计算机每次只能运行一个程序,如果还有其他程序需要执行则要排队等待。后来CPU运算能力提高了,这种方式过于原始有些浪费性能,于是尝试让多个程序可以并行执行,但是这样面临一个新的问题:跑在同一个CPU中的程序都会使用计算机资源,那程序的运行状态和数据怎么保障?进程。
1 | 进程是内核资源管理分配的最小单位,每个进程都有独立的虚拟地址空间。内核中的每个程序都运行在独立进程的上下文中,上下文是由程序正常运行需要的一系列参数组成,参数包括存储器中的代码和数据,寄存器中的内容以及进程打开的文件描述符(文件句柄)等。可以把上下文通俗理解为:`环境`。 |
如果程序在运行过程中需要进行IO操作,IO操作阻塞了程序后面的计算,这时候CPU属于空闲状态,那内核会把CPU切换到其他进程去处理。不过当进程数量变高以后,计算机的大部分资源都被进程切换这个操作消耗掉了。为什么说进程切换操作消耗资源代价比较高?
1 | 所谓进程切换其实就是上下文切换,需要切换新的页表并加载新的虚拟地址空间、切换内核栈以及硬件上下文等。只要发生进程切换操作就得反复进入内核,加载切换一系列状态。 |
为了减少这种开销,线程应运而生。
1 | 线程是内核调度CPU执行的最小单位,线程是运行在进程上下文的逻辑流,线程是具体执行程序的单位。一个进程至少包含一个主线程(可以拥有多个子线程),但是一个线程只能存在于一个进程中。 |
线程切换相比进程切换开销就小了很多,线程切换只需要把寄存器刷新即可。
后面程序媛们发现线程这样还是有性能瓶颈(IO阻塞),无论是进程还是线程因为涉及到大量的计算机资源,所以都是由内核调度管理。能不能开发一种由代码控制的线程呢?这就是协程。
在和小伙伴讨论问题的时候,小伙伴突然问了我这样一个小问题,数据库中如何查找连续编号中的缺失编号?
场景大概是这样,有一份连续数据ID:1 … 27,其中ID:6,7,14的数据丢了。结构如下:
1 | CREATE TABLE `letter` ( |
怎么把6,7,14这三条数据找出来?方法有很多种哈,今天我们说一下如何利用SQL快速查询出来。大概思路是把ID+1,然后查询ID+1这个值是否存在ID列表中,如果不存在那肯定就是缺失的。SQL如下:
1 | SELECT |
但是这样会有一个小问题,就是MAX(id)+1(27)也会被查询出来,所以:
1 | SELECT |
1 | SELECT |
这种情况适用于查找整数类型的连续编号,那么如果编号是string类型的呢?后面有机会再补充进来=,=。
之前粗浅的学习了Redis三种集群策略的主从复制和哨兵策略,现在最后这篇来学习一下Redis Cluster也就是最后一个集群策略。
集群(Cluster),Redis2.6版本(正式版本是3.0)推出的分布式解决方案,有效解决了单Master节点写操作的压力并且分布式存储数据,大大提高了负载能力。
在Redis发布3.0正式版本前,一般使用代理中间件来实现分布式集群策略。这里不展开学习了,有兴趣的小伙伴自行研究。
特点
因为对主从复制和哨兵策略都称为集群策略,所以为了防止误解在下文中提及的集群(Cluster)策略,直接用Cluster称呼。
优点
现在这篇来学习一下Redis Sentinel即哨兵策略的相关知识。
哨兵(Sentinel),Redis2.6版本(正式版本是2.8,现2.6版本已被废弃)开始提供的一种集群策略,核心思想是解决了主从复制(Replication)在Master节点故障,无法自动切换Slave节点为新Master节点的问题。
特点
优点
tag:
缺失模块。
1、请确保node版本大于6.2
2、在博客根目录(注意不是yilia根目录)执行以下命令:
npm i hexo-generator-json-content --save
3、在根目录_config.yml里添加配置:
jsonContent:
meta: false
pages: false
posts:
title: true
date: true
path: true
text: false
raw: false
content: false
slug: false
updated: false
comments: false
link: false
permalink: false
excerpt: false
categories: false
tags: true