Redis系列 --第一篇

前言

    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配置文件redis.windows.config文件中的配置(通过dbfilename指令来指定),一般默认是dump.rdb文件。
cd4356
     dump.rdb数据文件默认会写入dir ./这个目录下,即Redis服务器安装目录。注意这个配置一定是目录,而不能是文件名。
cd4356
cd4356

     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 进程意外终止解决方案
cd4356


最基础的测试
<!--Redis Java客户端-->
<dependency>
    <groupId>redis.clients</groupId>
    <artifactId>jedis</artifactId>
    <version>2.9.0</version>
</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"));
    }
}

cd4356

Redis连接池测试
/**
* 通过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

    spring整合redis就是把手动创建redis对象的过程交给spring来控制,然后通过DI在需要使用jedisPool的地方进行注入,从而获得jedis对象进行操作。

    添加所需依赖

<!--Redis Java客户端-->
<dependency>
    <groupId>redis.clients</groupId>
    <artifactId>jedis</artifactId>
    <version>2.9.0</version>
</dependency>
<!--spring依赖-->
<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目录存放

<?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: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">

    <!--引入redis.properties配置参数文件-->
    <context:property-placeholder location="classpath:redis.properties"/>

    <!--redis连接池配置-->
    <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>

	<!--创建Redis连接池,并做相关配置-->
    <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文件详解

发布了90 篇原创文章 · 获赞 111 · 访问量 5万+

猜你喜欢

转载自blog.csdn.net/weixin_42950079/article/details/103199898