redis介绍
什么是Redis?
Redis是用C语言开发的一个开源的高性能键值对(key-value)内存数据库。
它提供五种数据类型来存储值:字符串类型、散列类型、列表类型、集合类型、有序集合类型
它是一种NoSQL数据库。
什么是NoSQL?
NoSQL,即Not-Only SQL(不仅仅是SQL),泛指非关系型的数据库。
什么是关系型数据库?数据结构是一种有行有列的数据库
NoSQL数据库是为了解决高并发、高可用、高可扩展、大数据存储问题而产生的数据库解决方案。
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历史发展
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。
Redis的应用场景
内存数据库(登录信息、购物车信息、用户浏览记录等)
缓存服务器(商品数据、广告数据等等)。(最多使用)
解决分布式集群架构中的session分离问题(session共享)。
任务队列。(秒杀、抢购、12306等等)
支持发布订阅的消息模式
应用排行榜。
网站访问统计。
数据过期处理(可以精确到毫秒)
Redis单机版安装配置
下载
* 官网地址:http://redis.io/
* 中文官网地址:http://www.redis.cn/
* 下载地址:http://download.redis.io/releases/
安装
第一步:在VMware中安装CentOS(测试环境为CentOS 7)
第二步:安装C语言需要的GCC环境
yum install gcc-c++
第三步:解压缩Redis源码压缩包
tar -zxf redis-5.0.5.tar.gz
第四步:编译Redis源码,进入redis-5.0.5目录,执行编译命令
make
第五步:安装Redis,需要通过PREFIX指定安装路径
make install PREFIX=/usr/local/redis
启动
前端启动
启动命令:进入安装目录,直接运行bin/redis-server将以前端模式启动。
./redis-server
关闭命令:ctrl+c
启动缺点:客户端窗口关闭则redis-server程序结束,不推荐使用此方法
后端启动(守护进程启动)
第一步:拷贝redis-5.0.5/redis.conf配置文件到Redis安装目录的bin目录
cp redis.conf /usr/local/redis/bin/
第二步:修改redis.conf
1. 将daemonize由no改为yes
2. bind 127.0.0.1 修改为真实的主机地址
第三步:执行命令
./redis-server redis.conf -- 开启服务
ps –ef | grep redis -- 查看服务
其他命令说明
redis-server :启动redis服务
redis-cli :进入redis命令客户端
redis-benchmark:性能测试的工具
redis-check-aof :aof文件进行检查的工具
redis-check-dump :rdb文件进行检查的工具
redis-sentinel :启动哨兵监控服务
Redis客户端
自带命令行客户端
./redis-cli -h 127.0.0.1 -p 6379
-h:redis服务器的ip地址
-p:redis实例的端口号
图形界面客户端(了解)
前提:需要安装图形界面管理器
程序客户端之Java客户端Jedis
Jedis介绍
Redis不仅使用命令客户端来操作,而且可以使用程序客户端操作。
现在基本上主流的语言都有客户端支持,比如Java、C、C#、C++、php、Node.js、Go等。
在官方网站里列一些Java的客户端,有Jedis、Redisson、Jredis、JDBC-Redis、等其中官方推荐使用Jedis和Redisson。
在企业中用的最多的就是Jedis,重点学习Jedis。
Jedis同样也是托管在github上,地址:https://github.com/xetorthio/jedis
依赖
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>2.9.0</version>
</dependency>
单实例连接
@Test
public void testJedis() {
//创建一个Jedis的连接
Jedis jedis = new Jedis("127.0.0.1", 6379);
//执行redis命令
jedis.set("key1", "hello world");
//从redis中取值
String result = jedis.get("key1");
//打印结果
System.out.println(result);
//关闭连接
jedis.close();
}
连接池连接
@Test
public void testJedisPool() {
//创建一连接池对象
JedisPool jedisPool = new JedisPool("127.0.0.1", 6379);
//从连接池中获得连接
Jedis jedis = jedisPool.getResource();
String result = jedis.get("key1") ;
System.out.println(result);
//关闭连接
jedis.close();
//关闭连接池
jedisPool.close();
}
Spring整合JedisPool
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.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.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单机 通过连接池 -->
<bean id="jedisPool" class="redis.clients.jedis.JedisPool"
destroy-method="close">
<constructor-arg name="poolConfig" ref="jedisPoolConfig" />
<constructor-arg name="host" value="192.168.242.130" />
<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("name", "lisi");
String name = jedis.get("name");
System.out.println(name);
} catch (Exception ex) {
ex.printStackTrace();
} finally {
if (jedis != null) {
// 关闭连接
jedis.close();
}
}
}