介绍

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版的更多相关文章

  1. SpringBoot整合Redis使用Restful风格实现CRUD功能

    前言 本篇文章主要介绍的是SpringBoot整合Redis,使用Restful风格实现的CRUD功能. Redis 介绍 Redis 是完全开源免费的,遵守BSD协议,是一个高性能的key-valu ...

  2. Redis-基本概念、java操作redis、springboot整合redis,分布式缓存,分布式session管理等

    NoSQL的引言 Redis数据库相关指令 Redis持久化相关机制 SpringBoot操作Redis Redis分布式缓存实现 Resis中主从复制架构和哨兵机制 Redis集群搭建 Redis实 ...

  3. SpringBoot系列十:SpringBoot整合Redis

    声明:本文来源于MLDN培训视频的课堂笔记,写在这里只是为了方便查阅. 1.概念:SpringBoot 整合 Redis 2.背景 Redis 的数据库的整合在 java 里面提供的官方工具包:jed ...

  4. springboot整合redis(注解形式)

    springboot整合redis(注解形式) 准备工作 springboot通常整合redis,采用的是RedisTemplate的形式,除了这种形式以外,还有另外一种形式去整合,即采用spring ...

  5. springboot整合redis——redisTemplate的使用

    一.概述 相关redis的概述,参见Nosql章节 redisTemplate的介绍,参考:http://blog.csdn.net/ruby_one/article/details/79141940 ...

  6. 九、springboot整合redis二之缓冲配置

    1.创建Cache配置类 @Configuration @EnableCaching public class RedisCacheConfig extends CachingConfigurerSu ...

  7. 三:Springboot整合Redis

    一:springboot整合redis redis版本:3.0.0 运行环境:linux 1.安装redis 1.1安装gcc yum install gcc-c++ 1.2解压redis.3.0.0 ...

  8. 【SpringBoot | Redis】SpringBoot整合Redis

    SpringBoot整合Redis 1. pom.xml中引入Redis相关包 请注意,这里我们排除了lettuce驱动,采用了jedis驱动 <!-- redis的依赖 --> < ...

  9. SpringBoot(十一):SpringBoot整合Redis

    详解springboot整合redis:https://blog.csdn.net/qq_36781505/article/details/86612988 一.环境准备 Redis-x64-3.2. ...

  10. Springboot整合Redis入门完整篇,零基础入门教学教程

    记录一次简易集成Redis缓存 自定义Redisconfig配置 自定义序列化操作 加深印像 整合前提工具环境准备: 1.redis官网 https://redis.io/download 下载安装r ...

随机推荐

  1. 淘宝rem适配方案

    /*px 转化换 rem ,转化是 10 .比如:你的设计图为750,那么就 750 / 75 = 10 rem.设计图中你量尺寸都要除 75 就是 rem值.再比如量的设计图按钮宽度 66px,那么 ...

  2. web前端——Vue.js基础学习之class与样式绑定

    打着巩固 css 知识的旗号开始了对 vue 样式绑定的研究,相比前一篇的 demo,本次内容多了各种样式在里面,变得稍微花哨了些,话不多说,直接上代码吧: <html> <head ...

  3. Android Popwindow使用总结

    Android Popwindow使用总结 转 https://www.jianshu.com/p/3812ff5ef272 1.基本使用方法 View view = getLayoutInflate ...

  4. C++ list 查找

    #include <iostream>#include <list>#include <algorithm> using namespace std; int ma ...

  5. jmeter测试报告套路

    各位: 以下是本周第一次双师压测结果,后续优化后会更新优化结果.   配置: 压测环境:   staging压测服务器配置4核16G,数据库4核8G 线上环境:   服务器配置16核24G,数据库主库 ...

  6. [Scikit-learn] 1.5 Generalized Linear Models - SGD for Classification

    NB: 因为softmax,NN看上去是分类,其实是拟合(回归),拟合最大似然. 多分类参见:[Scikit-learn] 1.1 Generalized Linear Models - Logist ...

  7. [leetcode_easy]558. Quad Tree Intersection

    problem 558. Quad Tree Intersection re 1. Leetcode_easy_558. Quad Tree Intersection; 2. Grandyang; e ...

  8. C# 实现启用或停止本地网络连接

    获取本机网络连接列表 public static List<string> GetNetList() { List<string> ls = new List<strin ...

  9. 为什么linux系统中init被systemd替换了

    Linux init 进程是系统初始化进程,比较古老了,所以出现了一些新的替代方案: Upstart – A init replacement daemon implemented in Ubuntu ...

  10. dp[2019.5.25]_2

    1.对于长度相同的2个字符串A和B,其距离定义为相应位置字符距离之和.2个非空格字符的距离是它们的ASCII码之差的绝对值.空格与空格的距离为0,空格与其他字符的距离为一定值k. 在一般情况下,字符串 ...