欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

整理(二)

程序员文章站 2022-04-01 10:01:13
...

redis:

概述:

Redis是开元免费的/高性能的key-value数据库

  1. 支持数据的持久化,可以将内存中的数据保存在磁盘中,重启时可以再次加载并进行使用
  2. 丰富的数据类型,String list set zset hash
  3. 支持数据的备份:save,该命令将在redis安装目录中创建dump.reb文件,若需要恢复数据,只需将备份文件(dump.rdb)移动到redis安装目录并启动即可,bgsave:命令在后台执行
  4. 原子性
  5. 支持发布订阅publish/subscribe:是一只种消息通信模式:发布者发布消息,订阅者接受消息;新消息通过publish命令发送给一个平道,这个消息就会发送给订阅它的所有的客户端,一个客户端可以订阅多个平道
  6. redis事务:可以一次执行多个命令,发送命令前被放入到队列缓存,收到命令后进入事务执行,事务中任意命令执行失败不会影响其他命令的执行,执行过程中,其他客户端提交的命令请求不会插入到事务执行命令中,事务执行要经历三个阶段:开始事务,命令入队,执行事务

注解实现:

  1. @Cacheable(value=”value1”,key=”key1”):查询时使用
    作用:针对方法进行配置,能够根据方法的请求参数对其结果进行缓存
    Value:缓存的名称(使用Zset,zset的key为value1,value为key1)
    Key:缓存的key(创建0一个字符串,其key名称为key1,value为方法的返回结果)
    注解解释:当调用这个方法时,会在一个名为value1的缓存中查询,如果没有,则查询数据库,将查询的结果插入到缓存中,其缓存的key是key1,value是返回的结果
  2. @Cacheput(value=”value1”,key=”key1”):修改时使用
    作用:与@Cacheable一样,不同的是每次都会调用真实方法,查询数据库,同时将方法的返回值存到缓存中,实现缓存与数据库的同步更新
  3. @CacheEvict(value=”value1”,key=”key1”):删除时使用
    作用:根据条件对缓存进行清空,删除value1中的key1

垃圾回收机制

概述:

java中一个显著的特点就是垃圾回收机制,会将无用的对象自动回收,不会像c++程序员那样自己手动
管理内存,它使得java程序员再开发过程中不想需要担心内存问题,它可以有效的防止内存泄漏
他有许多垃圾回收的算法,但是其目的都是:发现无效对象,将无效对象回收,释放内存

标记清除法:

它是从根集合进行扫描,对存活的对象进行标记,标记完成后再扫描未被标记的对象,进行回收,回收的速度慢,容易出现大量的内存碎片

标记整理算法:

对需要回收的对象进行整理,包括有效的对象,不会产生内存碎片

复制算法:

将内存分为两个部分,每次只使用一个,当使用满了之后将有效的对象复制到另一个部分中,回收原来的
空间

分代收集算法:

主要是对以上四种方法就行自动选择
分为新生代,老年代,永久带

  • 新生代:存放最新产生的对象,新生代分为eden区、survivor0和survivor1三个区,按照8:1:1的比例,大部分对象都是放在第一个分区,当第一个满了之后将存活的对象放到第二个,清空第一个,第二个满了之后放入到第三个,清空第二个,若三个分区都满了则将对象放入到老年代,新生代触发的是MinorGc,
    老年代满了之后就会触发Full GC
  • 老年代:一般是新生代的两倍,一般存放的对象声明周期会很长
  • 永久代:存放静态文件,它对垃圾回收没有影响
    新生代使用的是复制算法,老年代使用的是标记清除和标记整理算法,jdk8之后废弃了永久代,使用了元空间就行存放
    它直接存放再内存可自定义大小

RabbitMQ、ActiveMQ、KafKa简单介绍和对比

MQ作用:

异步,解耦,消息缓冲,消息分发

ActiveMQ:

使用java编写的队列,但是也提供PHP,c,c++,Python等客户端支持,支持主从复制,集群
工作模型两种:queue和topics

  • queue:多对一,可以有多个提供者发消息,消费者消费一条就移除一条,一个queue里可以有多个消费者
    但是她们必须标记都再一个messageGroup中,这样会逐个发送给每个消费者,消费者不会消费相同数据,每条消息被
    消费一次
  • topics:广播,提供者发送消息,每个消息都包含一个topic,消费者定义topic,所有订阅的topic都会收到消息
  • 订阅分为持久订阅和不持久订阅,持久订阅当消费者断开之后,再连上会接收没接受的消息,不持久
    断开这段时间的消息就不会接收到
    boot整合ActiveMQ
提供者:
  1. 启动类添加@EnableJms

  2. 定义消息队列
    @Configuration
    public class BeanConfig {

    //定义存放消息的队列
    @Bean
    public Queue queue() {
    return new ActiveMQQueue(“ActiveMQQueue”);
    }
    }

  3. 使用
    @Autowired
    private JmsMessagingTemplate jmsMessagingTemplate;

    jmsMessagingTemplate.convertAndSend(queue, name);

