当前位置: 首页 > news >正文

SpringBoot中使用Redis-Jedis

SpringBoot中使用Redis-Jedis

  • 配置pom
  • 在`application.properties`配置`Redis`参数
    • 序列化参数设置
    • 实现工具`Redis`操作工具类
    • 单条测试
    • 批量测试

SpringBoot中一般直接引用spring-boot-starter-data-redis这个starter来使用Redis,其中具体实现方式有两种方式
1、Lettuce
2、Jedis

配置pom

注意,这里默认使用lettuce,如果需要使用jedis,需要把lettuce排除掉

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>3.3.3</version><relativePath/> <!-- lookup parent from repository --></parent><groupId>com.example</groupId><artifactId>demo</artifactId><version>0.0.1-SNAPSHOT</version><name>demo</name><properties><java.version>21</java.version></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId><exclusions><exclusion><groupId>io.lettuce</groupId><artifactId>lettuce-core</artifactId></exclusion></exclusions></dependency><dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId><version>5.1.5</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build>
</project>

application.properties配置Redis参数

具体参数信息参考org.springframework.boot.autoconfigure.data.redis.RedisProperties,不同版本有些微差别

spring.application.name=demo
spring.data.redis.host=127.0.0.1
spring.data.redis.port=6379
spring.data.redis.clientType=JEDIS
spring.data.redis.jedis.pool.enabled=true
spring.data.redis.jedis.pool.min-idle=1
spring.data.redis.jedis.pool.max-idle=10
spring.data.redis.jedis.pool.max-active=10
spring.data.redis.jedis.pool.max-wait=5000

序列化参数设置

1、这里直接使用的StringRedisTemplate,要求全部是字符串,序列化的工作交给调用方自己处理,
2、如果要扩展RedisTemplate<K, V>,实现自己的特殊逻辑,这里就要设置key、value的序列化方式

