小小又去面试啦,对面试题再次的总结。
redis有五种数据结构,分别是String(字符串),Hash(字典),List(列表),Set(集合),Sorted Set(有序集合)
这五种数据结构是redis的五种数据结构
redis持久化方式有两种,分别是快照和追加式文件,
1. 对于快照而言,持久化会在特定的时间间隔,保存时间点的数据快照。
2. 追加式文件持久化方式服务器在收到写操作的时候,在服务器启动的时候,会逐条的执行,从而重建里面的数据,写操作记录的格式和redis协议一样,以追加的方式保存。
3. 两种持久化方式会长久的存在,当redis重启的时候,追加式文件则会优先用于重建数据。
Java 有以下几种数据结构,
List 存放的是有序的可重复的。List关注的是索引,拥有一系列和索引相关的方法,查询速度快。
Set 存放的是无序的不能重复的,集合中的对象,只是简单的把对象加入到集合中。
Map 存放的是键值对,键可以重复,值可以重复,根据键得到值,对map集合遍历的时候,先得到set的键的集合,对set集合进行遍历,得到相应的值。
锁一共有三种锁,分别是线程锁,进程锁,分布式锁。
对于线程锁而言,主要用来给代码块,方法加锁,当某个方法或者代码使用锁的时候,在同一时刻,只有一个线程执行该方法或者代码块,线程锁只在同一JVM中有效果,因为线程锁的实现在根本上是依靠线程之间共享内存实现,例如synchronized是共享对象头,显示锁Lock是共享某个变量。
为了控制同一操作系统中,多个进程访问共享资源,因为进程具有独立性,各个进程无法访问其他进程资源,因此无法通过synchronized等线程实现进程锁
当多个进程不在同一操作系统中,用分布式锁控制多个进程对资源的访问。
锁的自旋使用的是CAS算法算法,当一个线程在获取锁的时候,如果锁已经被其他线程获取,那么该线程将会循环等待,然后不断的判断锁能否成功的获取,直到获取锁才能够退出循环。
在redis里添加key作为redis锁,跑完自动进行delete。
这里对redis进行死锁,通过时间控制,把redis超时作为控制,或者redis的value作为时间控制。
初始数组容量为10,获取到扩容的容量,复制到当前的数组。
每次扩容1.5 倍。
底层维护的是双向列表,有前后的指针进行维护。
byte 1个字节。
short 2字节。
int 4个字节。
long 8字节。
float 4个字节。
double 8字节
char 2字节
boolean 1字节。
用MAX_获得
例如
Integer.MAX_
public class C1 { public int stuId; // 学生学号 public int courseId; // 课程编号 public int score; // 分数 /** 将学生成绩列表转换成两级的Map,用于查询任意学生的任意课程成绩 参数 list : 一个学年学生一学期全部课程成绩 返回值Map的key是学生学号,value 的map key是学生的课程编号, value 该学生这门课的成绩 **/ public static Map<Integer, Map<Integer, Integer>> toMap(List<C1> list) { } }
Map<Integer,Map<Integer,Integer>> map = new HashMap(); for(C1 tmp:list){ if(map.get(tmp.stuId) == null){ Map<Integer,Integer> grade = new HashMap(); grade.put(tmp.coureseId,tmp.score); map.put(tmp.stuId, grade); } else map.get(tmp.studId).put(tmp.coureseId,tmp.score); } return map;