京东一面:
自我介绍,
Spring 生成bean (单列)线程安全性
答:Spring 生成的Bean 如果是单例模式 其中的变量不是线程安全的、可以用ThreadLocal来实现线程安全,或者使用原型实例。
扩展 request实例和session实例
request 每个请求新建一个实例、适用于业务比较复杂、反应要求较高。 如支付和飞机票购买
session 每个用户会话期间只有一个实例 适用业务 :用户多次请求 购物车
redis 常用操作、线程安全、数据一致及使用场景
redis 是线程安全的
一致性 redis 是弱一致性
保持数据一致的方法:
摘自知乎
链接:https://www.zhihu.com/question/36413559/answer/71303343
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
说个大概吧,我们热数据基本都是redis,增删改都是操作mysql,对于读是保存到redis,这样就涉及到数据同步操作,同步操作分为两大块,我们的叫法是,一个是全量(将全部数据一次写入到redis,时间几小时不等),一个是增量(实时更新)。这里说的是增量,主要问题是即时性,因为增删改都是直接操作mysql变更都在MySQL(这里高并发的问题是用分库分表加外层的负载均衡) 所以我们的方向是读取binlog然后分析 ,利用消息推送到某服务器A,再进行分析,然后更新各台redis,消息推送工具用的是rabbitMQ,可设定某表的变更推送(分三类update insert delate 包含变更前后的数据),这里有个问题是:mysql数据操作太频繁产生的推送可能会很多,所以分析处理脚本处理速度一定要跟得上(我用Python写,前期多线程(坑),后来改成多进程),还有一个问题是,对于mysql-redis的数据关系映射设定不要太复杂,一表对一表就行,数据组合交给业务层做,这样分析处理脚本不会太多负担,处理速度更快,而且操作redis也更简单,redis每个对应mysql数据表的可使用多端口多实例,redis是单线程而且这样对于redis的主从和负载均衡有利,
题外话:对于服务器A 可以再给其它服务做一个数据表增量变更数据获取接口,利用数据纬度,获取时间段的变更数据。
追加,对于订单类部分,都是完全使用mysql,这个做好数据服务器,DB,table,分区,的拆分就好了,看并发请求越多拆分越多。
上面说太多都是屁话,其实就是MySQL binlog增量订阅消费+消息队列+处理并把数据更新到redis
一个简单的例子。https://github.com/liukelin/canal_mysql_nosql_sync
一致性hash和hash
一致性hash是个环、主要是针对某个服务器宕机、不需要重新分布数据
一致性hash介绍
http://www.cnblogs.com/zhangshiwen/p/5787232.html
负载均衡 遇到某个服务器性能