Redis持久化方式

[TOC]
redis持久化分为rdb和aof,rdb是将整个数据库保存为二进制文件,aof则是记录命令的方式保存。

一、rdb

rdb持久化功能所生成的rdb文件是一个经过压缩的二进制文件。
在载入rdb文件过程中,redis服务器一直处于阻塞状态,直到载入完毕。
在这里插入图片描述

创建rdb文件的两种方式

有两个命令可以用来保存rdb文件,save和bgsave。
不同的是,save命令会阻塞redis服务器进程,直到rdb文件创建完成,在此期间不再处理redis命令。
而bgsave则是fork父进程,由子进程负责rdb文件的创建,在子进程创建rdb文件过程中,redis服务器任然会处理redis命令。

Read More

Spring Boot使用@Autowired注入对象为null

在做项目的时候,在某类使用@Autowired注入了一个Service层的对象,但在使用的时候,却发现这个Service层实例为null值。

原因:当使用new关键字创建对象时,虽然使用了@Autowired对这个对象进行装配,但实际上Spring不会这样做。因为Spring不会对任何一个new出来的对象进行自动装配,只有当一个对象也是一个在Spring中注册过的Bean,才会获得自动装配的功能

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

/**
* @Configuration:指明当前类是一个配置类;就是来替代之前的Spring配置文件
*
* 在配置文件中用<bean><bean/>标签添加组件
*
*/
@Configuration
public class MyAppConfig {

//将方法的返回值添加到容器中;容器中这个组件默认的id就是方法名
@Bean
public HelloService helloService02(){
System.out.println("配置类@Bean给容器中添加组件了...");
return new HelloService();
}
}

@Configuration会告知Spring这是一个配置类,会为Spring上下文提供bean。@Bean标注的方法表明这些方法返回的对象会以bean的形式添加到Spring的应用上下文中(默认情况下,bean所对应的bean Id就是定义的方法名称)。

处理机调度

操作系统笔记

层次和目标

处理机调度分为三个层次,分别为

  • 高级调度(作业调度),将处于后备队列中的作业调入内存
  • 中级调度(内存调度),将暂时不能运行的进程调至外存等待
  • 低级调度(进程调度),决定就绪队列中的哪个进程(或线程)得到处理机资源

不同类型的操作系统采用了不同的处理机调度算法。调度算法应当使得系统资源利用率尤其是处理机的利用率尽可能地高(资源利用率),要保证每个进程都能获得合理的CPU时间(公平性),还要保证系统的各种资源使用的平衡性(平衡性),另外对制定的策略只要需要就一定要执行(策略强制执行性)。

Read More

数组划分游戏 HihoCoder - 1948 (二分答案)

题目

https://cn.vjudge.net/problem/HihoCoder-1948

小Hi在玩一个有关数组划分的游戏。给定一个整数K和一个长度为N的数组A=[A1, A2, … AN],小Hi需要将它划分为K个连续子数组,并对每个子数组求和。

不妨设这K个子数组的和依次是S1, S2, … SK,则小Hi的得分是其中的最小值即min(S1, S2, … SK)。

例如对于A=[1, 2, 3, 4]和K=2,小Hi可以划分成[1, 2]和[3, 4],这样得分是3;也可以划分成[1, 2, 3]和[4],这样得分是4。

对于给定的K和数组A,你能帮助小Hi算出他最多能得多少分吗?

Input
第一行包含两个整数N和K。

第二行包含N个整数A1, A2, … AN。

对于60%的数据,1 <= N <= 1000

对于100%的数据,1 <= K <= N <= 100000 1 <= Ai <= 1000000

Output

一个整数代表答案

Sample Input

1
2
4 2
1 2 3 4

Sample Output
1
4

思路

通过这个题总算明白了二分答案是怎么一回事了。

二分答案,即假设已经知道了答案,拿这个已知的答案去验证题目要求是否满足。二分答案就是在答案的可能选择的区间内,二分地枚举每一个答案是否满足题目要求,将最优性问题(难以解决)转化为可行性问题。

而这个题目,就是枚举每个可能地得分数,然后看按照这个得分数,数组能否被划分为指定的段数,如果能,这即是答案,如果不能,接着二分枚举。

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
#include<bits/stdc++.h>
using namespace std;

typedef long long ll;

const int MAXN=1e5+10;

ll arr[MAXN];
ll n,m;
ll Min=0x3f3f3f3f,Sum=0;

ll check(ll x)
{
ll ans=0,tmp=0;
for(int i=1;i<=n;i++) {
tmp+=arr[i];
if(tmp>=x) ans++,tmp=0;
}
return ans;
}
int main()
{
// cout<<(1<<30)<<endl<<(0x3f3f3f3f)<<endl;
scanf("%lld%lld",&n,&m);
for(int i=1;i<=n;i++) {
scanf("%lld",&arr[i]);
Min=min(Min,arr[i]);
Sum+=arr[i];
}
ll l=Min,r=2*Sum;
while(l<=r) {
if(l+1==r) break;
ll mid=(l+r)/2;
ll q=check(mid);
if(q<m) r=mid;
else l=mid;
}
printf("%lld\n",l);
return 0;
}

/*
3 2
1 2 3

*/