面1:
1.HashMap为什么是线程不安全的?(ConcurrentHashMap是线程安全的,采用分段锁技术提高并发度,每个段一把锁)
在jdk1.7中:在多线程情况下,扩容时会造成环形链或数据丢失,采用头插法,会造成死循环问题。
在jdk1.8中:在多线程情况下,会发生数据覆盖的情况
2.服务熔断、服务降级技术上是怎么实现的?
1),服务熔断:当某个服务出现不可用或超时的情况,为了防止系统出现雪崩,暂时停止对该服务的调用。
2),服务降级:当系统处于高峰期,系统资源紧张,我们可以让系统上非核心业务降级处理
降级:不处理,或处理简单。
答:在分布式系统中,网关作为流量的入口,大量请求进入网关,向后端远程服务发起调用,后端不可避免的会调用 失败(超时或异常),需要在网关上做熔断,降级操作
3.你的项目怎么保证数据安全性,防止别人获取用户名,密码?
答:采用锁机制:悲观锁(即一次只能一个线程进行操作数据,等它操作完毕释放锁之后,其他线程才能进行获取锁,进行操作),乐观锁(比较并交换,采用版本号去更新,版本号不一致,不进行更新)
采用redis保证缓存与数据库一致性;
1)秒杀情况:把数据库中的库存数据转移到redis缓存中,
所有读写操作(查库存,减库存)都在reids中进行,然后再通过定时任务把redis中的用户秒杀的数据同步到数据库。
2)先更新数据库,再删缓存
如果删除缓存失败,在事务中抛异常,让数据库也进行回滚
4.获取数组和获取字符串,集合的长度?
答:数组对应length属性,而字符串对应length()方法,集合对应size()
5.Limit分页(查询10-15条数据)
查询前100行:select * from table limit 100;
查询后100行:select * from table desc id limit 100;
查询10-15条数据:select * from table limit 9,6;
curPage:当前第几页
pageSize:一页多少条记录
公式:limit (curPage -1)*pageSize,pageSize;
查询n行到m记录?
Select * from table limit n-1,m-(n-1);
6.字符串拼接都有哪些方式?
1) 不涉及循环的,就是那种很简单的那种拼接,就用String的 + ,简单方便 ;
2) 非循环体中的字符串拼接,若只是两个字符串拼接,推荐使用str1.concat.(str2);
3) 涉及到循环的,比如说 for 的,可以考虑使用 StringBuilder的append(String str) , 要求线程安全的就选择 StringBuffer ;
4) 有 List 这种的,StringJoiner 不免一个好的选择。
7.你在项目中遇到的问题是什么,怎么解决的?
答:遇到的是跨域问题。
1)通过nginx,在配置文件中配置服务的地址和端口,在接口实现类上添加@CrossOrign注解
2)通过gateway网关进行配置,在配置文件中配置路由(参考springCloud重写路径,写一个配置类)
spring:
cloud:
gateway:
routes:
- id: test_route
uri: https://www.baidu.com
predicates:
- Query=url,baidu
- id: qq_route
uri: https://www.qq.com
predicates:
- Query=url,qq
- id: product_route
uri: lb://gulimall-product
predicates:
- Path=/api/product/**
filters:
- RewritePath=/api/(?<segment>.*),/$\{segment}
- id: admin_route
uri: lb://renren-fast
predicates:
- Path=/api/**
filters:
- RewritePath=/api/(?<segment>.*),/renren-fast/$\{segment}
@Configuration
public class GulimallCorsConfiguration {
@Bean
public CorsWebFilter corsWebFilter(){
UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
CorsConfiguration corsConfiguration = new CorsConfiguration();
//1.配置跨域问题
corsConfiguration.addAllowedHeader("*");
corsConfiguration.addAllowedMethod("*");
corsConfiguration.addAllowedOrigin("*");
//允许带cookie信息
corsConfiguration.setAllowCredentials(true);
source.registerCorsConfiguration("/**",corsConfiguration);
return new CorsWebFilter(source);
}
}