线程安全和不安全的集合
Vector、HashTable、Properties是线程安全的
ArrayList、LinkedList、HashSet、HashMap等都是线程不安全的
redis的5中数据结构,6中淘汰策略,2中持久化方式
string、hash、list、set、zset
-
noeviction:当内存不足以容纳新写入数据时,新写入操作会报错。
-
allkeys-lru:当内存不足以容纳新写入数据时,在键空间中,移除最近最少使用的key。(这个是最常用的)
-
allkeys-random:当内存不足以容纳新写入数据时,在键空间中,随机移除某个key。
-
volatile-lru:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,移除最近最少使用的key
-
volatile-random:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,随机移除某个key。
-
volatile-ttl:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,有更早过期时间的key优先移除。
hashmap的数据结构
1,结构区别
jdk7中的数据结构主要是:数据+链表,数组和链表的结点的实现类是Entry类
jdk8中能够的数据结构是:数据+链表/红黑数,当链表中的元素个数大于等于8的时候转为红黑树,元素个数小于等于6时,红黑树结构还原成链表,数组和链表的结点的实现类是Node类
2,shash值的区别
jdk7中因为要保持hash函数的散列性,所以进行了多次的异或和位运算
jdk8中因为链表长度超过了8会转为红黑树,所以我们可以稍微减少元素的散列性,从而避免很多异或和位运算操作
3链表数据插入的区别
jdk7:使用的是头插入法,扩容后与原来的位置相反
jdk8:使用的尾插入法,扩容后位置与原链表相同
4,扩容机制不同
1,jdk7扩容条件:元素个数大于容量(16)*加载因子(0.75)&& 插入的数组位置有元素存在
2,jdk8扩容条件:元素个数大于容量(16)*加载因子(0.75)
jsp四大域对象九大隐式对象
request 代表请求
response 代表响应
out 代表输出
pageContext代表当前页面作用域
session代表会话作用域
application 代表全局作用域
page 对象即表示当前对象
config 可以获取一些在web.xml中初始化的参数
exception 对象只有当前页面的
redis持久化方式
RDB模式
原理:当redis需要做持久化时(执行save或者bgsave命令,或者是达到配置条件时执行),redis会fork一个子进程,子进程会将数据写到磁盘上一个临时RDB文件中,当子进程完成写临时文件后,将原来的RDB替换掉(默认文件名为dump.rdb)
aof模式
原理:aof就可以做到全程持久化,redis每执行一个修改数据的命令,都会吧这个命令添加到aof文件中,redis重启时,将会读取aof文件以恢复到redis关闭前的最后时刻
redis为什么速度快,能否保存到磁盘中
- 完全基于内存,绝大部分请求是纯粹的内存操作,非常快速,数据存在内存中,类似HashMap,HashMap的优势就是查找和操作的时间复杂度都是O(1);
- 数据结构简单,对数据操作也简单,Redis中的数据结构是专门进行设计的
- 采用单线程,避免了不必要的上下文切换和竞争条件,也不存在多进程或者多线程导致的切换而消耗cpu,不用去考虑各种锁的问题,不存在加锁释放锁操作,没有因为可能出现死锁而导致的性能消耗
- 使用多路I/O复用模型搭建非阻塞IO
- 使用底层模型不用,他们之间底层实现方式以及与客户端之间通讯的应用协议不一样,reids直接自己构建了vm机制,因为一般的系统调用系统函数的话,会浪费一定时间去移动和请求。