Redis是一个高性能的key-value存储系统,又称NoSQL数据库(它对数据的操作不是通过SQL语句来完成的)。它支持存储多种数据类型的(value)值,包括string(字符串),list(链表),sets(集合),sorted-sets(有序集合) 和 hash(哈希)。并且这些数据类型都支持push/pop,add/remove等操作。
Redis的数据都缓存在内存中,并且Redis会周期性的把更新的数据写入磁盘或把修改的操作写入追加的记录文件中
目的:通过redis对一些不经常变化的数据进行缓存,减小数据库的压力,防止访问高峰期数据库承受不住压力而崩溃。所以通过Redis缓存数据的最主要目的不是加快查询速度,而是减少数据库的负担。
持久化就是将程序数据在持久状态和顺势状态间转化的机制。
Redis是一种内存型数据库,服务器在运行时,系统会为其分配一块内存存储数据。一旦服务器挂了,存储在内存中的数据就会丢失。虽然Redis服务器可以重新上线,但缓存的数据丢失,又需要重新从数据库中获取数据,这样就会造成数据库的压力飙升。为了解决缓存丢失造成的影响,redis会把内存中的数据写入磁盘中。在Redis重新启动的时候加载这些数据,从而在最大程度上降低缓存丢失带来的风险。
数据会写入磁盘中的一个数据文件中,具体文件名需要看Redis配置文件redis.windows.config文件中的配置(通过dbfilename指令来指定),一般默认是dump.rdb文件。
dump.rdb数据文件默认会写入dir ./
这个目录下,即Redis服务器安装目录。注意这个配置一定是目录,而不能是文件名。
rdb文件是一个二进制文件,一般人是看不懂的(我也看不懂),如果你想查看里面的数据,可以通过一些工具进行转化。具体有哪些我也不知道,自己百度吧!
注意:Redis的工作路径和配置的dump.rdb文件必须在同一磁盘分区,如果不在同一分区,则所有需要使用dump.rdb的操作都会失败。
Redis有两种持久化方式,RDB 和 AOF
RDB:
AOF:
备份:进入Redis安装目录,拷贝生成的dump.rdb数据文件。
恢复:拷贝备份的dump.rdb数据文件到安装目录
在Java中使用Redis前,需要确保安装了Redis服务器以及添加Java的Redis驱动,如果Redis服务器无法启动,请参考Windows 下 Redis 服务无法启动,错误 1067 进程意外终止解决方案
<dependency>
<groupId>redis.clientsgroupId>
<artifactId>jedisartifactId>
<version>2.9.0version>
dependency>
import org.junit.Test;
import redis.clients.jedis.Jedis;
public class RedisTest {
public static Jedis connectionRedis(){
// 连接本地的 Redis 服务
Jedis jedis = new Jedis("127.0.0.1",6379);
return jedis;
}
@Test
public void demo1(){
// 连接本地的Redis服务
Jedis jedis = RedisTest.connectionRedis();
// redis的value是字符串类型,所以如果你想存储对象,则需要将对象转化成json字符串(任何数据都能转化成json字符串)
jedis.set("name", "字符串数据!");
// 判断key是否存在
boolean exists = jedis.exists("name");
System.out.println(exists);
// 获取存储的key数据并输出
System.out.println(jedis.get("name"));
}
}
/**
* 通过Redis连接池获取jedis对象
*/
@Test
public void redisPool() {
//Redis连接池配置
JedisPoolConfig poolConfig = new JedisPoolConfig();
poolConfig.setMaxTotal(50);
poolConfig.setMaxIdle(20);
poolConfig.setMinIdle(2);
poolConfig.setMaxWaitMillis(12000);
poolConfig.setTestOnBorrow(true);
poolConfig.setTestOnReturn(true);
//Redis连接池
JedisPool jedisPool = new JedisPool(poolConfig,"127.0.0.1",6379);
//从Redis连接池中获取jedis对象
Jedis jedis = jedisPool.getResource();
// redis的value是字符串类型,所以如果你想存储对象,则需要将对象转化成json字符串(任何数据都能转化成json字符串)
jedis.set("name", "字符串!");
// 判断key是否存在
boolean exists = jedis.exists("name");
System.out.println(exists);
// 获取存储的key数据并输出
System.out.println(jedis.get("name"));
}
spring整合redis就是把手动创建redis对象的过程交给spring来控制,然后通过DI在需要使用jedisPool的地方进行注入,从而获得jedis对象进行操作。
添加所需依赖
<dependency>
<groupId>redis.clientsgroupId>
<artifactId>jedisartifactId>
<version>2.9.0version>
dependency>
<dependency>
dependency>
redis.properties文件,定义redis连接池的相关参数,通过${xxx}使用
#最大连接数:能同时建立的‘最大连接个数’,连接全部用完,则需进行等待
redis.pool.maxTotal=50
#允许池中空闲的最大连接数:空闲连接数大于maxIdle时,将进行回收
redis.pool.maxIdle=20
#允许池中空闲的最小连接数:低于minIdle时,将创建新的连接
redis.pool.minIdle=2
#服务器ip
redis.hostname=127.0.0.1
#服务器端口
redis.port=6379
spring-redis.xml,在根目录下新建一个spring目录存放
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
<context:property-placeholder location="classpath:redis.properties"/>
<bean id="poolConfig" class="redis.clients.jedis.JedisPoolConfig">
<property name="maxTotal" value="${redis.pool.maxTotal}"/>
<property name="maxIdle" value="${redis.pool.maxIdle}"/>
<property name="minIdle" value="${redis.pool.minIdle}"/>
bean>
<bean id="jedisPoolUitl" class="com.cd.JedisPoolUitl">
<constructor-arg name="jedisPoolConfig" ref="poolConfig"/>
<constructor-arg name="hostname" value="${redis.hostname}"/>
<constructor-arg name="port" value="${redis.port}"/>
bean>
beans>
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;
/**
* redis连接池
* @Author caidong
*/
public class JedisPoolUitl {
// Redis连接池对象
private JedisPool jedisPool;
/**
* @param jedisPoolConfig 连接池配置相关信息
* @param hostname 服务器IP
* @param port 服务器上Redis的服务端口
*/
public JedisPoolUitl(JedisPoolConfig jedisPoolConfig, String hostname, int port) {
try{
jedisPool = new JedisPool(jedisPoolConfig,hostname,port);
}catch (Exception e){
e.printStackTrace();
}
}
/**
* 获取Redis连接池对象
* @return
*/
public JedisPool getJedisPool() {
return jedisPool;
}
/**
* 注入Redis连接池
* @param jedisPool
*/
public void setJedisPool(JedisPool jedisPool) {
this.jedisPool = jedisPool;
}
}
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import javax.annotation.Resource;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration({"classpath:spring/spring-redis.xml"})
public class cache {
@Resource(name = "jedisPoolUitl")
private JedisPoolUitl jedisPoolUitl;
@Test
public void spring_redis(){
//获取Redis连接池对象
JedisPool jedisPool = jedisPoolUitl.getJedisPool();
//通过Redis连接池获取jedis对象
Jedis jedis = jedisPool.getResource();
//获取存储的key数据并输出
System.out.println(jedis.get("name"));
}
}
redis与spring的整合(使用缓存)
[Redis源码阅读]redis持久化
[深入理解Redis]读取RDB文件
redis有哪些功能
redis.conf文件详解