1.怎么防止秒杀作弊
https://blog.csdn.net/u010412301/article/details/89331184
1.如果活动没开始,进入用户必须等待,拦截大量活动未开始进入活动的用户
2.登录验证:手机验证码登录,或者微信等第三方账号登录,通过登录校验身份的合法
3.验证码校验:进入活动前通过小游戏或者复杂验证码再次校验是活体进入活动页面
4.活体识别校验,比如需要用户眨眼,摇头之类的
5.如果短时间内同一个用户进入多次,放入黑名单,用户ID,用户个人信息通过hash或者某种算法生成一个唯一的值作为id
6.IP防刷,短时间内同一个IP进入多次,IP放入黑名单
7.如果防止有的用户确实是手比较快而经常秒中,那么就再根据用户的唯一标示id,对这个用户在多少天内不能再秒中做限制
8.秒杀的商品信息放到redis中,如果redis中的商品已经抢光了直接返回,请求不打到数据库
9.限制活动的进入的速度,通过限流组件实现,被限速的用户弹出友好提示页面,提示等几秒后再试
10.验证 HTTP Referer 字段 CSRF攻击与防御(写得非常好): https://blog.csdn.net/xiaoxinshuaiga/article/details/80766369/
11.在请求地址中添加 token 并验证 CSRF攻击与防御(写得非常好): https://blog.csdn.net/xiaoxinshuaiga/article/details/80766369/
12. 在 HTTP 头中自定义属性并验证 这种方法也是使用 token 并进行验证,和上一种方法不同的是,
这里并不是把 token 以参数的形式置于 HTTP 请求之中,而是把它放到 HTTP 头中自定义的属性里
2.MySQL中,如果不使用 B+树作为索引,那种数据结构最能替代
3.如果给一列增加索引,需要考虑那些因素?
1.哪些情况或字段适合加索引?分散性好的字段适合
2.在经常需要搜索的列上 使用频繁的字段加锁才能提升查询效率,创建索引也是有成本的,并不是越多越好,
索引也占存储空间,索引的更新维护也需要消耗性能、
3.主键列上可以确保列的唯一性
4.在表与表的而连接条件上加上索引,可以加快连接查询的速度
5.在经常需要排序(order by),分组(group by)和的 distinct 列上加索引可以加快排序查询
6.很少数据的列,数据很少的列本身的特征都不明显,比如入一个三位的字符串,这个和分散性类似的原理
7.对于数据量很大或者很小的列如text, image和bit不适合建索引,索引本身占用内存空间
8.表的修改大大多于查询,表的修改非常多,远远大于查询,这样频繁的修改数据,导致索引也修改,耗费性能
哪些情况会造成索引失效?
9.如果条件中有 or,即使其中有条件带索引也不会使用(这也是为什么要少用 or 的原因) 改成in union all
10.索引字段的值不能有 null 值,控制
11.like 查询以%开头
12.在索引的列上使用表达式或者函数会使索引失效
4.如果MySQL的幻读用 next-lock解决,如果不用这样的锁,怎么实现?
5.事务的隔离级别有那些?
ru
rc
rr
searilaize
6.zk中的事务提交为什么提交给leader后还需要提交给同步节点?
7.raf和zab的区别?
8.zab的选举过程:a、b、c 三个节点组成的集群,事务-1,提交到a节点-leader,a节点收到一半的ack,
还没提交a本地事务的时候挂了,然后重新选举一个节点 x为leader,现在事务-2提交到当前x节点,x节点收到一半的ack,x本地事务还未提交就挂了,
然后重新选择一个节点y为leader,提交事务-3,请问事务1,2,3都提交了吗?
9.kafka的零拷贝原理知道吗?
10.雪花算法知道吗?
11.redis是单线程的,删除数据的时候怎么实现线程安全问题?一个要删除数据一个要查询数据?时间轮-------
实现redis的key失效所引发的一系列问题 https://blog.csdn.net/Happy_wu/article/details/79695415
深入理解Redis中的主键失效及其实现机制 http://blog.sina.com.cn/s/blog_48c95a190101e5hv.html
12.redis的内存淘汰策略有那些?怎么实现的?
13.redis的Zset怎么实现的?为什么要用跳表?跳表的索引怎么创建的?跳表和hashtable的比较?
14.Zset使用跳表的条件是什么?
15. 算法题:4个int数组,从每个数组里面挑一个数,加起来等于制定数,要求打印出所有非重复的组合,要求复杂度不超过n的平方
public static void main(String[] args) {
int[] a = new int[]{1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
int[] b = new int[]{11, 22, 13, 24, 15, 26, 27, 18, 19, 10};
int[] c = new int[]{2, 3, 33, 34, 25, 11, 27, 48, 29, 17};
int[] d = new int[]{13, 2, 3, 4, 5, 6, 7, 8, 9, 10};
//目标和为 50
int target = 50;
Map<Integer, List<Integer>> abMap = new HashMap<>();
for (int i = 0; i < a.length; i++) {
for (int j = 0; j < b.length; j++) {
List<Integer> sumab = new ArrayList<>();
sumab.add(a[i]);
sumab.add(b[j]);
abMap.put(a[i] + b[j], sumab);
}
}
Map<Integer, List<Integer>> cdMap = new HashMap<>();
for (int k = 0; k < a.length; k++) {
for (int m = 0; m < b.length; m++) {
List<Integer> sumab = new ArrayList<>();
sumab.add(c[k]);
sumab.add(d[m]);
cdMap.put(c[k] + d[m], sumab);
}
}
List<List<Integer>> results = new ArrayList<>();
Set<String> repeatSet = new HashSet<>();
for (Map.Entry<Integer, List<Integer>> entry : cdMap.entrySet()) {
if (abMap.containsKey(target - entry.getKey())) {
//一种结果
List<Integer> oneResult = new ArrayList<>();
oneResult.addAll(abMap.get(target - entry.getKey()));
oneResult.addAll(entry.getValue());
//排序
Collections.sort(oneResult);
//拼接成字符串
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append(oneResult.get(0))
.append(oneResult.get(1))
.append(oneResult.get(2))
.append(oneResult.get(3));
//去重
if (!repeatSet.contains(stringBuilder.toString())) {
repeatSet.add(stringBuilder.toString());
results.add(oneResult);
}
}
}
//打印
for (int i = 0; i < results.size(); i++) {
System.out.println(results.get(i));
}
}
16.hashMap中的并发锁是怎么解决的?解决了老版本中的分段锁的什么问题