Believe it

相信不屈不挠的努力,相信战胜死亡的年轻

nosql

随时大规模高并发的出现,传统关系型数据库已经碰到了很大的问题,他难以提供更快的数据访问速度了,这导致数据库成为了瓶颈。人们提出not only sql的一种理念,就是我们不能仅仅依靠关系型数据库。

非关系型数据库

指的是没有关系的数据库,即不是二纬表,而是KV对。

redis

redis 就是其中的一个非关系型数据库,他是单线程,将数据储存在内存中的数据库,他支持丰富的数据类型,包括string,list,set,hash,zset

redis持久化

第一种是rdb方案,他将内存的数据定期储存到磁盘中,由于数据的空间问题,一般15分钟一次,第二种是aof方案,他将读取的数据定期增加到磁盘中,由于我们只是添加,一般1s一次。rdb本质为整体储存,aof为懒惰式储存,他储存的是操作,而不是数据库。

redis事务

redis半支持事务,语法错误回滚,但运行错误不会。

redis主从复制

主机写,从机读,

redis哨兵模式

当主机挂了以后,通过投票在从机中选出新的主机

缓存雪崩

大量的缓存同时失效,导致原本应该访问缓存的请求由于找不到数据,都去查询数据库,造成数据库CPU和内存巨大的压力 解决方案:对数据库加锁,或者让缓存失效时间分散开

缓存穿透

查询数据库中没有的数据,导致每次都要进入数据库查询 解决方案: 布隆过滤器,或者把数据库中不存在的数据也存入缓存设为空

布隆过滤器

引入多个相互独立的哈希函数,对数据库中的数据进行哈希,然后存入位图中,这里的多个确保了精度

缓存击穿

由于缓存中某条热点数据过期,导致大量高并发的请求击穿缓存进入数据库,导致数据库巨大的压力 解决方案: 热点数据永不过期或者访问数据库前加互斥锁, 这里为什么不是依靠数据库自己的锁呢,我认为能早处理的话就早处理,不要给数据库加压。

缓存预热

系统上线以后,将某些相关的缓存数据之间加入到缓存系统中

缓存更新

根据具体业务需求去自定义缓存淘汰机制,定期清理或者当请求来临的时候更新

缓存降级

当访问量增大,非核心服务影响核心服务的性能时,自动或者人工地让缓存尽量少查询数据库,尽管这可能导致少量的错误,但是我们的目标时系统的高可用性。

memcache、mongoDB、redis

性能都高,但是redis和memcache比mongodb强一点点 memcache只能是字符串,mongodb更加类似与关系型数据库,redis支持丰富的数据类型 redis用主从一致、哨兵机制保护数据,memcache没有冗余数据,mongoDB有主从一致、内部选举、auto sharding保护数据 redis支持rdb和aof,memcache没有持久化,mongodb用binlog Memcache用cas保存一致性,redis事务性较差,mongodb没有事务

参考资料

redis面试题 缓存穿透、缓存击穿、缓存雪崩区别和解决方案 Redis与Memcached的区别

查找最晚入职员工的所有信息

查找最晚入职员工的所有信息 CREATE TABLE employees ( emp_no int(11) NOT NULL, birth_date date NOT NULL, first_name varchar(14) NOT NULL, last_name varchar(16) NOT NULL, gender char(1) NOT NULL, hire_date date NOT NULL, PRIMARY KEY (emp_no));

我们排序以后选出最大的

1
2
3
select * from employees
order by hire_date desc
limit 0,1
找到最大值以后使用where
1
2
select * from employees
where hire_date = (select max(hire_date) from employees);
阅读全文 »

spring中的AOP

连接点,被拦截到的点,在spring中指的是方法 切入点,被增强的连接点 通知 在调用方法前的是前置通知,在后面的是后置通知,在catch中的是异常通知,在final中的是最终通知,整个invoke方法就是环绕通知 Target 被代理的对象

阅读全文 »

account案例

   我们有一个转账方法: 根据名称找到账户,转出账户减钱,转入账户加钱,更新转出账户,更新转入账户,这个方法没有事务的控制,可能出现问题 ## 案例问题    实际上我们需要维护一个和线程绑定的数据库连接,我们做一个工具类,让其支持回滚,于是我们在上诉案例中可以使用trycatch,一旦碰到问题,在catch中回滚即可,这个可以解决问题,但是太复杂了。

阅读全文 »

spring整合junit

@RunWith

我们需要切换junit的main ## @ContextConfiguration 指定配置类或者配置文件

1
2
3
4
5
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>4.3.8.RELEASE</version>
</dependency>
阅读全文 »

注解配置IOC

先总结一下之前的东西,曾经的XML配置,有标签id和class用于构造,有scope用来表示作用范围,有init-method和destroy-method用来表示生命周期,有property用来表示依赖注入

告知spring去扫描

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.0.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-4.0.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-4.0.xsd">
<context:component-scan base-package="com.wsx.spring"></context:component-scan>
</beans>
阅读全文 »

sprint的依赖注入

dependency injection IOC是降低程序之间的依赖关系的,我们把依赖关系交给spring维护,依赖关系的维护就叫做依赖注入 注入的类型 基本类型和Sring、 bean类型、集合类型 注入的方法 构造函数、set、注解

阅读全文 »

XML配置IOC

使用默认构造函数创建Bean

在spring的配置文件中使用Bean标签, 只配置id个class属性

1
2
3
4
5
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="myclass" class="com.wsx.spring.Myclass"></bean>
</beans>
阅读全文 »

创建IOC容器

ApplicationContest

单例对象适用 - ClassPathXmlApplicationContext 可以加载类路径下的配置文件,要求配置文件在类路径下 - FileSystemXmlApplicationContext 可以加载任意路径下的配置文件(要有访问权限) - AnnotationConfigApplicationContext 读取注解创建容器

ApplicationContest什么时候创建对象

题目1

流程图

判定覆盖

需要三条路径 ### 第一组: - (x,y,z) = (4,0,9) - (x,y,z) = (4,0,0) - (x,y,z) = (2,0,0)

第二组:

  • (x,y,z) = (4,0,9)
  • (x,y,z) = (4,0,0)
  • (x,y,z) = (1,0,0)

条件组合覆盖

第一个判断 第二个判断
x>3 z<10 x==4 y>5
x<=3 z<10 x!=4 y>5
x>3 z>=10 x==4 y<=5
x<=3 z>=10 x!=4 y<=5

所以4个组合 - (x,y,z)=(4,6,9) - (x,y,z)=(3,6,9) - (x,y,z)=(4,5,10) - (x,y,z)=(3,5,10)

## 流程图

点覆盖

0,1,2,3,4,5,6 0,1,2,3,4,8,4 0,1,2,7,2,3,4,5,7 0,1,2,7,2,3,4,8,4,5,6 7,2,7 8,4,8

边覆盖

(0,1),(1,2),(2,3),(3,4),(4,5),(5,6),(2,7),(7,2),(4,8),(8,2)

边对覆盖

(0,1,2),(1,2,3),(1,2,7),(2,3,4),(2,7,2),(3,4,5),(3,4,8),(4,5,6),(4,8,4)

主路径覆盖

0,1,2,3,4,5,6