zoukankan      html  css  js  c++  java
  • SpringBoot整合Redis---Jedis版

    介绍

    Redis简介

    Redis 是完全开源免费的,遵守BSD协议,是一个高性能的key-value数据库。

    Redis 与其他 key - value 缓存产品有以下三个特点:

    • Redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用。
    • Redis不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据结构的存储。
    • Redis支持数据的备份,即master-slave模式的数据备份。

    Redis优势

    • 性能极高 – Redis能读的速度是110000次/s,写的速度是81000次/s 。
    • 丰富的数据类型 – Redis支持二进制案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets 数据类型操作。
    • 原子 – Redis的所有操作都是原子性的,意思就是要么成功执行要么失败完全不执行。单个操作是原子性的。多个操作也支持事务,即原子性,通过MULTI和EXEC指令包起来。
    • 丰富的特性 – Redis还支持 publish/subscribe, 通知, key 过期等等特性。

    SpringBoot和Redis

    SpringBoot整合Redis常用的方式有两种,分别是Jedis和RedisTemplate。Jedis是Redis官方推荐的面向Java的操作Redis的客户端,RedisTemplate是SpringDataRedis中对JedisApi的高度封装。具体使用哪种方式,根据个人需求场景,本文以Jedis为例,整合使用Redis

    开发环境

    请参照: 基于SpringBoot构建分模块项目

    pom文件引入

    <!-- 基于SpringBoot项目的基础上,额外引入一下两个jar包 -->
    <dependency>
         <groupId>org.springframework.boot</groupId>
         <artifactId>spring-boot-starter-data-redis</artifactId>
    </dependency>
    
    <dependency>
        <groupId>redis.clients</groupId>
        <artifactId>jedis</artifactId>
        <version>2.9.0</version>
    </dependency>
    

    创建redis.properties配置文件

    # Redis服务器地址
    redis.host=127.0.0.1
    # Redis服务器连接端口
    redis.port=6379
    # Redis服务器连接密码(默认为空)
    redis.password=null
    redis.timeout=30000
    # 连接池最大连接数(使用负值表示没有限制)
    redis.maxTotal=30
    # 连接池中的最大空闲连接
    redis.maxIdle=10
    redis.numTestsPerEvictionRun=1024
    redis.timeBetweenEvictionRunsMillis=30000
    redis.minEvictableIdleTimeMillis=1800000
    redis.softMinEvictableIdleTimeMillis=10000
    # 连接池最大阻塞等待时间(使用负值表示没有限制)
    redis.maxWaitMillis=1500
    redis.testOnBorrow=true
    redis.testWhileIdle=true
    redis.blockWhenExhausted=false
    

    创建RedisConfig配置类

    package com.wayne.config;
    
    import org.springframework.beans.factory.annotation.Value;
    import org.springframework.boot.context.properties.ConfigurationProperties;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.context.annotation.PropertySource;
    import redis.clients.jedis.JedisPool;
    import redis.clients.jedis.JedisPoolConfig;
    
    /**
     * redis配置类,用于读取redis地址、端口等基础参数
     * @author Wayne
     * @date 2019/4/30
     */
    @Configuration
    @PropertySource("classpath:application-dev.properties")
    public class RedisConfig {
    
        @Value("${redis.host}")
        private String host;
    
        @Value("${redis.port}")
        private int port;
    
        @Value("${redis.timeout}")
        private int timeout;
    
        @Value("${redis.maxIdle}")
        private int maxIdle;
    
        @Value("${redis.maxWaitMillis}")
        private int maxWaitMillis;
    
        @Value("${redis.blockWhenExhausted}")
        private Boolean blockWhenExhausted;
    
        @Value("${redis.JmxEnabled}")
        private Boolean JmxEnabled;
    
        @Bean
        public JedisPool jedisPoolFactory() {
            System.out.println("JedisPool注入开始...");
            JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
            jedisPoolConfig.setMaxIdle(maxIdle);
            jedisPoolConfig.setMaxWaitMillis(maxWaitMillis);
            // 连接耗尽时是否阻塞, false报异常,true阻塞直到超时, 默认true
            jedisPoolConfig.setBlockWhenExhausted(blockWhenExhausted);
            // 是否启用pool的jmx管理功能, 默认tru
            jedisPoolConfig.setJmxEnabled(JmxEnabled);
            JedisPool jedisPool = new JedisPool(jedisPoolConfig, host, port, timeout);
            System.out.println("JedisPool注入成功...");
            return jedisPool;
        }
    }
    

    创建RedisUtil工具类

    package com.wayne.utils;
    
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Component;
    import redis.clients.jedis.Jedis;
    import redis.clients.jedis.JedisPool;
    
    /**
     * Redis工具类
     * @author Wayne
     * @date 2019/4/30
     */
    @Component
    public class RedisUtil {
    
        @Autowired
        private JedisPool jedisPool;
    
        /**
         * 向Redis中存值,永久有效
         */
        public String set(String key, String value) {
            Jedis jedis = null;
            try {
                jedis = jedisPool.getResource();
                return jedis.set(key, value);
            } catch (Exception e) {
                return "0";
            } finally {
                returnResource(jedisPool, jedis);
            }
        }
    
        /**
         * 根据传入Key获取指定Value
         */
        public String get(String key) {
            Jedis jedis = null;
            String value;
            try {
                jedis = jedisPool.getResource();
                value = jedis.get(key);
            } catch (Exception e) {
                return "0";
            } finally {
                returnResource(jedisPool, jedis);
            }
            return value;
        }
    
        /**
         * 校验Key值是否存在
         */
        public Boolean exists(String key) {
            Jedis jedis = null;
            try {
                jedis = jedisPool.getResource();
                return jedis.exists(key);
            } catch (Exception e) {
                return false;
            } finally {
                returnResource(jedisPool, jedis);
            }
        }
    
        /**
         * 删除指定Key-Value
         */
        public Long delete(String key) {
            Jedis jedis = null;
            try {
                jedis = jedisPool.getResource();
                return jedis.del(key);
            } catch (Exception e) {
                return 0L;
            } finally {
                returnResource(jedisPool, jedis);
            }
        }
        
        // 以上为常用方法,更多方法自行百度
    
        /**
         * 释放连接
         */
        private static void returnResource(JedisPool jedisPool, Jedis jedis) {
            if (jedis != null) {
                jedisPool.returnResource(jedis);
            }
        }
    }
    

    使用

    此处以注册发送短信验证码为例,验证码有效时间为2分钟

    @Autowired
    private RedisUtil redisUtil;
    
    @Test
    public void sendMessage() {
        // 验证码为后台随机生成
        final String CAPTCHA = "666666";
        // 手机号为前端传入
        final String MOBILE = "18888888888";
    
        // 发送短信工具类
        MessageUtils.sendMessage(CAPTCHA, MOBILE);
    
        // 将验证码存入Redis
        redisUtil.set(MOBILE, CAPTCHA);
        // 设置验证码过期时间为2分钟
        redisUtil.expire(MOBILE, 60*2);
    
        System.out.println("验证码发送成功");
    }
    
    @Test
    public void validateCaptcha () {
        // 此验证码和手机号均为前端传入
        String CAPTCHA = "666666";
        String MOBILE = "18888888888";
    
        // 校验验证码是否存在Redis中
        if (!redisUtil.exists(MOBILE)) {
            System.out.println("验证码已过期");
            return;
        }
    
        // 获取Redis中的验证码
        String tempCaptcha = redisUtil.get(MOBILE);
    
        // 校验验证码
        if (!CAPTCHA.equals(tempCaptcha)) {
            System.out.println("验证码错误");
            return;
        }
    
        // 删除Redis中的验证码
        redisUtil.delete(MOBILE);
    }
    

    效果

    截图时该Key-Value 剩余时间还有118秒,当时间变为0时,该条数据将会自动从Redis中删除

    验证码

  • 相关阅读:
    (5.1.4)引擎管理——SSMS管理使用小技巧
    (5.1.3)引擎管理——恢复系统数据库
    Kafka 基本原理
    读懂基础机器学习算法
    数据挖掘常用工具
    Oracle 增加修改删除字段
    .net中使用ODP.net访问Oracle数据库(无客户端部署方法)
    数据挖掘系列(1)关联规则挖掘基本概念与Aprior算法
    ORACLE存储过程学习
    js版扫雷(可直接运行试玩)
  • 原文地址:https://www.cnblogs.com/L-Wirepuller/p/11150742.html
Copyright © 2011-2022 走看看