一、 什么是NoSQL
NoSql是为了解决高并发、高可扩展、高可用以及高写入而产生的数据库解决方案。
NoSql就是Not Only sql。Nosql是非关系型数据库,它是关系型数据库的良好补充,而不能替代关系型数据库。
二、 Nosql数据库分类
键值(Key-Value)存储数据库
- 相关产品: Tokyo Cabinet/Tyrant、Redis、Voldemort、Berkeley DB
- 典型应用: 内容缓存,主要用于处理大量数据的高访问负载。
- 数据模型: 一系列键值对
- 优势: 快速查询
- 劣势: 存储的数据缺少结构化
列存储数据库
- 相关产品:Cassandra, HBase, Riak
- 典型应用:分布式的文件系统
- 数据模型:以列簇式存储,将同一列数据存在一起
- 优势:查找速度快,可扩展性强,更容易进行分布式扩展
- 劣势:功能相对局限
文档型数据库
- 相关产品:CouchDB、MongoDB
- 典型应用:Web应用(与Key-Value类似,Value是结构化的)
- 数据模型: 一系列键值对
- 优势:数据结构要求不严格
- 劣势: 查询性能不高,而且缺乏统一的查询语法
图形(Graph)数据库
- 相关数据库:Neo4J、InfoGrid、Infinite Graph
- 典型应用:社交网络
- 数据模型:图结构
- 优势:利用图结构相关算法。
- 劣势:需要对整个图做计算才能得出结果,不容易做分布式的集群方案。
三、 什么是redis
Redis是用C语言开发的高性能的键值对存储的非关系数据库。Redis存储的数据类型有以下几种:字符(String)、散列(Hash)、列表(List)、集合(Set)、有序集合(ZSet)
四、历史发展
2008年,意大利的一家创业公司Merzia推出了一款基于MySQL的网站实时统计系统LLOOGG,然而没过多久该公司的创始人 Salvatore Sanfilippo便对MySQL的性能感到失望,于是他决定亲自为LLOOGG量身定做一个数据库,并于2009年开发完成,这个数据库就是Redis。 不过Salvatore Sanfilippo并不满足只将Redis用于LLOOGG这一款产品,而是希望更多的人使用它,于是在同一年Salvatore Sanfilippo将Redis开源发布,并开始和Redis的另一名主要的代码贡献者Pieter Noordhuis一起继续着Redis的开发,直到今天。
SalvatoreSanfilippo自己也没有想到,短短的几年时间,Redis就拥有了庞大的用户群体。HackerNews在2012年发布了一份数据库的使用情况调查,结果显示有近12%的公司在使用Redis。国内如新浪微博、街旁网、知乎网,国外如GitHub、Stack Overflow、Flickr等都是Redis的用户。
VMware公司从2010年开始赞助Redis的开发, Salvatore Sanfilippo和Pieter Noordhuis也分别在3月和5月加入VMware,全职开发Redis。
五、redis的应用场景
- 缓存(数据查询、短连接、新闻内容、商品内容等等)。(最多使用)
- 分布式集群架构中的session分离。
- 聊天室的在线好友列表。
- 任务队列。(秒杀、抢购、12306等等)
- 应用排行榜。
- 网站访问统计。
- 数据过期处理(可以精确到毫秒)
六、redis安装与启动
——-安装
- 进入Linux控制终端,下载Redis安装包
wget http://download.redis.io/releases/redis-3.0.6.tar.gz
- 安装C语言环境(已经安装->跳过)
yum install gcc-c++
- 解压Redis安装包
tar -zxf redis-3.0.6.tar.gz
- 进入解压目录并编译Redis
cd redis-3.0.6
make
- 安装Redis
make install PREFIX=/usr/local/redis
如果出现以下类似信息则说明安装正常
make[1]: Entering directory `/root/redis-3.0.6/src'
Hint: It's a good idea to run 'make test' ;)
INSTALL install
INSTALL install
INSTALL install
INSTALL install
INSTALL install
make[1]: Leaving directory `/root/redis-3.0.6/src
——启动
进入到安装目录的bin目录
cd /usr/local/redis/bin
- 前台启动
比较少用,一旦启动redis的客户端关闭,则redis也关闭。
./redis-server
后台启动
- 将redis.conf拷贝到bin目录下(redis.conf位于redis解压目录下)
cp -r /root/redis-3.0.6/redis.conf /usr/local/redis/bin/
- 修改redis.conf配置
vim redis.conf
将daemonize 改为yes (第42行)
- 启动redis
./redis-server redis.conf
七、客户端连接
redis本机自带客户端连接
./redis-cli -h 127.0.0.1 -p 6379
-h:指定主机IP
-p:指定主机端口
./redis-cli
默认主机IP是127.0.0.1 默认端口 6379
使用图形软件连接
- 下载软件
下载GitHub网址
https://github.com/uglide/RedisDesktopManager/releases/
mac下载地址
https://github.com/uglide/RedisDesktopManager/releases/download/0.9.0-alpha4/redis-desktop-manager-0.9.0.51.dmg
ps:在我的mac上不能用,可能因为用了最新的系统,找了另外一个软件:https://github.com/caoxinyu/RedisClient/tree/OSX,下载下来用以下命令启动。
nohup java -XstartOnFirstThread -jar redisclient-OSX.jar >/dev/null 2>&1 &
可以将这段保存为脚本start.sh执行,(先更改权限chmod 777 start.sh
),然后命令行的当前目录执行./satrt.sh
windows下载网址
https://github.com/uglide/RedisDesktopManager/releases/download/0.9.0-alpha4/redis-desktop-manager-0.9.0.559.exe
安装就不用多说了,双击即可
现在没有设置密码,直接add server,填写ip和端口即可。
八、Spring集成
jar文件
##maven
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>2.9.0</version>
</dependency>
##gradle
compile group: 'redis.clients', name: 'jedis', version: '2.9.0'
配置文件
<!-- 连接池配置 -->
<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单机 通过连接池 -->
<bean id="jedisPool" class="redis.clients.jedis.JedisPool"
destroy-method="close">
<constructor-arg name="poolConfig" ref="jedisPoolConfig" />
<constructor-arg name="host" value="127.0.0.1" />
<constructor-arg name="port" value="6379" />
</bean>
测试代码
@Test
public void testJedisPool() {
JedisPool pool = (JedisPool) applicationContext.getBean("jedisPool");
Jedis jedis = null;
try {
jedis = pool.getResource();
jedis.set("name", "lisi");
String name = jedis.get("name");
System.out.println(name);
} catch (Exception ex) {
ex.printStackTrace();
} finally {
if (jedis != null) {
// 关闭连接
jedis.close();
}
}
}
九、设置redis密码
编辑/usr/local/redis/bin/redis.conf的396行。(小提示:命令行模式下396gg
就跳转到396行了),将注释打开,更改为自己的密码。命令行模式下,输入:wq
保存退出。
requirepass 123456
重启
首先查询到redis的pid后,kill掉,然后重启
[root@localhost bin]# ps -ef|grep redis
root 20940 1 0 12:12 ? 00:00:18 ./redis-server *:6379
[root@localhost bin]# kill 20940
[root@localhost bin]# ./redis-server redis.conf
十、SpringBoot集成
springboot中只需要加入依赖,就会帮我们自动配置好redisTemplate,stringredisTemplate,使用十分方便。除了string,list,set,zset,hash,还支持存入对象。(对象必需实现Serializable)
- 加入起步Starter
gradle
//redis
compile('org.springframework.boot:spring-boot-starter-data-redis')
maven的方式百度下就有,看到这里的人应该有能力查到了。
- 对redis进行一些配置(没配置密码)
application.properties
#--------------------------redis----------------------------
# 使用的数据库,共16个0-15
spring.redis.database=0
#连接地址
spring.redis.host=172.16.160.129
#密码
spring.redis.password=123456
#连接端口
spring.redis.port=6379
#最大连接数
spring.redis.pool.max-active=8
#是否为安全连接(https,ssl)
spring.redis.ssl=false
#超时
spring.redis.timeout=1000
- 使用示例
UserTest对象
import lombok.Data;
import java.io.Serializable;
@Data//使用了lombok
public class UserTest implements Serializable {
private String name;
private String address;
private Integer age;
}
import com.kingboy.CommonApplication;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.test.context.junit4.SpringRunner;
import javax.annotation.Resource;
import java.util.Set;
/**
* @Author kingboy
* @Date 2017/7/19 下午5:09
* @Description RedisTest is used to redisTest
*/
@RunWith(SpringRunner.class)
@SpringBootTest(classes = CommonApplication.class)
public class RedisTest {
@Resource
StringRedisTemplate stringRedisTemplate;
@Resource
RedisTemplate redisTemplate;
/**
* 测试StringRedisTemplate
*/
@Test
public void StringRedisTemplateTest() {
//String
stringRedisTemplate.opsForValue().set("king","hello world!");
String king = stringRedisTemplate.opsForValue().get("king");
System.out.println("String获取的值:" + king);
//set
stringRedisTemplate.opsForSet().add("kingset", "1", "2", "3");
Set<String> kingset = stringRedisTemplate.opsForSet().members("kingset");
System.out.println("Set获取的值:" + kingset);
//zset,hash,list省略
}
/**
* 测试redisTemplate
*/
@Test
public void redisTemplateTest() {
redisTemplate.opsForList().leftPush("listtest", "param1");
Object index = redisTemplate.opsForList().index("listtest", 0);
System.out.println("list" + index);
//zset,hash,string,set省略
}
/**
* 测试存入对象
* 存入的对象需要实现Serializable接口
*/
@Test
public void saveObjectTest() {
//创建
UserTest userTest = new UserTest();
userTest.setName("小金2");
userTest.setAge(12);
userTest.setAddress("BeiJing");
//存
redisTemplate.opsForHash().put("user", userTest.hashCode(), userTest);
//取
UserTest user = (UserTest) redisTemplate.opsForHash().get("user", userTest.hashCode());
System.out.println(user);
}
}
十一、项目
自己在github新建了springboot的项目,供个人研究,项目地址:
https://github.com/KingBoyWorld/aurora.git,
项目中演示了actuator的使用(actuator_feature分支),redis的集成(redis_feature分支)等功能,感兴趣可以下载看看,如有错误,欢迎指正。
十二、关于Redis使用
主要是String,Set,ZSet,List,Hash的使用,以及过期时间、本地序列存储等,网止很多教程,以后有空自己再整理一份。
记录完了,有句话不知当讲不当讲………………