linux基础

1.环境变量:区别,系统级与用户级。登录仅执行一次和shell创建都执行一镒。
a)/etc/.bashrc:系统级。为每一个运行bash shell的用户执行此文件.当bash shell被打开时,该文件被读取.
b)/etc/.bash_profile:系统级。此文件为系统的每个用户设置环境信息,当用户第一次登录时执行。(系统不同,文件名可能不同:便都包含有profile)
c)~/.bashrc:用户级。当前用户登录时以及每次打开新的shell时,该该文件被读取.(多个用户多个)
d)~/.bashrc:用户级。当前用户可使用该文件输入专用于自己使用的shell信息,当用户登录时,该文件仅仅执行一次!
修改文件后,马上生效:source 文件名。111

zookeeper基础

0.介绍:分布式协调系统。类似于linux文件系统的数据存储结构!!!
a)选举leader端口:3888,数据通讯端口:2888,默认客户连接端口:2181.
b)剩余节点总数大于总数据的1/2时,才正常运行
c)选择leaderf规则(二阶段/2pc提交):
d)一些名词:leader,follow,leading,following,ZNode,Watcher.
e)leader==》读写,follower==>只负责读
1.Zookeeper安装(先安装java)有三种方式:安装的数量建议是单数。
单机模式/standalone:Zookeeper运行一台机器上
伪集群模式:一台物理机上运行多个zookeeper实例
集群模式:Zookeeper运行一个集群上,适合生产环境
2.布置standalone模式:
a)修改环境:增加zk_home路径;增加bin目录路径
ZOOKEEPER_HOME=/usr/local/zookeeper-3.4.14
export ZOOKEEPER_HOME
PATH=$ZOOKEEPER_HOME/bin:$PATH
export PATH

b)修改配置文件:修改数据保存路径;指定ZK的主机;指定主机的myid.
dataDir=/usr/local/zookeeper-3.4.14/tmp
server.1=zk_31:2888:3888

vi /usr/local/zookeeper-3.4.14/tmp/myid
//输入1,与配置文件中的server.1对应

c)启动
zkServer.sh start
d)使用
zkServer.sh status//查看状态,stop,关闭
zkCli.sh //不加参数,默认登录本机zk

ls / //查根节点,允许多个根节点
ls /mydata //查看mydata节点下的子节点
create /mydata helloworld //创建/mydata节点,数据是helloworld

3.应用:
a)分布式锁(与redis实现的区别,setnx)
b)负载均衡:利用树形数据结构和watch原理,自己代码实现
4.一致性:
a)强一致性:当更新操作完成之后,任何多个后续进程或者线程的访问都会返回最新的更新过的值。这种是对用户最友好的,就是用户上一次写什么,下一次就保证能读到什么。根据 CAP 理论,这种实现需要牺牲可用性。在分布式中,一般是实现不了的,所以在单体应用层中,可以使用更新锁或者插入锁,当查询时必须等解锁后才能读到数据。
b)弱一致性: 系统并不保证续进程或者线程的访问都会返回最新的更新过的值。系统在数据写入成功之后,不承诺立即可以读到最新写入的值,也不会具体的承诺多久之后可以读到。大多数分布式都是如此,存在脏数据,需要优化。
c)最终一致性:对弱一致性的优化结果。
弱一致性的特定形式。系统保证在没有后续更新的前提下,系统最终返回上一次更新操作的值。在没有故障发生的前提下,不一致窗口的时间主要受通信延迟,系统负载和复制副本的个数影响。DNS 是一个典型的最终一致性系统。
最终一致性的解决方案有:MQ(发布订阅消息,队列消息),分布式事务(要不全部成功,要不全部失败,也是首先基于mq的发布订阅事务消息实现),还有补偿模式,校对模式,缓存一致性模式


附多节点配置:
在每台节点的配置上增加
“`
server.1=zk_31:2888:3888
server.2=zk_32:2888:3888
server.3=zk_33:2888:3888


myid文件的内容分别为1,2,3
“`

kafka基础

0.介绍:分布式订阅消息系统
1.名词:
a)Topic:特指kafka处理的消息源
b)Partition:分区,Topic物理上的分组,一个Topic可以有多个Partition,每个Partition是一个有序的队列
c)Message:通信的基本单位
d)Producer:生产者。向kafka的一个Topic发布的过程叫生产
e)Consumer:消费者。订阅Topic并处理其发布的消息的过程叫消费。
f)Broker:缓存代理节点。Kafka集群中的一台或者多台服务器。
g):leader==>负责读写,follower 负责同步,只负责备份
2.应用场景:
a)Messge消息系统
b)网站活性跟踪
c)日志收集中心
3.Zookeeper:
4.布置方式:
a)单broker:
b)单机多broker(伪分布式):
c)多机多broker(真分布式):
5.布置单机模式:
a)安装JAVA
“`
JAVA_HOME=/usr/local/java/jdk1.8.0_231
export PATH

PATH=$JAVA_HOME/bin:$PATH
export PATH

“`
b)设置kakfa的PATH

c)修改配置
“`
broker.id=0 //单机模式不用改

log.dirs=/usr/local/kafka/kafka_2.12-2.4.0/logs
zookeeper.connect=zk_31:2181,zk_32:2181,zk_33:2181 //设置zk
d)启动:启动后,会在zk创建很多目录数据
bin/kafka-server-start.sh config/server.properties &
e)操作
bin/kafka-topics.sh –create –zookeeper zk_31:2181 –replication-factor 1 –partitions 3 –topic mydemo1 //创建一个topic,指定三个分区,一个副本
“`
6.kafka与其他mq区别
7.broker
微信截图_20200302172356
8.kafka负载均衡分配数据

