1、NoSQL
关于关系型数据库和nosql数据库
关系型数据库是基于关系表的数据库,最终会将数据持久化到磁盘上,而nosql数据库是基于特殊的结构,并将数据存储到内存的数据库。从性能上而言,nosql数据库 要优于关系型数据库,从安全性上而言关系型数据库要优于nosql数据库,所以在实际开发中一个项目中nosql和关系型数据库会一起使用,达到性能和安全性的双保证。
为什么要使用非关系型数据库
由于非关系型数据库是将数据存储到内存的数据库,对于超大规模和高并发的SNS(社交网)类型的web2.0纯动态网站具有较好的性能。能满足对数据库高并发读写的需求、对海量数据的高效率存储和访问的需求、对数据库的高可拓展性和高可用性的需求。
非关系型数据库分为四大类:
以Redis为代表的键值(Key-Value)存储数据库
典型应用:内容缓存,主要用于处理大量数据的高访问负载
数据模型:一系列键值对
优势:快速查询
劣势:存储的数据缺少结构化
以HBase为代表的列存储数据库
典型应用:分布式的文件系统
数据模型:以列簇式存储,将同一列数据存在一起
优势:查找速度快,可拓展性强,更容易进行分布式拓展
劣势:功能相对局限
以MongoDB为代表的文档型数据库
典型应用:Web应用(与Key-Value类似,Value是结构化的)
数据模型:一系列键值对
优势:数据结构要求不严格
劣势:查询性能不高,而且缺乏统一的查询语法
以Neo4J为代表的图形数据库
典型应用:社交网络
数据模型:图结构
优势:利用图结构相关算法
劣势:需要对整个图做计算才能得出结果,不容易做分布式的集群方案。
2、Redis简介
Redis是用C语言开发的一个开源的高性能键值对数据库,它通过提供多种键值数据类型来适应不同场景下的存储需求,目前为止Redis支持的键值数据类型如下:
1、字符串类型
2、散列类型
3、列表类型
4、集合类型
5、有序集合类型
官方提供测试数据:50个并发执行100000个请求,读的速度是110000次/s,写的速度是81000次/s。
3、Redis的安装
1)安装redis编译的c环境,yum install gcc-c++
2)将redis-2.6.16.tar.gz上传到Linux系统中
3)解压到/usr/local下 tar -xvf redis-2.6.16.tar.gz -C /usr/local
4)进入redis-2.6.16目录 使用make命令编译redis
5)在redis-2.6.16目录中 使用make PREFIX=/usr/local/redis install命令安装 redis到/usr/local/redis中
6)拷贝redis-2.6.16中的redis.conf到安装目录redis中
7)启动redis 在bin下执行命令redis-server redis.conf
8)如需远程连接redis,需配置redis端口6379在linux防火墙中开放,其他需要软件如Mysql需要远程连接都采用此方法开放端口
/sbin/iptables -I INPUT -p tcp --dport 6379 -j ACCEPT
/etc/rc.d/init.d/iptables save
4、Jedis
连接redis
package cn.ctgu.redis;
import org.junit.Test;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;
public class JedisTest {
//通过Java程序访问redis数据库
@Test
//获得单一的jedis对象操作数据库
public void test1() {
//获得连接对象
Jedis jedis=new Jedis("192.168.158.128",6379);
//获得数据
String username=jedis.get("username");
System.out.println(username);
//存储数据
jedis.set("addr","北京");
System.out.println(jedis.get("addr"));
}
//通过jedis的pool获得jedis连接对象
@Test
public void test2() {
//1、创建池子的配置对象
JedisPoolConfig poolConfig=new JedisPoolConfig();
poolConfig.setMaxIdle(30);//最大闲置个数
poolConfig.setMinIdle(10);//最小闲置个数
poolConfig.setMaxTotal(50);//最大连接数
//2、创建一个redis的连接池
JedisPool pool=new JedisPool(poolConfig, "192.168.158.128", 6379);
//3、从池子中获取redis的连接资源
Jedis jedis=pool.getResource();
//4、操作数据库
jedis.set("xxx","yyy");
System.out.println(jedis.get("xxx"));
//关闭资源
jedis.close();
pool.close();
}
}
JedisPoolUtils(redis线程池工具)
package cn.ctgu.redis;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;
public class JedisPoolUtils {
//获得jedis资源的方法
public static JedisPool pool=null;
static {
//加载配置文件
InputStream in=JedisPoolUtils.class.getClassLoader().getResourceAsStream("redis.properties");
Properties pro=new Properties();
try {
pro.load(in);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//获得池子对象
JedisPoolConfig poolConfig=new JedisPoolConfig();
poolConfig.setMaxIdle(Integer.parseInt(pro.getProperty("redis.maxIdle").toString()));//最大闲置个数
poolConfig.setMinIdle(Integer.parseInt(pro.getProperty("redis.minIdle").toString()));//最小闲置个数
poolConfig.setMaxTotal(Integer.parseInt(pro.getProperty("redis.maxTotal").toString()));//最大连接数
pool=new JedisPool(poolConfig, pro.getProperty("redis.url"),Integer.parseInt(pro.getProperty("redis.port").toString()));
}
public static Jedis getJedis() {
return pool.getResource();
}
/*public static void main(String [] args) {
Jedis jedis=getJedis();
System.out.println(jedis.get("xxx"));
}*/
}
redis.properties
redis.maxIdle=30
redis.minIdle=10
redis.maxTotal=100
redis.url=192.168.158.128
redis.port=6379
5、Redis数据库的操作