消费者:
@Autowired
private JmsMessagingTemplate jmsMessagingTemplate;
@JmsListener(destination = "ActiveMQQueue")
public String testMessage(String message){
    System.out.println("成功接受" + message);
    return message;
}

RabbitMQ

是一个使用erlang编写的AMQP(高级消息队列协议)的队列,功能完善,性能好

消费者:
  1. 配置:
    #rabbitmq配置
    spring.rabbitmq.host=ip
    spring.rabbitmq.port=port
    spring.rabbitmq.username=name
    spring.rabbitmq.password=pwd
  2. 接收类添加@RabbitListener注解
    @RabbitListener(queue=“消费对列名”)
    public void test(String message){

    }
  3. 提供者:
    @Autowired
    private AmqpTemplate amqpTemplate;
    public void send(){
    amqpTemplate.converAndSend(“mq名称”,“数据”);
    }
    方式二:
    amqpTemplate.converAndSend(“type”,“tocken”,“数据”);

kafka:

消费者:

一般做大数据使用

@KafKaListener(topics = {“名称”})
public void test(){

}

对比

  1. 时效性,activemq ms级,rabbitmq 微秒级(延迟最低),kafka ms以内
  2. acvtiveMQ和rabbitMQ支持主从复制(数据可以从一个服务器的主节点复制到一个或多个从节点),kafka
    支持分布式
  3. 吞吐量:activemq和rabbitmq都是万级,kafka十万级
  4. 开发语言:activemq使用java,rabbitmq使用erlang,kafka使用scala

sleep()与wait()区别:

  • sleep()方法正在执行的线程主动让出CPU(然后CPU就可以去执行其他任务),在sleep指定时间后CPU再回到该线程继续往下执行

      (注意:sleep方法只让出了CPU,而并不会释放同步资源锁!!!);
    
  • wait()方法则是指当前线程让自己暂时退让出同步资源锁,以便其他正在等待该资源的线程得到该资源进而运行,只有调用了notify()方法,之前调用wait()的线程才会解除wait状态,可以去参与竞争同步资源锁,进而得到执行。

      (注意:notify的作用相当于叫醒睡着的人,而并不会给他分配任务,就是说notify只是让之前调用wait的线程有权利重新参与线程的调度);
    
  • 使用位置:sleep()方法可以在任何地方使用;wait()方法则只能在同步方法或同步块中使用;

  • 所属不同:sleep()是线程线程类(Thread)的方法,调用会暂停此线程指定的时间,但监控依然保持,不会释放对象锁,到时间自动恢复;wait()是Object的方法,调用会放弃对象锁,进入等待队列,待调用notify()/notifyAll()唤醒指定的线程或者所有线程,才会进入锁池,不再次获得对象锁才会进入运行状态

MySQL和Oracle比较

区别:

相同点:

都是关系型数据库

不同点:
  • 隔离级别:
    mysql是可重复读,oracle是读写提交
  • 提交事务:
    mysql自动提交,oracle手动使用commit提交
  • 总体区别:
    mysql免费的轻量级数据库
    oracle收费的重量级数据库
  • 事务支持:
    mysql默认是不支持事务的,设置引擎比如innodb才支持事务,oracle完全支持事务
  • 自动增长处理:
    mysql主键是自动增长的,在创建一个mysql表时不需要配置主键自增;oracle不支持自动增长,所以在新增表时需要配置一个序号类完成自动增长
  • 一些方法区分
  1. 分页方式:
    mysql时limit;oracle是rownum
mysql:
select * from test limit 1,10
oracle:
select rownum,id from t_test t where rownum<=3 and  rownum>=2
  1. mysql中是int,varchar,oracle是number和varchar2
  2. mysql去空用trim(),oracle有trim(),ltrim(),rtrim()

Ribbon:

概述:

是一个客户端的负载均衡工具,解决消费者如何均匀的选择提供者,

Ribbon 负载均衡策略:

  • RoundRobinRule: 轮询策略,Ribbon以轮询的方式选择服务器,这个是默认值。所以示例中所启动的两个服务会被循环访问;
    RandomRule: 随机选择,也就是说Ribbon会随机从服务器列表中选择一个进行访问;
  • BestAvailableRule: 最大可用策略,即先过滤出故障服务器后,选择一个当前并发请求数最小的;
  • WeightedResponseTimeRule: 带有加权的轮询策略,对各个服务器响应时间进行加权处理,然后在采用轮询的方式来获取相应的服务器;
    AvailabilityFilteringRule: 可用过滤策略,先过滤出故障的或并发请求大于阈值一部分服务实例,然后再以线性轮询的方式从过滤后的实例清单中选出一个;
  • ZoneAvoidanceRule: 区域感知策略,先使用主过滤条件(区域负载器,选择最优区域)对所有实例过滤并返回过滤后的实例清单,依次使用次过滤条件列表中的过滤条件对主过滤条件的结果进行过滤,判断最小过滤数(默认1)和最小过滤百分比(默认0),最后对满足条件的服务器则使用RoundRobinRule(轮询方式)选择一个服务器实例。

具体细节待补充。。

相关标签: 整理