发表于: 2017-11-01 23:16:18
1 857
今天完成的任务:
1.今天准备学习一下json格式传数据。
json官网,有中文的语言可以选择。JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。 易于人阅读和编写。同时也易于机器解析和生成。 它基于JavaScript Programming Language的一个子集。 JSON采用完全独立于语言的文本格式,但是也使用了类似于C语言家族的习惯(包括C, C++, C#, Java, JavaScript, Perl, Python等)。 这些特性使JSON成为理想的数据交换语言。
百度查到的解释:JSON(JavaScript Object Notation, JS 对象标记) 是一种轻量级的数据交换格式。它基于 ECMAScript (w3c制定的js规范)的一个子集,采用完全独立于编程语言的文本格式来存储和表示数据。简洁和清晰的层次结构使得 JSON 成为理想的数据交换语言。 易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率。
在 JS 语言中,一切都是对象。因此,任何支持的类型都可以通过 JSON 来表示,例如字符串、数字、对象、数组等。但是对象和数组是比较特殊且常用的两种类型。
对象:对象在JS中是使用花括号包裹 { } 起来的内容,数据结构为 {key1:value1, key2:value2, ...} 的键值对结构。在面向对象的语言中,key 为对象的属性,value 为对应的值。键名可以使用整数和字符串来表示。值的类型可以是任意类型。
数组:数组在 JS 中是方括号 [] 包裹起来的内容,数据结构为 ["java", "javascript", "vb", ...] 的索引结构。在 JS 中,数组是一种比较特殊的数据类型,它也可以像对象那样使用键值对,但还是索引使用得多。同样,值的类型可以是任意类型。
然后看一下怎么使用json?
首先需要有依赖:关于json需要使用的jar包,包括json特有的注解等。
有配置文件:配置文件有好几种配置的方法,暂时感觉好像效果是一样的。。就是配置一个就json格式的转化器。参考:http://blog.csdn.net/l3922768721/article/details/51606976
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">
<property name="messageConverters">
<list>
<!--json转换器-->
<ref bean="mappingJacksonHttpMessageConverter"/>
</list>
</property>
</bean>
<bean id="mappingJacksonHttpMessageConverter" class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
<property name="supportedMediaTypes">
<list>
<value>application/json;charset=UTF-8</value>
</list>
</property>
</bean>
然后使用@RequestBody注解和@ResponseBody来讲对象转换成json和将json转换成对象类型。
@Controller
public class JsonController {
@RequestMapping(value = "{name}",method = RequestMethod.GET)
public @ResponseBody User JsonTest(@PathVariable String name){
System.out.println("开始");
User user =new User();
user.setName(name);
user.setId(1);
return user;
}
}
结果:
2.学习一下redis
Redis是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库 Redis 是一个高性能的key-value数据库。 redis的出现,很大程度补偿了memcached这类key/value存储的不足,在部 分场合可以对关系数据库起到很好的补充作用。Redis运行在内存中但是可以持久化到磁盘,持久化的实现:一是 Snapshotting(快照)也是默认方式;二是Append-only file(缩写aof)的方式;三是虚拟内存方式;四是diskstore方式。在内存数据库方面的另一个优点是,相比在磁盘上相同的复杂的数据结构,在内存中操作起来非常简单,这样Redis可以做很多内部复杂性很强的事情。
另外redis是一种非关系型数据库(Nosql:Not Only Sql)
了解一下关系型数据库和非关系型数据库。
引用于波涛大佬的回答
关系型数据库通过外键关联来建立表与表之间的关系,非关系型数据库通常指数据以对象的形式存储在数据库中,而对象之间的关系通过每个对象自身的属性来决定
非关系型数据库中,我们查询一条数据,结果出来一个对象,关系型数据库中,查询一条数据结果是一个数组。
另外,还有一些不是特别正经的答案,感觉有那么一点道理
用一种不精确但容易理解的方法来说:
关系型数据库 = 非关系数据库 + 关系功能
并且,【关系功能】会占用掉90%的硬件资源以及90%的计算时间。
很多互联网公司,有大量业务,不需要关系功能,非关系数据库就能搞定。因此,非关系型数据库就火起来了。
大概了解了Nosql,继续redis
先下载压缩包
然后在cmd中进入安装文件,输入 redis-server.exe redis.windows.conf
重新打开一个cmd,然后再去连接,之前的不能关!!!
连接好了可以试一下set,get。
参考:http://www.runoob.com/redis/redis-install.html
然后可视化工具,看大佬都在用就去下载了一个,很简单下载安装就可以用了。
https://redisdesktop.com/download
好了现在可以在代码中试一下用用redis
先添加依赖
需要有jedis,common-pool两个依赖。
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>2.9.0</version>
</dependency>
然后直接试一下在代码里面写一个main方法是可以运行调用redis的。
下一步,看到大家使用redis的时候都会使用一个连接池来操作,就写一个连接池的类,然后不是一次一次的获取缓存中的值,这和我们使用c3p0连接池应该一个意思。
public class RedisUtil {
//Redis服务器地址
private static String address = "localhost";
//Redis服务器端口号
private static int port = 6379;
//访问密码
//private static String auth = null;
//可用连接实例的最大数目,默认值为8;
//如果赋值为-1,则表示不限制;如果pool已经分配了maxActive个jedis实例,则此时pool的状态为exhausted(耗尽)。
//private static final int MAX_ACTIVE = 1024;
//控制一个pool最多有多少个状态为idle(空闲的)的jedis实例,默认值也是8。
private static int MAX_IDLE = 10;
//等待可用连接的最大时间,单位毫秒,默认值为-1,表示永不超时。如果超过等待时间,则直接抛出JedisConnectionException;
private static int MAX_WAIT = 10000;
private static int TIMEOUT = 10000;
//在borrow一个jedis实例时,是否提前进行validate操作;如果为true,则得到的jedis实例均是可用的;
private static boolean TEST_ON_BORROW = true;
private static JedisPool jedisPool;
static {
JedisPoolConfig config = new JedisPoolConfig();
config.setMaxIdle(MAX_IDLE);
config.setMaxWaitMillis(MAX_WAIT);
config.setTestOnBorrow(TEST_ON_BORROW);
//config.setMaxTotal(MAX_ACTIVE);
jedisPool = new JedisPool(config, address, port, TIMEOUT);
}
//获取jedis实例。
public static Jedis getJedis() {
Jedis jedis = null;
if(null != jedisPool) {
jedis = jedisPool.getResource();
}
return jedis;
}
//返还资源
public static void returnResource() {
jedisPool.close();
}
}
上面的连接池里面有个配置连接池的方法,初始化。然后有一个获取连接池的实例化。然后一个关闭资源的方法。
有了连接池测试一下:
也没啥毛病。太顺利有点不习惯了。。。参考:http://www.cnblogs.com/baihaojie/p/5981339.html
连接池可以用了,然后可以使用将redis配置在Spring中。最终是要用Spring管理的还是。
Spring的配置:
<bean id="poolConfig" class="redis.clients.jedis.JedisPoolConfig">
<property name="maxIdle" value="300" />
<!--最大空闲-->
<property name="maxTotal" value="600" />
<!--最大连接数-->
<property name="maxWaitMillis" value="1000" />
<!--最大等待时间-->
<property name="testOnBorrow" value="true" />
<!--在borrow一个jedis实例时,是否提前进行validate操作;如果为true,则得到的jedis实例均是可用的;-->
</bean>
<!-- redis连接池 -->
<bean id="jedisPool" class="redis.clients.jedis.JedisPool" destroy-method="destroy" depends-on="poolConfig">
<constructor-arg name="poolConfig" ref="poolConfig" /> <!-- 加载jedisPool配置信息 -->
<constructor-arg name="host" value="127.0.0.1" /><!-- redis主机地址 -->
<constructor-arg name="port" value="6379"/> <!-- redis连接端口 -->
<!-- <constructor-arg name="password" value="${redis.pass}"/> 密码 -->
<!--<constructor-arg name="database" value="${redis.database}"/> 数据库 -->
<!--<constructor-arg name="timeout" value="${redis.timeout}"/> 连接超时 -->
</bean>
参考:http://blog.csdn.net/weixin_36751895/article/details/70254582
然后测试的时候想要把对象作为value放进去,但是发现好像不支持直接放入对象,所以首先需要有一个序列化和反序列化的工具类,然后才能放进去。
序列化是:使用Java对象序列化,在保存对象时,会把其状态保存为一组字节,在未来,再将这些字节组装成对象。必须注意地是,对象序列化保存的是对象的”状态”,即它的成员变量。当两个进程间进行通讯时可以相互发送任何资源(数据),这些资源包括图片、文本、音频、视频等,而这些资源在网络上传输的格式均为二进制序列(字节流)。
当两个java进程进行通讯时能否实现进程间的对象传输呢。是可以的,但必须完成对象的序列化,即将对象转换为二进制序列(字节流)的形式。
序列化的工具类:
实体类先要继承Serializable
public class User implements Serializable
public class SerializeUtil {
public static byte[] serialize(Object object) {
ObjectOutputStream oos = null;
ByteArrayOutputStream baos = null;
try {
// 序列化
baos = new ByteArrayOutputStream();
oos = new ObjectOutputStream(baos);
oos.writeObject(object);
byte[] bytes = baos.toByteArray();
return bytes;
} catch (Exception e) {
}
return null;
}
public static Object unserialize(byte[] bytes) {
ByteArrayInputStream bais = null;
try {
// 反序列化
bais = new ByteArrayInputStream(bytes);
ObjectInputStream ois = new ObjectInputStream(bais);
return ois.readObject();
} catch (Exception e) {
}
return null;
}
}
测试结果:
可以了,现在就在项目里面添加redis的配置和代码。
明天计划:
明天在代码里面添上需要的,然后压测一下。
遇到问题:
各种小问题吧,今天还好没什么卡的比较久的。
收获:
学习了redis的使用。
禅道:
http://taskNaNteng.com/zentao/task-view-10340.html
评论