欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

SpringBoot整合Redis---Jedis版

程序员文章站 2022-04-23 15:15:27
[TOC] 介绍 Redis简介 Redis 是完全开源免费的,遵守BSD协议,是一个高性能的key value数据库。 Redis 与其他 key value 缓存产品有以下三个特点: Redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用。 Redis不仅仅支 ......

介绍

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中删除

SpringBoot整合Redis---Jedis版