Vector、HasnTable
是怎么保证线程安排的:使用synchronized修饰方法
缺点:效率低下
ArrayList、HashMap
线程不安全,但是性能好,用来替代vector、Hashtable
使用ArrayList、HashMap,需要线程安全怎么办呢?
使用Collections.synchronized(list);Collections.synchronizedMap(m);
在大量兵法情况下如何提高集合的效率和安全呢?
java.util.concurrent.*;
ConcurrentHashMap;
CopyOnWriteArraylist;
CopyOnwriterArraySet;
底层大都采用Lock锁,保证安全的同时,性能也很高
Java异常处理方式
- try、catch、finally:捕获异常
- throw:抛出异常、方法内部、具体的异常
- throws:声明异常、具体的异常类
String、StringBuffer、StringBuiler的区别及使用 String
- string是只读字符串、具有不可变性
- 字符串内容改变实际上地址也改变了
- 线程安全
- 可变性
- 线程不安全
- 可变性
- 效率高
- 声明一个StringBuiler时指向一个堆空间,具有两个重要属性value和count
怎么声明一个类不会被继承,什么场景下使用
如果一个类被final修饰,此类不可以有子类,不能被其他类继承,如果一个中的所有方法都没有重写的需要,当前类没有子类也罢。
例如:Math
redis持久化(RDB、AOF)
RDB持久化是指在指定的时间间隔内将内存中的数据集快照写入磁盘,实际操作过程是fork一个子进程,先将数据集写入临时文件,写入成功后,再替换之前的文件,用二进制压缩存储。
AOF持久化以日志的形式记录服务器所处理的每一个写、删除操作,查询操作不会记录,以文本的方式记录,可以打开文件看到详细的操作记录。
redis五种数据类型 StringRedisTemplate 常用方法
| 方法 | 描述 |
|---|---|
| opsForValue() | 操作字符串 |
| delete(key) | 根据key删除记录 |
| opsForHash() | 操作hash |
| opsForList() | 操作list |
| opsForSet() | 操作set |
| opsForZSet() | 操作有序set |
String通常用于保存单个字符串或JSON字符串数据
计数器
- opsForValue().set(key,value):向redis中插入数据。因为这个没有设置过期时间所以是永久存储的
- opsForValue().set(key,value,time,timeUtil):向redis中插入数据。第三个参数是一个long型的时间。最后一个参数是时间的单位
- opsForValue().get(key):获取redis中指定key 的value值
常用于存储一个对象
购物车:以用户id为key,商品id为field,商品数量为value,恰好构成了购物车的3个要素。
新增hashMap值:
put(H key, HK hashKey, HV value):
redisTemplate.opsForHash().put(“hashValue”,“key”,“value”);
获取指定变量中的hashMap值:
values(H key):
List hashList = redisTemplate.opsForHash().values(“hashValue”);
获取变量中的键值对:
entries(H key):
Map
获取变量中的指定map键是否有值,如果存在该map键则获取值,没有则返回null
get(H key, Object hashKey):
Object mapValue = redisTemplate.opsForHash().get(“hashValue”,“map1”);
System.out.println(“通过get(H key, Object hashKey)方法获取map键的值:” + mapValue);
判断变量中是否有指定的map键
hasKey(H key, Object hashKey):
boolean hashKeyBoolean = redisTemplate.opsForHash().hasKey(“hashValue”,“map3”)
System.out.println(“通过hasKey(H key, Object hashKey)方法判断变量中是否存在map键:” + hashKeyBoolean)
获取变量中的键
keys(H key):
Set keySet = redisTemplate.opsForHash().keys(“hashValue”)
System.out.println(“通过keys(H key)方法获取变量中的键:” + keySet);
获取变量的长度
size(H key):
long hashLength = redisTemplate.opsForHash().size(“hashValue”)
System.out.println(“通过size(H key)方法获取变量的长度:” + hashLength)
使变量中的键以double值的大小进行自增长
increment(H key, HK hashKey, double delta):
double hashIncDouble = redisTemplate.opsForHash().increment(“hashInc”,“map1”,3)
System.out.println(“通过increment(H key, HK hashKey, double delta)方法使变量中的键以值的大小进行自增长:” + hashIncDouble)
使变量中的键以long值的大小进行自增长
increment(H key, HK hashKey, long delta):
long hashIncLong = redisTemplate.opsForHash().increment(“hashInc”,“map2”,6)
System.out.println(“通过increment(H key, HK hashKey, long delta)方法使变量中的键以值的大小进行自增长:” + hashIncLong)
以集合的方式获取变量中的值
multiGet(H key, Collection hashKeys):
List list = new ArrayList()
list.add(“map1”)
list.add(“map2”)
List mapValueList = redisTemplate.opsForHash().multiGet(“hashValue”,list)
System.out.println(“通过multiGet(H key, Collection hashKeys)方法以集合的方式获取变量中的值:”+mapValueList)
以map集合的形式添加键值对
putAll(H key, Map extends HK,? extends HV> m):
Map newMap = new HashMap()
newMap.put(“map3”,“map3-3”)
newMap.put(“map5”,“map5-5”)
redisTemplate.opsForHash().putAll(“hashValue”,newMap)
map = redisTemplate.opsForHash().entries(“hashValue”)
System.out.println(“通过putAll(H key, Map extends HK,? extends HV> m)方法以map集合的形式添加键值对:” + map)
删除变量中的键值对,可以传入多个参数,删除多个键值对
delete(H key, Object… hashKeys):
redisTemplate.opsForHash().delete(“hashValue”,“map1”,“map2”)
map = redisTemplate.opsForHash().entries(“hashValue”)
System.out.println(“通过delete(H key, Object… hashKeys)方法删除变量中的键值对后剩余的:” + map)
Mysql的优化 explain执行语句
explain select * from T_EW_OUT_GAUGE where F_DT_DATA_CREATE_TIME >='2021-12-25'
type:指的是查询的类型,分为全表扫描和索引扫描。全表扫描是低效的。索引扫描又分为几个级别,包含辅助索引扫描和聚集索引扫描,各个级别不一样,性能也不一样。
索引扫描对应的执行计划分别为:index,range,ref,eq_ref,const(system),NULL
索引扫描按上面的排序,从左到右性能依次变好
select_type:主要用来分辨SELECT的类型,是普通查询还是联合查询还是子查询:
- simple(简单表,即不用表连接或子查询)
- primary(主查询,即外部查询)
- union(union中的第二个或者后面的查询语句)
- subquery(子查询中的第一个select)
possible_keys:此次查询中可能选用的索引
key:此次查询中确切使用到的索引
ref:哪个字段或常数与 key 一起被使用
索引–B+树- 索引数据和实际数据都存储在磁盘中
- 当需要读取数据时,磁盘中的索引会加载到内存中
- 分块进行数据读取
索引的分类:主键索引、唯一索引、普通索引、全文索引、组合索引
索引并不是越多越好:索引的维护会非常麻烦、占用的存储空间会变大,会导致IO增多。
主从复制- 有一句sql语句需要锁表,导致暂时不能使用读的服务,那么就很影响运行中的业务,使用主从复制,让主库负责写,从库负责读
- 做数据的热备
- 架构的扩展。业务量越来越大,I/O访问频率过高,单机无法满足,此时做多库的存储,降低磁盘I/O访问的频率,提高单个机器的I/O性能
原理:
- 从库会生成两个线程,一个I/O线程,一个SQL线程
- I/O线程会去请求主库的binlog,并将得到的binlog写到本地的relay-log(中继日志)文件中
- 主库会生成一个log dump线程,用来给从库I/O线程传binlog
- SQL线程,会读取relay log文件中的日志,并解析成sql语句逐一执行
master:
url:
username:
password:
driver-class-name: com.mysql.jdbc.Driver
slave1:
url:
username:
password:
driver-class-name: com.mysql.jdbc.Driver
slave2:
url:
username:
password:
driver-class-name: com.mysql.jdbc.Driver



