老梁
java相关技术问答(二)
关注作者
前往小程序,Get
更优
阅读体验!
立即前往
腾讯云
开发者社区
文档
建议反馈
控制台
首页
学习
活动
专区
工具
TVP
最新优惠活动
文章/答案/技术大牛
搜索
搜索
关闭
发布
登录/注册
首页
学习
活动
专区
工具
TVP
最新优惠活动
返回腾讯云官网
老梁
首页
学习
活动
专区
工具
TVP
最新优惠活动
返回腾讯云官网
社区首页
>
专栏
>
java相关技术问答(二)
java相关技术问答(二)
老梁
关注
发布于 2019-09-10 16:52:40
348
0
发布于 2019-09-10 16:52:40
举报
文章被收录于专栏:
Java工程师成长之路
Java工程师成长之路
String为什么是final的
首先是为了安全性,final表示不可变,不可被继承,不能修改其方法保证安全
在多线程环境下,final类型的String保证线程安全
String支持字符串常量池,相同字符串可以指向相同地址
cas原理讲下
cas算法包含三个参数,v需要更新的变量,e预期值,n新的值
进入cas算法时,会先记录更新变量值,然后进入compareAndSwap方法,判断v是否等于e,相等说明v值没有被改变,那v值更新成n值
线程池线程数配置多少合适?
需要根据所执行的任务类别来区分
分为cpu密集型和IO密集型
cpu密集型线程数和cpu数量相同
io密集型,表示任务中需要执行像数据库操作,磁盘操作这类io阻塞等待的操作
这个时候,有公式来算出最佳执行线程=(线程io阻塞时间/io运行时间+1)*cpu数
为什么redis单线程还这么快
redis虽然是单线程,但他的操作完全是在内存进行的,内存的速度比IO快很多,可以有效提高cpu的利用率
ThreadPoolExecutor中有哪些参数
核心线程数
最大线程数
最大空闲时间
单位
阻塞队列
超出队列任务处理
jdk7和jdk8特性
jdk7可以使用switch字符串了
jdk7 try-catch资源块,可以自动释放
jdk8 lambda表达式 函数式编程
jdk8 接口可以实现默认方法了
防盗链方法
判断请求头refered,不是自己的域名,重定向到别的页面
使用nginx,nginx可以设置哪些域名可以访问哪些资源,其他域名访问都会跳到错误页面
跨域问题解决方案
首先常用方法,添加请求头head,可以设置哪些域名允许跨域
jsonp,前端技术,只支持get求情
使用网关,像nginx
使用httpClient转一道,rpc调用
java中的队列常用哪些
ArrayBlockingQueue
LinkedBlockingQueue
DelayQueue
PriorityBlockingQueue
Class.forName和classloader的区别
Class.forName 只会加载类信息,不会执行类中的static块
classloader除了加载类,还会执行static块
让你优化系统,你会做哪些
首选如果条件允许,tomcat集群部署,使用nginx做负载均衡和反向代理,分担压力
这可能会带来问题,比如该tomcat应用不支持集群部署,里面存在定时任务,不允许重复执行,还有session共享问题等等。
所以在集群前先解决上述问题,使用单独的分布式任务调度系统管理所有定时任务,系统代码该优化的优化,接口需要保证幂等性
随着集群化,并发量qps肯定能上来。接下来可以并发执行的优化还有数据库方面
开启慢查询,对用时比较长的语句进行explain,对该加索引的地方加上索引,能优化的地方优化。字段能用not null的地方用not null 因为is null的判断可能引起索引失效
group by默认会进行排序,若不需要使用order by null禁用排序
还有后端缓存也是一大块,使用好缓存可以减少大量数据库io操作,可以增大qps,可以使用redis作为缓存,
前端动静分离,cdn加速
当然如果能有服务器操作权限,也可以适当的进行JVM调优
Redis和Memcached整体对比
redis在单核的性能上高于mecached,memcached可以多核处理
redis在单纯key-value存储上,memcached利用率更高,但redis使用hash结构的key-value则利用率比mecached高
redis支持更丰富的数据操作,list,set,zset,string,hash
redis可持久化数据
强引用,软引用,弱引用,虚引用
强引用 最普遍引用,对象引用存在永远不会被垃圾收集器回收
软引用和内存相关,软引用对象内存不足时清除
弱引用,短时间可取到对象,二次垃圾回收时清除
虚引用,假的引用,没有实际引用对象。多用于检测对象是否从内存中移除
hashMap在jdk1.7和1.8的区别
1.8在链表的基础上加入了红黑树,当链表长度超过8,链表结构将变成红黑树模式,降低时间复杂度
但要使用这个优势,key必须时间比较接口compare
死锁,活锁和饥饿
死锁,两个以上线程竞争资源导致都得不到资源
活锁,两个线程互相谦让资源导致都得不到资源
饥饿,一条线程一直等着另一条线程一直持有资源
redis中穿透与雪崩的预防及解决
穿透,同一个不存在数据的请求多次发起,由于缓存找不到数据,每次会请求数据库,导致缓存穿透
可以通过缓存不存在的值,存入null值,访问到时返回null值处理方法
雪崩,大量缓存在同一时间失效,请求都访问数据库
并发压力通过加锁或队列,当缓存失效时,对某个key只允许一条线程访问,其他等待
缓存失效时间设置不同,尽量均匀分布
加二级缓存,二级缓存失效时间大于一级缓存可以做到一级缓存失效,二级缓存可以起到作用
如果能知道某个时间点会存在大量并发,可以设计手动reload,重新加载缓存
ES和solr对比
ES自带分布式不需要其他依赖组件,solr需要依赖如zookeeper
ES接近实时搜索,效率比solr高
ES节点故障自动分配其他节点
对已有数据进行搜索时,solr更快;实时建立索引,ES更快
给定a、b两个文件,各存放50亿个url,每个url各占64字节,内存限制是4G,让你找出a、b文件共同的url?
方案一
50亿64字节大概在320G,明细全部加载内存不够
首先的想法肯定是分批对比,如何分,先a文件通过对每个url hash(url)%1000 得到的数代表文件编号,每个文件大概300M
再b文件同样的方式分割出相同数量1000个文件,则相同url所在的文件序号一定是相同的
由此可以继续对比每一对小文件,先将a1文件存入hashmap,再遍历b1文件,在a1存在则是共同的url
方案二 若允许有一定误差,可以使用bloomfilter
bloom filter 的4G内存可以存储340亿bit
它的原理就是对存入值进行k散列,然后将数组中对应散列值置1
判断值是否存在的方法就是散列后对应值都为1,有一个为0就是不存在。全部为1则是很大可能存在
本文参与
腾讯云自媒体分享计划
,分享自作者个人站点/博客。
原始发表:2018-10-08 ,如有侵权请联系
cloudcommunity@tencent.com
删除
前往查看
缓存
云数据库 Redis
java
php
nginx
本文分享自
作者个人站点/博客
前往查看
如有侵权,请联系
cloudcommunity@tencent.com
删除。
本文参与
腾讯云自媒体分享计划
,欢迎热爱写作的你一起参与!
缓存
云数据库 Redis
java
php
nginx
评论
登录
后参与评论
0 条评论
热度
最新
推荐阅读
LV.
关注
文章
0
获赞
0
目录
String为什么是final的
cas原理讲下
线程池线程数配置多少合适?
为什么redis单线程还这么快
ThreadPoolExecutor中有哪些参数
jdk7和jdk8特性
防盗链方法
跨域问题解决方案
java中的队列常用哪些
Class.forName和classloader的区别
让你优化系统,你会做哪些
Redis和Memcached整体对比
强引用,软引用,弱引用,虚引用
hashMap在jdk1.7和1.8的区别
死锁,活锁和饥饿
redis中穿透与雪崩的预防及解决
ES和solr对比
给定a、b两个文件,各存放50亿个url,每个url各占64字节,内存限制是4G,让你找出a、b文件共同的url?
相关产品与服务
云数据库 Redis
腾讯云数据库 Redis(TencentDB for Redis)是腾讯云打造的兼容 Redis 协议的缓存和存储服务。丰富的数据结构能帮助您完成不同类型的业务场景开发。支持主从热备,提供自动容灾切换、数据备份、故障迁移、实例监控、在线扩容、数据回档等全套的数据库服务。
产品介绍
产品文档
云数据库采购特惠,高性能、高可靠、高安全,超值优惠等你享!
领券
问题归档
专栏文章
快讯文章归档
关键词归档
开发者手册归档
开发者手册 Section 归档
0
0
0
推荐