而使用Token时需要手动在HTTP头里设置,服务器收到请求后取出进行验证。
都是一个用户一个标志
3、分布式系统中的问题:
高并发:通过设计保证系统能够同时并行处理很多请求。
当高并发量的请求到达服务端的时候通过负载均衡的方式分发到集群中的某个服务器,这样就有可能导致同一个用户的多次请求被分发到集群的不同服务器上,就会出现取不到数据的情况。
根据访问不同的URL,负载到不同的服务器上去
三台机器,A1部署类目,A2部署商品点餐系统软件,A3部署单服务
通用方案:用Redis保存信息,服务器需要时都去找Redis要。登录时保存好key-value,登出时让他失效
垂直扩展:IP哈希 IP的哈希值相同的访问同一台服务器
的一致性:只要用户不重启浏览器,每次http短连接请求,理论上服务端都能定位到,保持会话。
Redis作为分布式锁
高并发:通过设计保证系统能够同时并行处理很多请求。(系统学习并发知识,可以在Java知音公众号回复“多线程聚合”)
同步:Java中的同步指的是通过人为的控制和调度,保证共享资源的多线程访问成为线程安全。
线程的Block状态:
a.调用join()和sleep()方法,sleep()时间结束或被打断
b.wait(),使该线程处于等待池,直到()/():不释放资源
此外,在状态的线程是处于被调度的线程,类中的yield方法可以让一个状态的线程转入。
Q:为什么wait,和必须与一起使用?Obj.wait()、Obj.必须在(Obj){…}语句块内。
A:wait就是说线程在获取对象锁后,主动释放对象锁点餐系统软件,同时本线程休眠。
Q::
A:就是非公平锁,它无法保证等待的线程获取锁的顺序。
公平和非公平锁的队列都基于锁内部维护的一个双向链表,表结点Node的值就是每一个请求当前锁的线程。公平锁则在于每次都是依次从队首取值。
重入性:
重入锁可以看这两篇文章,都比较简单
+ Redis缓存的两个重要注解:
对数据库加锁(乐观锁 与 悲观锁)
悲观锁依赖数据库实现:
select * from account where name=”Erica” for update
这条sql 语句锁定了 表中所有符合检索条件(name=”Erica”)的记录,使该记录在修改期间其它线程不得占有。
代码层加锁:
String hql ="from TUser as user where user.name='Erica'";
Query query = session.createQuery(hql);
query.setLockMode("user",LockMode.UPGRADE); //加锁
List userList = query.list();//执行查询,获取数据
其它
@Data 类似于自动生成了()、()、()等方法。
JAVA1.8的新特性:中提供了将流中的元素累积到汇聚结果的各种方式
List<Menu> menus=Menu.getMenus.stream().collect(Collectors.toList())
For - each 写法:
for each语句是java5新增,在遍历数组、集合的时候,for each拥有不错的性能。
public static void main(String[] args) {
String[] names = {"beibei", "jingjing"};
for (String name : names) {
System.out.println(name);
}
}
for each虽然能遍历数组或者集合,但是只能用来遍历,无法在遍历的过程中对数组或者集合进行修改。
:一个@Valid的参数后必须紧挨着一个 参数,否则会在校验不通过时直接抛出异常。
@Data
public class OrderForm {
@NotEmpty(message = "姓名必填")
private String name;
}
后台:
@RequestMapping("save")
public String save( @Valid OrderForm order,BindingResult result) {
//
if(result.hasErrors()){
List ls=result.getAllErrors();
for (int i = 0; i < ls.size(); i++) {
log.error("参数不正确,OrderForm={}", order);
throw new SellException(
………… ,
result.getFeildError.getDefaultMessage()
)
System.out.println("error:"+ls.get(i));
}
}
return "adduser";
}
..()可抛出“姓名必填” 的异常。
4、List转为Map
public class Apple {
private Integer id;
private String name;
private BigDecimal money;
private Integer num;
/*构造函数*/
}
List appleList = new ArrayList<>();//存放apple对象集合
Apple apple1 = new Apple(1,"苹果1",new BigDecimal("3.25"),10);
Apple apple12 = new Apple(1,"苹果2",new BigDecimal("1.35"),20);
Apple apple2 = new Apple(2,"香蕉",new BigDecimal("2.89"),30);
Apple apple3 = new Apple(3,"荔枝",new BigDecimal("9.99"),40);
appleList.add(apple1);
appleList.add(apple12);
appleList.add(apple2);
appleList.add(apple3);
Map appleMap =
appleList.stream().collect(Collectors.toMap(Apple::getId, a -> a,(k1,k2)->k1));
5、的子类:List、Set
List:、 、
List:有序容器,允许null元素,允许重复元素
Set:元素是无序的,不允许元素
最流行的是基于 实现的 ,由()和()保证元素的唯一性。
可以用set帮助去掉List中的重复元素,set的构造方法的参数可以是List,构造后是一个去重的set。
的补充:它不是下的
Map可以使用()/()来检查其中是否含有某个key/value。
会利用对象的来快速找到key。
插入过程:通过一个hash函数确定Entry的插入位置index=hash(key),但是数组的长度有限,可能会发生index冲突,当发生了冲突时,会使用头插法,即为新来的Entry指向旧的Entry,成为一个链表。
每次插入时依次遍历它的index下的单链表,如果存在Key一致的节点,那么直接替换,并且返回新的值。
但是单链表不会一直增加元素,当元素个数超过8个时,会尝试将单链表转化为红黑树存储。
为何加载因子默认为0.75?(0.75开始扩容)
答:通过源码里的注释看到,元素在哈希表中分布的桶频率服从参数为0.5的泊松分布。
源码地址:
————e n d————
最近当当图书在做开学季满减活动,我看了优惠力度蛮大的。
每满200减100!
每满400减200!
满600减300!
我在当当原本满600-300的前提下,申请到了叠加优惠码,结算时使用优惠码:【】(长按复制,注意区分大小写),即可再减50!
600减350!即实付250!
优惠码的使用时间是8.25-9.7,还有几天就到期了,大部分种类都能用,有选择困难症的我在下面的小程序码集成了一个书单,长按自行查看。
使用办法:在结算付款界面,点击优惠券/码,输入优惠码(如下图所示)。
免责声明:部分文章信息来源于网络以及网友投稿,本站只负责对文章进行整理、排版、编辑,出于传递更多信息之目的,并不意味着赞同其观点或证实其内容的真实性,如本站文章和转稿涉及版权等问题,请作者在及时联系本站,我们会尽快为您处理。