Redis是用C语言开发的一个开源的高性能键值对(key-value)数据库。它通过提供多种键值数据类型来适应不同场景下的存储需求,目前为止Redis支持的键值数据类型如字符串类型、散列类型、列表类型、集合类型、有序集合类型。
- Redis介绍
什么是NoSQL:为了解决高并发、高可扩展、高可用、大数据存储问题而产生的数据库解决方案,就是NoSQL数据库。NoSQL,泛指非关系型的数据库,NoSQL即Not-Only SQL,它可以作为关系型数据库的良好补充。
NoSQL数据库分类:
1)键值(Key-Value)存储数据库
相关产品: Tokyo Cabinet/Tyrant、Redis、Voldemort、Berkeley DB
典型应用: 内容缓存,主要用于处理大量数据的高访问负载。
数据模型: 一系列键值对
优势: 快速查询
劣势: 存储的数据缺少结构化
2)列存储数据库
相关产品:Cassandra, HBase, Riak
典型应用:分布式的文件系统
数据模型:以列簇式存储,将同一列数据存在一起
优势:查找速度快,可扩展性强,更容易进行分布式扩展
劣势:功能相对局限
3)文档型数据库
相关产品:CouchDB、MongoDB
典型应用:Web应用(与Key-Value类似,Value是结构化的)
数据模型: 一系列键值对
优势:数据结构要求不严格
劣势: 查询性能不高,而且缺乏统一的查询语法
4)图形(Graph)数据库
相关数据库:Neo4J、InfoGrid、Infinite Graph
典型应用:社交网络
数据模型:图结构
优势:利用图结构相关算法。
劣势:需要对整个图做计算才能得出结果,不容易做分布式的集群方案。
redis的应用场景:缓存(数据查询、短连接、新闻内容、商品内容等等,最多使用)、分布式集群架构中的session分离、聊天室的在线好友列表、任务队列(秒杀、抢购、12306等等)、应用排行榜、网站访问统计、数据过期处理(可以精确到毫秒)。 - Redis安装配置
Redis下载地址:http://download.redis.io/releases/
1)Redis安装:Redis是C语言开发,建议在linux上运行。
->1.若简约版本需在Linux下安装gcc环境(否则该步骤可以省略)
[root@localhost redis-4.0.0]#yum install gcc-c++
->2.将下载的Redis源码包上传到Linux服务器中
【需要切换到sftp窗口】
[root@localhost ~]$ sftp root@192.168.1.103
sftp> put -r filename
【使用xshell的ZMODEM】
[root@localhost java]$ rz
->3.解压缩Redis源码包
[root@localhost java]# tar -zxf redis-4.0.0.tar.gz
->4.编译redis源码
[root@localhost java]# cd redis-4.0.0/
[root@localhost redis-4.0.0]# make
->5.安装redis
[root@localhost redis-4.0.0]# make install PREFIX=/opt/java/redis
2)Redis启动
->1.前端启动
启动方式:直接运行bin/redis-server将以前端模式启动。
[root@localhost bin]# ./redis-server
启动缺点:ssh命令窗口关闭则redis-server程序结束,不推荐使用此方法
启动图例:
_._
_.-``__ ''-._
_.-`` `. `_. ''-._ Redis 4.0.0 (00000000/0) 64 bit
.-`` .-```. ```\/ _.,_ ''-._
( ' , .-` | `, ) Running in standalone mode
|`-._`-...-` __...-.``-._|'` _.-'| Port: 6379 --默认端口
| `-._ `._ / _.-' | PID: 6859 --进程
`-._ `-._ `-./ _.-' _.-'
|`-._`-._ `-.__.-' _.-'_.-'|
| `-._`-._ _.-'_.-' | http://redis.io
`-._ `-._`-.__.-'_.-' _.-'
|`-._`-._ `-.__.-' _.-'_.-'|
| `-._`-._ _.-'_.-' |
`-._ `-._`-.__.-'_.-' _.-'
`-._ `-.__.-' _.-'
`-._ _.-'
`-.__.-'
前端启动的关闭:ctrl+c
->2.后端启动
1)将redis源码包中的redis.conf配置文件复制到/opt/java/redis/bin下
[root@localhost java]# cd redis-4.0.0/
[root@localhost redis-4.0.0]# cp redis.conf /opt/java/redis/bin
2)修改redis.conf,将daemonize由no改为yes
[root@localhost bin]# vim redis.conf
daemonize yes
3)使用命令后端启动redis
[root@localhost bin]# ./redis-server redis.conf
4)查看是否启动成功
[root@localhost bin]# ps -ef|grep redis
root 7155 1 0 20:51 ? 00:00:00 ./redis-server *:6379
root 7177 6979 0 20:52 pts/2 00:00:00 grep --color=auto redis
5)后端启动的关闭方式
非正常关闭(不推荐使用):[root@localhost bin]# kill -9 7155
正常关闭:[root@localhost bin]# ./redis-cli shutdown
注意:在项目中,建议使用正常关闭。因为redis作为缓存来使用的话,将数据存储到内存中,如果使用正常关闭,则会将内存数据持久化到本地之后,再关闭。如果是强制关闭,则不会进行持久化操作,可能会造成部分数据的丢失。
3)Redis客户端
->1.Redis自带的客户端,启动客户端命令
指定主机和端口(-h:redis服务器的ip地址,-p:redis实例的端口号)
[root@localhost bin]# ./redis-cli -h 192.168.1.103 -p 6379
如果不指定主机和端口也可以(默认主机地址是127.0.0.1 ,默认端口是6379)
[root@localhost bin]# ./redis-cli
关闭
Ctrl+c
127.0.0.1:6379> quit
->2.图形界面客户端
1)下载图形客户端百度网盘链接:https://pan.baidu.com/s/1c274Qli,密码:m7pu
安装之后,打开如下:
若连接不上,设置防火墙,在iptables中加入"-A INPUT -m state --state NEW -m tcp -p tcp --dport 6379 -j ACCEPT":
[root@localhost /]# vim /etc/sysconfig/iptables
# sample configuration for iptables service
# you can edit this manually or use system-config-firewall
# please do not ask us to add additional ports/services to this default configuration
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 3306 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 8080 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 1521 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 6379 -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
COMMIT
编辑并保存后,重启防火墙:[root@localhost /]# service iptables restart
Redis.conf中的数据库数量的设置:databases 16
选择数据库的方式:
使用select 加上数据库的下标 就可以选择指定的数据库来使用,下标从0开始
127.0.0.1:6379> select 15
OK
127.0.0.1:6379[15]>
4)Jedis客户端
jedis介绍:Redis不仅是使用命令来操作,现在基本上主流的语言都有客户端支持,比如java、C、C#、C++、php、Node.js、Go等。在官方网站里列一些Java的客户端,有Jedis、Redisson、Jredis、JDBC-Redis、等其中官方推荐使用Jedis和Redisson。 在企业中用的最多的就是Jedis,托管在github上地址:https://github.com/xetorthio/jedis。
工程搭建:
->1.添加jar包
jedis-2.7.0.jar、commons-pool2-2.3.jar
->2.单实例连接redis
@Test
public void jedisClient(){
Jedis jedis = new Jedis("10.39.12.237",6379);
jedis.set("s4", "dd");
String result = jedis.get("s4");
System.out.println(result);
jedis.close();
}
->3.使用jedis连接池连接redis服务器
@Test
public void jedisPool(){
JedisPool jedisPool = new JedisPool("10.39.12.237",6379);
Jedis jedis = jedisPool.getResource();
jedis.set("s5", "ee");
String result = jedis.get("s5");
System.out.println(result);
jedis.close();
jedisPool.close();
}
->4.Spring整合jedisPool
1)添加spring的jar包
2)配置spring配置文件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单机 通过连接池 -->
<bean id="jedisPool" class="redis.clients.jedis.JedisPool"
destroy-method="close">
<constructor-arg name="poolConfig" ref="jedisPoolConfig" />
<constructor-arg name="host" value="10.39.12.237" />
<constructor-arg name="port" value="6379" />
</bean>
</beans>
3)测试代码
@Test
public void jedisSpring(){
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("classpath:/config/applicationContext.xml");
JedisPool pool = (JedisPool) applicationContext.getBean("jedisPool");
Jedis jedis = pool.getResource();
jedis.set("s6", "ff");
String result = jedis.get("s6");
System.out.println(result);
}