redis
什么是Redis
Redis是一种非关系型数据库,它将数存储在内存中,大大的提高了数据的查询效率。Redis是单线程请求,所有的操作都是串行执行的,并发情况下不需要考虑数据一致性问题。
redis是一个key-Value结构的数据存储系统个,value支持五种数据类型
String
Hash
List
Set
SortedSet
Redis的数据持久化方式
1 RDB方式
将内存中当前的数据库状态保存到磁盘里面。RDB文件是一个经过压缩的二进制文件,通过该文件可以还原生成该RDB文件是的数据库状态。RDB持久化方式效率很快,但是会有数据丢失的可能。
RDB文件生成的方式:
1.执行命令手动生成
SAVE 会阻塞Redis服务器进程,保存完成之前,redis服务器不能进行任何其他操作。
BGSAVE 会创建一个子进程,由子进程负责生成RDB文件。
2.通过配置自动生成
可以设置服务器的save选项,让服务器每个一段时间自动执行一次BGSAVE命令。可以设置多个保存的条件,满足任何 一个条件的时候就行至此那个保存。
2 AOF方式
将数据库的谢明令保存到文件中。AOF持久化方式在redis中默认是关闭的,需要修改配置文件开启。
AOF文件刷新的三种方式:
1.appendfsync always - 每提交一个修改命令都调用 fsync 刷新到 AOF 文件,非常非常慢,但也非常安全
2.appendfsync everysec - 每秒钟都调用 fsync 刷新到 AOF 文件,很快,但可能会丢失一秒以内的数据
3.appendfsync no - 依靠系统自动进行刷新,redis 不主动刷新 AOF,这样最快,但安全性就差
AOF数据恢复方式
redis服务器在启动时,通过载入和执行AOF文件中保存的命令,来恢复服务器关闭之前的状态。
如果同时启用了 RDB 和 AOF 方式,AOF 优先,启动时只加载 AOF 文件恢复数据
Redis的集群
Redis3.0版本之后开始支持集群。集群要求集群中节点必须支持准备模式,也就是说集群中的主节点至少要有一个从节点。
集群中的任意两个主节点之间都是相互连通的,客户端可以与任意一个节点进行连接,然后就可以访问集群中的其他节点。
Redis集群中的主节点之间通过ping-pong来判断节点是否可以连接上。当有一半一闪给定节点去ping一个节点没有回应的时候,则认为该节点宕机,就会连接它的从节点。如果如果某个节点和它的所有的从节点都宕机,集群就会不可用。还有就是,集群中一半以上的主节点宕机,也会认为集群不可用。
集群中数据的存储:
集群常见完成后,会为集群上的每个节点分配哈希槽,哈希槽有16484个,哈希槽在节点上进行平均分配。当我们存储到key到达的时候,热地社会根据CRC16算法得出一个结果没然后对16484取余,余数对应着哈希槽的编号。通过余数,找到对应的哈希槽的节点,然后跳转到这个节点上对数据进行存取操作。
Redis具体使用场景
并发量大,需要频繁查询数据库的操作,可以将数据缓存到redis中,直接从redis中获取。提高查询效率,降低数据库压力
Redis在java中的使用
//创建连接池对象
JedisPool jp = new JedisPool("192.168.25.104",6379);
Jedis jedis = jp.getResource();
//Jedis连接集群
Set<HostAndPort> nodes = new HashSet<>();
nodes.add(new HostAndPort("192.168.25.104",7001));
nodes.add(new HostAndPort("192.168.25.104",7002));
nodes.add(new HostAndPort("192.168.25.104",7003));
nodes.add(new HostAndPort("192.168.25.104",7004));
nodes.add(new HostAndPort("192.168.25.104",7005));
nodes.add(new HostAndPort("192.168.25.104",7006));
JedisCluster jc = new JedisCluster(nodes);
Spring框架中使用Redis
<?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:p="http://www.springframework.org/schema/p"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
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-4.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
">
<!-- 开启组件扫描 -->
<context:component-scan base-package="com.bjsxt.JedisDao" />
<!-- jedisPool的配置信息 -->
<bean id="poolConfig" 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="true" />
<!-- 在空闲时检查有效性, 默认false -->
<property name="testWhileIdle" value="true" />
<!-- 连接耗尽时是否阻塞, false报异常,ture阻塞直到超时, 默认true -->
<property name="blockWhenExhausted" value="false" />
</bean>
<!-- 配置JedisPool 加载spring容器的时候创建JedisPool对象放到spring容器中 -->
<bean id="jedisPool" class="redis.clients.jedis.JedisPool">
<constructor-arg name="poolConfig">
<ref bean="poolConfig"/>
</constructor-arg>
<constructor-arg name="host">
<value>192.168.25.104</value>
</constructor-arg>
<constructor-arg name="port">
<value>6379</value>
</constructor-arg>
</bean>
<!-- 创建JedisDaoImpl对象放到spring容器中 -->
<!-- <bean id="jedisDaoImpl" class="com.bjsxt.JedisDao.impl.JedisDaoImpl"></bean> -->
<!-- 配置JedisCluster -->
<bean id="jedisCluster" class="redis.clients.jedis.JedisCluster">
<constructor-arg name="nodes">
<set>
<bean class="redis.clients.jedis.HostAndPort">
<constructor-arg name="host">
<value>192.168.25.104</value>
</constructor-arg>
<constructor-arg name="port">
<value>7001</value>
</constructor-arg>
</bean>
<bean class="redis.clients.jedis.HostAndPort">
<constructor-arg name="host">
<value>192.168.25.104</value>
</constructor-arg>
<constructor-arg name="port">
<value>7002</value>
</constructor-arg>
</bean>
<bean class="redis.clients.jedis.HostAndPort">
<constructor-arg name="host">
<value>192.168.25.104</value>
</constructor-arg>
<constructor-arg name="port">
<value>7003</value>
</constructor-arg>
</bean>
<bean class="redis.clients.jedis.HostAndPort">
<constructor-arg name="host">
<value>192.168.25.104</value>
</constructor-arg>
<constructor-arg name="port">
<value>7004</value>
</constructor-arg>
</bean>
<bean class="redis.clients.jedis.HostAndPort">
<constructor-arg name="host">
<value>192.168.25.104</value>
</constructor-arg>
<constructor-arg name="port">
<value>7005</value>
</constructor-arg>
</bean>
<bean class="redis.clients.jedis.HostAndPort">
<constructor-arg name="host">
<value>192.168.25.104</value>
</constructor-arg>
<constructor-arg name="port">
<value>7006</value>
</constructor-arg>
</bean>
</set>
</constructor-arg>
</bean>
<bean id="jedisDaoImplCluster" class="com.bjsxt.JedisDao.impl.JedisDaoImplCluster"></bean>
</beans>