.NET/C#高级进阶合集视频-事件

http://www.tracefact.net/tech/009.html

事件

1.介绍:委托是一个类型,事件是一个委托类型的特殊实例(引用) 。事件相对于委托来说是安全的,因为在定义了一个委托实例之后,其被执行的时候并不安全,由于其外部的类也可以调用类内部的委托的执行,而事件可以在外部去注册事件实现的方法,且只能在类的内部触发事件,所以事件是安全的。

如果把 delegate1 声明为 private会怎样?结果就是:这简直就是在搞笑。因为声明委托的目的就是为了把它暴露在类的客户端进行方法的注册,你把它声明为private了,客户端对它根本就不可见,那它还有什么用?

再看看把delegate1 声明为 public 会怎样?结果就是:在客户端可以对它进行随意的赋值等操作,严重破坏对象的封装性。

Event出场了,它封装了委托类型的变量,使得:在类的内部,不管你声明它是public还是protected,它总是private的。在类的外部,注册“+=”和注销“-=”的访问限定符与你在声明事件时使用的访问符相同。
声明一个事件不过类似于声明一个进行了封装的委托类型的变量而已。(像属性封装一样)
a)事件的发布:定义的委托事件
b)事件的订阅:把目标类的方法,添加到委托
c)事件的触发:调用事件发布的方法
2.实现demo
3.

多线程

多线程Task

.NET/C#高级进阶合集视频-委托

委托

1)介绍:实质上是一个类,通过ILSpy中间语言查看,可明确知道!它定义了委托方法的返回类型和参数列表,使得可以将方法当作另一个方法的参数来进行传递。可用来隐藏目标方法,可减少重复代码,代码复用。
简单工厂属于创建型,关心的是对象创建而非方法使用。委托则关心方法使用而非对象创建
2)实现
//委托可以定义在类内部也可以在外部
public delegate void DelegateInt(int num);
class MyDelegate
{
//需要委托方法一定要与定义的委托一样,参数列表和返回类型一样。
public void returnInt(int n)
{
Console.WriteLine(n);
}
}

```
//声明目标需要委托的类,以便使用
        MyDelegate myDelegate = new MyDelegate();

        //使用需要委托的方法实例化委托
        DelegateInt delegateInt = new DelegateInt(myDelegate.returnInt);

        //调用委托方法
        delegateInt(123)//前面是简写或者delegateInt.Invoke(123)

```
</code></pre>

3)泛型委托
    <code>//定义
      public delegate T DataDelegate<T>();</code>

<pre><code>  DataDelegate<int> dataDelegate = new Ticket12306.DataDelegate<int>(ticket12306.GetYuPiao);
                dataDelegate.Invoke();

                DataDelegate<bool> dataDelegate2 = new Ticket12306.DataDelegate<bool>(ticket12306.IsHasTicket);
                dataDelegate2.Invoke();

                DataDelegate<User> dataDelegate3 = new Ticket12306.DataDelegate<User>(ticket12306.GetUser);
                dataDelegate3.Invoke();
</code></pre>

4)委托多播(如需要使用返回值,使用最后一个委托方法的返回值)
  ```
  //定义
  public delegate void TickitDelegaete();
        public delegate T DataDelegate();
        public void SaleTicket()
        {
            Console.WriteLine("12306出票咯");
        }

    public int GetYuPiao()
    {
        Console.WriteLine("还有100张票");
        return 100;
    }

    public int GetTuiPiao()
    {
        Console.WriteLine("现在有24张退票");
        return 100;
    }


//使用
Ticket12306 ticket12306 = new Ticket12306();

DataDelegate<int> dataDelegate = new Ticket12306.DataDelegate<int>(ticket12306.GetYuPiao);
 dataDelegate += ticket12306.GetTuiPiao;//还可以使用-=
 dataDelegate.Invoke();//这里一次性执行上面委托的两个方法,按定义顺序执行

5)实践使用
//飞猪卖票12306(可解藕)
//创建目标委托所在的对象
Ticket12306 ticket12306 = new Ticket12306();

            //创建委托
            TickitDelegaete tickitDelegaete = new TickitDelegaete(ticket12306.SaleTicket);

            //调用第三方类方法执行(放在第三方解藕)
            TicketPig ticketPig = new TicketPig();
            ticketPig.SaleTicket(tickitDelegaete);

```
6)委托的其他写法:
1、委托 委托名=new 委托(会调用的方法名); 委托名(参数);//常规写法
2、委托 委托名 =会调用的方法名; 委托名(参数); //上面的简写
3、匿名方法:委托 委托名=delegate(参数){会调用的方法体};委托名(参数);
4、拉姆达表达式:委托 委托名=((参数1,。。参数n)=>{会调用的方法体});委托名(参数);
5、用Action和Func //Action 与 Func是.NET类库中增加的内置委托,以便更加简洁方便的使用委托。
a)Action<T1,T2....T16>,表示无返回值的委托类型,T参数个数是16个内不定
b)和Func<T1,T2....T16,TResult>表示最多一个返回值的委托类型,T参数个数是16个内不定,但TResult一定要有

.NET/C#高级进阶合集视频-反射

反射:动态获取信息以及动态调用对象方法的功能

1.在大多数的框架中都会用到
2.实现:
“`
//加载程序集
Assembly assembly = Assembly.Load(“Reflection”);

//创建反射类型
Type type = assembly.GetType(“Reflection.MysqlDBHelper”);

//创建实例对象
MysqlDBHelper mysqlDBHelper = (MysqlDBHelper)Activator.CreateInstance(type);

//调用实例方法
mysqlDBHelper.Query();
“`
3.反射获取类的其他信息