发表于: 2020-02-12 23:08:02

1 1203


一、今天完成的事

在电脑上配置nginx和其他组件

对称加密和非对称加密:

对称加密是最快速、最简单的一种加密方式,加密(encryption)与解密(decryption)用的是同样的密钥(secret key)。对称加密有很多种算法,由于它效率很高,所以被广泛使用在很多加密协议的核心当中。

对称加密通常使用的是相对较小的密钥,一般小于256 bit。因为密钥越大,加密越强,但加密与解密的过程越慢。如果你只用1 bit来做这个密钥,那黑客们可以先试着用0来解密,不行的话就再用1解;但如果你的密钥有1 MB大,黑客们可能永远也无法破解,但加密和解密的过程要花费很长的时间。密钥的大小既要照顾到安全性,也要照顾到效率,是一个trade-off。

对称加密的一大缺点是密钥的管理与分配,换句话说,如何把密钥发送到需要解密你的消息的人的手里是一个问题。在发送密钥的过程中,密钥有很大的风险会被黑客们拦截。现实中通常的做法是将对称加密的密钥进行非对称加密,然后传送给需要它的人。

非对称加密:

非对称加密为数据的加密与解密提供了一个非常安全的方法,它使用了一对密钥,公钥(public key)和私钥(private key)。私钥只能由一方安全保管,不能外泄,而公钥则可以发给任何请求它的人。非对称加密使用这对密钥中的一个进行加密,而解密则需要另一个密钥。

对称加密与非对称加密结合使用:

例如:

(1) Alice需要在银行的网站做一笔交易,她的浏览器首先生成了一个随机数作为对称密钥

(2) Alice的浏览器向银行的网站请求公钥。

(3) 银行将公钥发送给Alice。

(4) Alice的浏览器使用银行的公钥将自己的对称密钥加密。

(5) Alice的浏览器将加密后的对称密钥发送给银行。

(6) 银行使用私钥解密得到Alice浏览器的对称密钥。

(7) Alice与银行可以使用对称密钥来对沟通的内容进行加密与解密了。

image_thumb3


一致性哈希:

在分布式集群中,对机器的添加删除,或者机器故障后自动脱离集群这些操作是分布式集群管理最基本的功能。如果采用常用的hash(object)%N算法,那么在有机器添加或者删除后,很多原有的数据就无法找到了,这样严重的违反了单调性原则。

一致性hash时采用如下步骤:

  1. 首先求出memcached服务器(节点node)的哈希值,并将其配置到0~232的圆(continuum)上。
  2. 然后采用同样的方法求出存储数据(object)的键的哈希值,并映射到相同的圆上。
  3. 然后从数据映射到的位置开始顺时针查找,将数据保存到找到的第一个服务器上。如果超过232仍然找不到服务器,就会保存到第一台memcached服务器上。

在一致性哈希算法中,只有增加服务器的地点逆时针方向的第一台服务器上的键会受到影响.

同时,为了解决在服务节点太少时,因为节点分部不均匀而造成数据倾斜问题,引入了虚拟节点的概念:

即对每一个服务节点计算多个哈希,每个计算结果位置都放置一个此服务节点,称为虚拟节点。具体做法可以在服务器ip或主机名的后面增加编号来实现.

java Beanutils.copyProperties( ) 的用法

1、简介

 BeanUtils提供对Java反射和自省API的包装。其主要目的是利用反射机制对JavaBean的属性进行处理。

2、用法

如果有两个具有很多相同属性的JavaBean,一个很常见的情况就是Struts里的PO对象(持久对象)和对应的ActionForm。例如:一个用户注册页面,有一个User实体类和一个UserActionForm实体类,我们一般会在Action里从ActionForm构造一个PO对象,传统的方式是使用类似下面的语句对属性逐个赋值:

// 获取 ActionForm 表单数据  
UserActionForm uForm (UserActionFormform;

// 构造一个User对象  
User user new User();

// 逐一赋值  
user.setUsername(uForm.getUsername);  
 
user.setPassword(uForm.getPassword);  
 
user.setAge(uForm.getAge);  
 
...........

// 然后调用JDBC、或操作Hibernate 持久化对象User到数据库  

通过这样的方法如果表单属性字段很多,达到了100、1000甚至更多,那我们不是要写100、1000行set、get了。谁都不愿意这样做。

而我们使用 BeanUtils.copyProperties() 方法以后,代码量大大的减少,而且整体程序看着也简洁明朗,代码如下:

// 获取 ActionForm 表单数据  
UserActionForm uForm (UserActionFormform;

// 构造一个User对象  
User user new User();

// 赋值  
BeanUtils.copyProperties(useruForm);

// 然后调用JDBC、或操作Hibernate 持久化对象User到数据库  
 
.......

注:如果User和UserActionForm 间存在名称不相同的属性,则BeanUtils不对这些属性进行处理,需要手动处理。例如:
User类里面有个createDate 创建时间字段,而UserActionForm里面无此字段。BeanUtils.copyProperties()不会对此字段做任何处理。必须要自己手动处理。
用法总结如下:

[java] view plain copy print?

BeanUtils.copyProperties("要转换的类""转换后的类");  
[java] view plain copy print?

PropertyUtils.copyProperties("要转换的类""转换后的类");


使用foreach和嵌套循环实现将list对象中某字段值取出并赋给一个数组对象:

Long[] task = new Long[10];
for (UserTaskRelation userTask : userTaskList) {
   for (int i = 0;i < task.length;i++){
       task[i= userTask.getTaskId();
   }
}

二、遇到的问题

三、收获

开发流程


四、明天的计划


返回列表 返回列表
评论

    分享到