为了解决高并发、高可扩展、高可用、大数据存储问题而产生的数据库解决方案,就是NoSql数据库。 NoSQL,泛指非关系型的数据库,
NoSQL即Not-Only SQL
,它可以作为关系型数据库的良好补充
。
键值(Key-Value)存储数据库: 相关产品:Tokyo Cabinet/Tyrant、
Redis
、Voldemort、Berkeley DB 典型应用:内容缓存
,主要用于处理大量数据的高访问负载
数据模型:一系列键值对 优势:快速查询 劣势:存储的数据缺少结构化(现在通过Redis数据类型得到解决) 列存储数据库: 相关产品:Cassandra、HBase
、Riak 典型应用:分布式
的文件系统 数据模型:以列簇式
存储,将同一列数据存在一起 优势:查找速度快,可扩展性强,更容易进行分布式扩展
劣势:功能相对局限 文档型数据库: 相关产品:CouchDB、MongoDB
典型应用:Web应用(与Key-Value类似,Value是结构化的),比如:存储日志 数据模型:一系列键值对 优势:数据结构要求不严格 劣势:查询性能不高,而且缺乏统一的查询语法 图形(Graph)数据库: 相关数据库:Neo4J、InfoGrid、Infinite Graph 典型应用:社交网络、微信平台 数据模型:图结构 优势:利用图结构相关算法。 劣势:需要对整个图做计算才能得出结果,不容易做分布式的集群方案。
Redis是用
C语
言开发的一个开源的
高性能键值对(key-value)数据库
。它通过提供多种键值数据类型
来适应不同场景下的存储需求,目前为止Redis支持的键值数据类型如下: String字符串类型 Map散列类型 List列表类型 Set集合类型 SortedSet有序集合类型
2008年,意大利的一家创业公司Merzia推出了一款基于MySQL的网站实时统计系统LLOOGG,然而没过多久该公司的创始人Salvatore Sanfilippo便对MySQL的性能感到失望,于是他决定亲自为LLOOGG量身定做一个数据库,并于2009年开发完成,这个数据库就是Redis。不过Salvatore Sanfilippo并不满足只将Redis用于LLOOGG这一款产品,而是希望更多的人使用它,于是在同一年Salvatore Sanfilippo将Redis开源发布,并开始和Redis的另一名主要的代码贡献者Pieter Noordhuis一起继续着Redis的开发,直到今天。 Salvatore Sanfilippo自己也没有想到,短短的几年时间,Redis就拥有了庞大的用户群体。Hacker News在2012年发布了一份数据库的使用情况调查,结果显示有近12%的公司在使用Redis。国内如新浪微博、街旁网、知乎网,国外如GitHub、Stack Overflow、Flickr等都是Redis的用户。 VMware公司从2010年开始赞助Redis的开发,Salvatore Sanfilippo和Pieter Noordhuis也分别在3月和5月加入VMware,全职开发Redis。
1、缓存(数据查询、短连接、新闻内容、商品内容等等)。(最多使用) 2、分布式集群架构中的session分离。 3、聊天室的在线好友列表。 4、任务队列。(秒杀、抢购、12306等等) 5、应用排行榜。 6、网站访问统计。 7、数据过期处理(可以精确到毫秒)。
Redis是C语言开发,建议在linux上运行,本教程使用Centos7作为安装环境。
实际开发中:只能修改防火墙配置,并不是关闭!
)
CentOS7默认的防火墙不是iptables,而是firewalld。我们可以试一下systemctl stop firewalld关闭防火墙,但是不推荐该方式。
如果是iptables,就vim /etc/sysconfig/iptables修改配置即可。详细的过程,博主以后会整理补充上。
本博主的是CentOS7,防火墙使用的是firewalld,我们使用命令的方式来添加端口(修改后需要重启firewalld服务):
[root@itheima ~]# cd /etc/firewalld/zones/
[root@itheima zones]# firewall-cmd --permanent --add-port=6379/tcp
[root@itheima zones]# service firewalld restart
Redirecting to /bin/systemctl restart firewalld.service
[root@itheima zones]# 默认一共是16个数据库,每个数据库之间是相互隔离。数据库的数量是在redis.conf中配置的
。
索引从0开始
,示例如下
127.0.0.1:6379> select 15
OK
127.0.0.1:6379[15]>Jedis
和Redisson
。 在企业中用的最多的就是Jedis,下面我们就重点学习下Jedis。 创建一个普通的java项目,导入jar包 测试代码如下:
/**
* 通过单实例连接redis服务器
*/
@Test
public void testJedisClient() {
// 创建一个Jedis的连接
Jedis jedis = new Jedis("192.168.5.128", 6379);
// 选择数据库
jedis.select(2);
// 执行redis命令
jedis.set("s4", "晓艺,你还好吗?");
// 从redis中取值
String result = jedis.get("s4");
// 打印结果
System.out.println(result);
// 关闭连接
jedis.close();
}
测试代码如下:
/**
* 通过连接池连接redis服务器
*/
@Test
public void testJedisPool() {
// 创建一个连接池对象
JedisPool jedisPool = new JedisPool("192.168.5.128", 6379);
// 从连接池中获取jedis会话对象
Jedis jedis = jedisPool.getResource();
String result = jedis.get("s1");
System.out.println(result);
// 关闭连接
jedis.close();
// 关闭连接池
jedisPool.close();
}
添加spring的jar包 配置spring配置文件applicationContext.xml applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.2.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.2.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-3.2.xsd ">
<!-- 连接池配置 -->
<bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig">
<!-- 最大连接数 -->
<property name="maxTotal" value="30" />
<!-- 最大空闲连接数 -->
<property name="maxIdle" value="10" />
<!-- 每次释放连接的最大数目 -->
<property name="numTestsPerEvictionRun" value="1024" />
<!-- 释放连接的扫描间隔(毫秒) -->
<property name="timeBetweenEvictionRunsMillis" value="30000" />
<!-- 连接最小空闲时间 -->
<property name="minEvictableIdleTimeMillis" value="1800000" />
<!-- 连接空闲多久后释放, 当空闲时间>该值 且 空闲连接>最大空闲连接数 时直接释放 -->
<property name="softMinEvictableIdleTimeMillis" value="10000" />
<!-- 获取连接时的最大等待毫秒数,小于零:阻塞不确定的时间,默认-1 -->
<property name="maxWaitMillis" value="1500" />
<!-- 在获取连接的时候检查有效性, 默认false -->
<property name="testOnBorrow" value="false" />
<!-- 在空闲时检查有效性, 默认false -->
<property name="testWhileIdle" value="true" />
<!-- 连接耗尽时是否阻塞, false报异常,ture阻塞直到超时, 默认true -->
<property name="blockWhenExhausted" value="false" />
</bean>
<!-- redis单机 通过连接池连接redis服务器 -->
<bean id="jedisPool" class="redis.clients.jedis.JedisPool" destroy-method="close">
<constructor-arg name="poolConfig" ref="jedisPoolConfig" />
<constructor-arg name="host" value="192.168.5.128" />
<constructor-arg name="port" value="6379" />
</bean>
</beans>
测试代码如下:
@Test
public void testJedisPool() {
JedisPool pool = (JedisPool) applicationContext.getBean("jedisPool");
Jedis jedis = null;
try {
jedis = pool.getResource();
jedis.set("s5", "lisi");
String name = jedis.get("s5");
System.out.println(name);
} catch (Exception ex) {
ex.printStackTrace();
} finally {
if (jedis != null) {
// 关闭连接
jedis.close();
}
}
}