SpringBoot整合Redis---Jedis版
程序员文章站
2022-09-22 12:55:25
[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整合MongoDB的步骤详解
-
SpringBoot整合SpringCloud搭建分布式应用
-
SpringBoot2.x整合Shiro出现cors跨域问题(踩坑记录)
-
SpringBoot2 整合Nacos组件,环境搭建和入门案例详解
-
SpringBoot 2.x 开发案例之 Shiro 整合 Redis
-
MyEclipse下SpringBoot+JSP整合过程及踩坑
-
SpringBoot无废话入门04:MyBatis整合
-
Springboot整合微信小程序实现登录与增删改查
-
springboot整合websocket后运行测试类报错:javax.websocket.server.ServerContainer not available
-
springboot整合jsp,实现公交车站路线图