@Configuration
public class RedisConfig {@Beanpublic StringRedisTemplate stringRedisTemplate(JedisConnectionFactory factory) {// 其他参数StringRedisTemplate template = new StringRedisTemplate();template.setConnectionFactory(factory);return template;}
}

实现工具Redis操作工具类

public interface RedisService {/*** 写入缓存** @param key      缓存key* @param value    缓存value* @param timeout  超时时间* @param timeUnit 时间单位* @return*/void set(String key, String value, long timeout, TimeUnit timeUnit);/*** 获取缓存值** @param key 缓存key* @return*/String get(String key);
}@Service
public class RedisServiceImpl implements RedisService {@Autowiredprivate StringRedisTemplate redisTemplate;@Overridepublic void set(String key, String value, long timeout, TimeUnit timeUnit) {redisTemplate.opsForValue().set(key, value, timeout, timeUnit);}@Overridepublic String get(String key) {return redisTemplate.opsForValue().get(key);}
}

单条测试

@SpringBootTest
public class DemoApplicationTests {@Autowiredprivate RedisService redisService;@Testpublic void testSetGet() {String key = "hello";String value = "测试数据";redisService.set(key, value, 10, TimeUnit.SECONDS);Assertions.assertEquals(value, redisService.get(key));}
} 

批量测试

public class DemoApplicationTests {@Autowiredprivate RedisService redisService;@Testpublic void testPool() {this.testSetGet();ExecutorService executorService = Executors.newFixedThreadPool(10);int total = 10000;for (int i = 0; i < 10; i++) {int calcTotal = testPool(total, executorService);Assertions.assertEquals(calcTotal, total);}executorService.shutdown();executorService.close();}private int testPool(int total, ExecutorService executorService) {long start = System.currentTimeMillis();List<CompletableFuture<Integer>> list = IntStream.rangeClosed(1, total).mapToObj(it -> {return build(it, executorService);}).toList();CompletableFuture.allOf(list.toArray(CompletableFuture[]::new)).join();int calcTotal = list.stream().filter(Objects::nonNull).map(it -> {try {return it.get();} catch (Exception e) {return 0;}}).reduce(0, Integer::sum);long end = System.currentTimeMillis();System.out.println("耗时:" + (end - start) / 1000.0 + "s");return calcTotal;}private CompletableFuture<Integer> build(int it, ExecutorService executorService) {final String key = "test:hello:" + it;final String value = "value-" + it;return CompletableFuture.supplyAsync(() -> {try {redisService.set(key, value, 10, TimeUnit.SECONDS);boolean suc = value.equals(redisService.get(key));// System.out.println("build -> " + it + " -> " + Thread.currentThread().getName());if (!suc) {System.out.println("failed ->" + it);return 0;} else {return 1;}} catch (Exception e) {System.out.println("error ->" + it + ", " + e.getMessage());return 0;}}, executorService);}
} 

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 为什么一些行业刚起步就白热化竞争-例如机器人行业?
  • C++入门基础知识46——【关于C++ 函数】调用函数
  • 【软件造价咨询】AI大模型能不能替代软件工程造价师完成软件造价?
  • 安装飞桨paddle2.6.1+cuda11.7+paddleRS-develop开发版
  • HMI触屏网关-VISION如何与Modbus TCP从机通信
  • Linux Debian12安装Peek录屏软件,录制gif动态图
  • UI自动化测试的边界怎么定义?
  • 分享8个Python自动化实战脚本!
  • 基于SparkGraphX实现带权重的PageRank算法
  • java编辑器——IntelliJ IDEA
  • SpringBoot项目集成数据脱敏(密码加密)功能
  • elasticsearch的docker方式安装及golang1.22版本使用elasticsearch7的示例代码
  • 【Unity小工具】多张图片显示在一个Image组件上
  • 【学习笔记】卫星通信NTN 3GPP标准化进展分析(二)- 3GPP Release16 内容
  • python进阶篇-day03-学生管理系统与深浅拷贝
  • 【comparator, comparable】小总结
  • 【Leetcode】104. 二叉树的最大深度
  • 2018天猫双11|这就是阿里云!不止有新技术,更有温暖的社会力量
  • CNN 在图像分割中的简史:从 R-CNN 到 Mask R-CNN
  • ComponentOne 2017 V2版本正式发布
  • Docker: 容器互访的三种方式
  • JavaScript实现分页效果
  • leetcode-27. Remove Element
  • node.js
  • storm drpc实例
  • Vue2 SSR 的优化之旅
  • Vue组件定义
  • WePY 在小程序性能调优上做出的探究
  • 高度不固定时垂直居中
  • 关于List、List?、ListObject的区别
  • 什么是Javascript函数节流?
  • ionic异常记录
  • ​【C语言】长篇详解,字符系列篇3-----strstr,strtok,strerror字符串函数的使用【图文详解​】
  • #LLM入门|Prompt#2.3_对查询任务进行分类|意图分析_Classification
  • #NOIP 2014# day.1 T3 飞扬的小鸟 bird
  • (9)STL算法之逆转旋转
  • (ctrl.obj) : error LNK2038: 检测到“RuntimeLibrary”的不匹配项: 值“MDd_DynamicDebug”不匹配值“
  • (带教程)商业版SEO关键词按天计费系统:关键词排名优化、代理服务、手机自适应及搭建教程
  • (顶刊)一个基于分类代理模型的超多目标优化算法
  • (二)pulsar安装在独立的docker中,python测试
  • (四)软件性能测试
  • (转)清华学霸演讲稿:永远不要说你已经尽力了
  • (转)用.Net的File控件上传文件的解决方案
  • (转贴)用VML开发工作流设计器 UCML.NET工作流管理系统
  • (转载)Linux网络编程入门
  • (自用)仿写程序
  • ******IT公司面试题汇总+优秀技术博客汇总
  • *setTimeout实现text输入在用户停顿时才调用事件!*
  • .bat批处理(九):替换带有等号=的字符串的子串
  • .net 4.0发布后不能正常显示图片问题
  • .net dataexcel winform控件 更新 日志
  • .net dataexcel 脚本公式 函数源码
  • .NET Framework杂记
  • .net MVC中使用angularJs刷新页面数据列表
  • .NET 中 GetProcess 相关方法的性能