Redis 客户端:Jredis 和 spring-data-redis 整合

article/2025/10/13 11:47:04

因为我使用的是 java ,所以我学习的是java 的客户端 :Jredis 。整合结合自己的项目,把 Jredis 的客户端整合一下。

我们整合需要的工具:

  1. Redis Service
  2. redis.clients.jedis 2.9.0 (java 客户端链接redis)
  3. org.springframework.data.spring-data-redis 1.6.2.RELEASE (spring 整合的 jedis)
  4. jackson-core;jackson-databind ;jackson-annotations (序列化用)

这里 spring-data-redis 和 jedis 都是用的最新版本的,但两个版本不是很兼容,最后经过测试 jedis 2.9.0 和 spring-data-redis 1.6.2 不会报错。

整合的所需的jar 包

		<dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId><version>2.9.0</version></dependency><dependency><groupId>org.springframework.data</groupId><artifactId>spring-data-redis</artifactId><version>1.6.2.RELEASE</version></dependency><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-core</artifactId><version>2.9.8</version></dependency><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>2.9.8</version></dependency><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-annotations</artifactId><version>2.9.8</version></dependency>

设置链接 Redis 的配置文件

我这里参考官网的:https://docs.spring.io/spring-data/redis/docs/1.8.18.RELEASE/reference/html/#redis:connectors:jredis
注:高版本的 spring-data-redis 推荐使用 Lettuce 链接 redis-service,使用的Netty。当然高版本的也会给你自己选择,使用那种方式链接。这里我们使用Jredis来链接。
在这里插入图片描述

增加 redis.properties 配置的参数,密码和ip换成自己的

#JedisPoolConfig的参数
#最大连接数
redis.pool.maxTotal=100
#最大空闲时间
redis.pool.maxIdle=10
#每次最大连接数
redis.pool.numTestsPerEvictionRun=1024
#释放扫描的扫描间隔
redis.pool.timeBetweenEvictionRunsMillis=30000
#连接的最小空闲时间
redis.pool.minEvictableIdleTimeMillis=1800000
#连接控歘按时间多久后释放,当空闲时间>该值且空闲连接>最大空闲连接数时直接释放
redis.pool.softMinEvictableIdleTimeMillis=10000
#获得链接时的最大等待毫秒数,小于0:阻塞不确定时间,默认-1
redis.pool.maxWaitMillis=1500
#在获得链接的时候检查有效性,默认false
redis.pool.testOnBorrow=true
#在空闲时检查有效性,默认false
redis.pool.testWhileIdle=true
#连接耗尽时是否阻塞,false报异常,true阻塞超时,默认true
redis.pool.blockWhenExhausted=false#JedisConnectionFactory的参数
#主机地址,默认:localhost
redis.hostName=localhost
#主机端口,默认:6379
redis.port=6379
#超时时间,默认:2000
redis.timeout=3000
#密码
redis.password=123456
#是否使用连接池,默认true
redis.usePool=true
#使用数据库的索引,0-15之间的数字,默认:0
redis.dbIndex=0
#是否使用数据类型的转换,默认:true
#redis.convertPipelineAndTxResults
#哨兵配置
#redis.sentinelConfig
#集群配置
#redis.clusterConfig

配置 springBean,创建 RedisConfig

@Data
@Configuration
@PropertySource("classpath:redis.properties")
public class RedisConfig {@Value("${redis.pool.maxTotal}")private int maxTotal;@Value("${redis.pool.maxIdle}")private int maxIdle;@Value("${redis.pool.numTestsPerEvictionRun}")private int numTestsPerEvictionRun;@Value("${redis.pool.timeBetweenEvictionRunsMillis}")private int timeBetweenEvictionRunsMillis;@Value("${redis.pool.minEvictableIdleTimeMillis}")private int minEvictableIdleTimeMillis;@Value("${redis.pool.softMinEvictableIdleTimeMillis}")private int softMinEvictableIdleTimeMillis;@Value("${redis.pool.maxWaitMillis}")private int maxWaitMillis;@Value("${redis.pool.testOnBorrow}")private boolean testOnBorrow;@Value("${redis.pool.testWhileIdle}")private boolean testWhileIdle;@Value("${redis.pool.blockWhenExhausted}")private boolean blockWhenExhausted;@Value("${redis.hostName}")private String hostName;@Value("${redis.port}")private int port;@Value("${redis.timeout}")private int timeout;@Value("${redis.password}")private String password;@Value("${redis.dbIndex}")private int dbIndex;@Value("${redis.usePool}")private boolean usePool;@Beanpublic JedisConnectionFactory jedisConnectionFactory() {JedisConnectionFactory config = new JedisConnectionFactory();//设置链接的基本信息config.setHostName(hostName);config.setPort(port);config.setTimeout(timeout);config.setPassword(password);config.setDatabase(dbIndex);config.setUsePool(usePool);//设置链接池的信息config.getPoolConfig().setMaxTotal(maxTotal);config.getPoolConfig().setMaxIdle(maxIdle);config.getPoolConfig().setNumTestsPerEvictionRun(numTestsPerEvictionRun);config.getPoolConfig().setTimeBetweenEvictionRunsMillis(timeBetweenEvictionRunsMillis);config.getPoolConfig().setMinEvictableIdleTimeMillis(minEvictableIdleTimeMillis);config.getPoolConfig().setSoftMinEvictableIdleTimeMillis(softMinEvictableIdleTimeMillis);config.getPoolConfig().setMaxWaitMillis(maxWaitMillis);config.getPoolConfig().setTestOnBorrow(testOnBorrow);config.getPoolConfig().setTestWhileIdle(testWhileIdle);config.getPoolConfig().setBlockWhenExhausted(blockWhenExhausted);return config;}@Beanpublic RedisTemplate<String, Object> redisTemplate(JedisConnectionFactory jedisConnectionFactory){RedisTemplate<String, Object> template = new RedisTemplate<>();// 配置连接工厂template.setConnectionFactory(jedisConnectionFactory);//使用Jackson2JsonRedisSerializer来序列化和反序列化redis的value值(默认使用JDK的序列化方式)Jackson2JsonRedisSerializer jacksonSeial = new Jackson2JsonRedisSerializer(Object.class);ObjectMapper om = new ObjectMapper();// 指定要序列化的域,field,get和set,以及修饰符范围,ANY是都有包括private和publicom.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);// 指定序列化输入的类型,类必须是非final修饰的,final修饰的类,比如String,Integer等会跑出异常om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);jacksonSeial.setObjectMapper(om);// 值采用json序列化template.setValueSerializer(jacksonSeial);//使用StringRedisSerializer来序列化和反序列化redis的key值template.setKeySerializer(new StringRedisSerializer());// 设置hash key 和value序列化模式template.setHashKeySerializer(new StringRedisSerializer());template.setHashValueSerializer(jacksonSeial);template.afterPropertiesSet();return template;}}

最后在Action 中进行操作。

@RequestMapping("/redis")
@RestController
@Slf4j
public class RedisTest {@Autowiredprivate RedisTemplate<String,Object> redisTemplate;@RequestMapping("/index.do")public String redisIndex(){// Stringlog.info("========== String ==========");redisTemplate.opsForValue().set("hello","world");String returnStr = (String) redisTemplate.opsForValue().get("hello");log.info(returnStr);// Hashlog.info("========== Hash ==========");redisTemplate.opsForHash().put("user:1:info","name","小明");redisTemplate.opsForHash().put("user:1:info","age","26");String name = (String) redisTemplate.opsForHash().get("user:1:info","name");String age = (String) redisTemplate.opsForHash().get("user:1:info","age");log.info("name = {};age = {}",name,age);// Listlog.info("========== List ==========");redisTemplate.opsForList().rightPush("mylist","A");redisTemplate.opsForList().rightPush("mylist","B");redisTemplate.opsForList().rightPush("mylist","C");List<Object> listStr = redisTemplate.opsForList().range("mylist",0,-1);for (Object object : listStr){log.info(object.toString());}redisTemplate.opsForList().remove("mylist",0,-1);// setlog.info("========== Set ==========");redisTemplate.opsForSet().add("myset1","A","B","C");redisTemplate.opsForSet().add("myset2","B","C","D");//求并集Set<Object> setStr =  redisTemplate.opsForSet().union("myset1","myset2");for (Object object : setStr){log.info(object.toString());}// zsetlog.info("========== zset ==========");redisTemplate.opsForZSet().add("myzset","xiaoming",56);redisTemplate.opsForZSet().add("myzset","xiaohua",66);redisTemplate.opsForZSet().add("myzset","xiaowang",98);Set<ZSetOperations.TypedTuple<Object>> zsetStr =  redisTemplate.opsForZSet().rangeWithScores("myzset",0,-1);Iterator<ZSetOperations.TypedTuple<Object>> iterator = zsetStr.iterator();while(iterator.hasNext()) {ZSetOperations.TypedTuple<Object> next = iterator.next();log.info("value:{} === score:{}", next.getValue(), next.getScore());}return "";}}

执行结果

========== String ========== world 
========== Hash ========== 
name = 小明;age = 26 
========== List ========== 
A 
B 
C 
========== Set ========== 
A 
C 
B 
D ========== zset ========== 
value:xiaoming === score:56.0 
value:xiaohua === score:66.0 
value:xiaowang === score:98.0 

总结

从上面整体来看,和 redis-cli 上面使用的命令差不多。但是下面还是有几个注意的点。

1:我刚刚开始学习 搞不清楚 jredis 和 RedisTemplate 有什么区别,后面经查询 Jredis是
redis.clients.jedis 2.9.0 包的,RedisTemplate 是spring 封装了 jedis 的操作。
2:之前看教程和视频 user:1:info 这种,以为至少好识别,但是看RedisDeskopManage 的里面,也是按照 :来进行分层的,很好辨识。存在即合理啊。
(CSDN 上面RedisDeskopManage (windows版) 工具要积分:https://pan.baidu.com/s/1v7TwNrZLYrKJcNYmBckrYw 提取码:4nua)
在这里插入图片描述
3:jedis 和 spring-data-redis 的版本要合适。
4:要进行序列化,不然图形界面里面的内容会乱码不好观察,包括英文。
5:看着别人说的头头是道,还是自己实践一下。还是会发现很多问题,印象也会深刻。

之前准备学习的时候写博客,可是都没有坚持下去,希望这次可以有始有终。
Redis 坚持第一天 :为什么要使用 redis ?
Redis 坚持第二天 :Redis 的安装与启动
Redis 坚持第三天 :Redis 使用配置文件启动,常见配置学习。
Redis 坚持第四天 :

  1. Redis 五种常见的数据结构:String
  2. Redis 五种常见的数据结构:Hash
  3. Redis 五种常见的数据结构:List
  4. Redis 五种常见的数据结构:Set
  5. Redis 五种常见的数据结构:zset

Redis 坚持第五天 :Redis 客户端:Jredis 和 spring-data-redis 整合。


http://chatgpt.dhexx.cn/article/qJTaHfJr.shtml

相关文章

Redis使用教程(一)

Redis:单线程、高读写 redis数据库初识 Redis 简介 Redis 的安装配置 Redis 的常见操作 Redis 的数据类型 Redis 的事务控制 Java 操作 Redis 数据库 Redis简介 redis的作用 Redis:REmote DIctionary Server( 远程字典服务器 ) 是完全开源免费的&#xff0c;用 C 语言编写的…

html如何隐藏input,html如何让input隐藏

隐藏方法&#xff1a;1、设置input标签 type属性的值为“hidden”&#xff1b;2、利用input标签的style属性&#xff0c;添加“display:none”样式&#xff1b;3、利用input标签的style属性&#xff0c;添加“visibility:hidden”样式。 本教程操作环境&#xff1a;windows7系统…

使用java实现杨辉三角的输出

案例&#xff1a;杨辉三角 实现代码 结果输出

【Java】 杨辉三角 二维数组打印杨辉三角

Tips 打印三角的操作 : 每行打印前预留空格打印指定数量的星号后换行重复循环打印直至完成所有打印结果 杨辉三角: 三角规律空格最大对称值为 5 大于 5 则会变形三角规律为当前值为上一个值加上前一个值 首尾的数字值相等参考二维数组的规律生成数值 import java.util.Sca…

java输出杨辉三角(等腰三角形版)

网上转了一圈&#xff0c;各种形式都有&#xff0c;给出一种不用那些啥制表符的等腰三角形版本 杨辉三角 杨辉三角形各行的系数满足以下的规律&#xff1a; ①各行第一个数都是1&#xff1b; ②各行最后一个数都是1&#xff1b; ③从第3行起&#xff0c;除上面指出的第一个数…

用Java编写杨辉三角的几种实现方式

一、前言 最近在学习java&#xff0c;遇到了杨辉三角的编程代码题&#xff0c;这是一道经典的面试题&#xff0c;在经过网上搜索和老师的讲解之后&#xff0c;于是想把代码贴出来&#xff0c;分析一下思路。 二、杨辉三角 1.直角杨辉三角 2.等腰杨辉三角 这就是两种杨辉三角…

JAVA杨辉三角的详细解释

近期java面试题中总会出现算法题&#xff0c;最近我看到了很多杨辉三角的面试题&#xff0c;自己当时手写也没分析好思路&#xff0c;在网上听老师一讲于是就写出来了&#xff0c;今天把代码贴出来看下&#xff0c;思路分析下; 首先看下排列的结果&#xff1a; 可以很清楚的看…

Java实现杨辉三角形

一&#xff1a;前言 实现杨辉三角&#xff0c;需要知道什么是杨辉三角。如下图&#xff0c;就是两种杨辉三角。这两种杨辉三角形是目前最常见的&#xff1a; &#xff08;1&#xff09;等边形状的杨辉三角 &#xff08;2&#xff09;直角形状的杨辉三角 二、杨辉三角形的规…

Java代码实现杨辉三角

一、杨辉三角的概念 杨辉三角是二项式系数在三角形中的一种几何排列&#xff0c;南宋数学家杨辉在《详解九章算法》中有记载&#xff0c;欧洲的帕斯卡也发现这一规律&#xff0c;故又称帕斯卡三角形&#xff0c;比杨辉晚几百年发现该规律 二、杨辉三角的特性 他的两条斜边都是…

杨辉三角形Java实现

一、杨辉三角形的特点 &#xff08;1&#xff09;每个数等于它上方两数之和。 &#xff08;2&#xff09;每行数字左右对称&#xff0c;由1开始逐渐变大。 &#xff08;3&#xff09;第n行的数字有n项。 &#xff08;4&#xff09;前六行的杨辉三角形如图&#xff1a; 二、J…

Java解决杨辉三角问题(这里提供了两种方法)

杨辉三角作为一个数学问题&#xff0c;所以我们在做这道题的时候可以用数学思维将其解决。 下面我将我的实现代码和测试结果附上&#xff1a; package practice;/*** 杨辉三角问题*/ public class Yanghuisanjiao {public static void main(String[] args) {print1(25);print2(…

基于Java的杨辉三角

直角杨辉三角 杨辉三角的规律是每行数字的第一列和最后一列的数字都是1&#xff0c;从第三行开始&#xff0c;除去第一列和最后一列都为数字1以外&#xff0c;其余每列的数字都等于它上方两个数字之和。例如下面图片中7字形圈起来的&#xff1a;4 3 1、35 15 20。 代码实…

杨辉三角形(Java版)

不为失败找理由&#xff0c;只为成功找方法。所有的不甘&#xff0c;因为还心存梦想&#xff0c;所以在你放弃之前&#xff0c;好好拼一把&#xff0c;只怕心老&#xff0c;不怕路长。 文章目录 1. 什么是杨辉三角形2. 实现思路&#xff08;方式&#xff09;2.1 递归方式2.2 递…

JAVA实现杨辉三角的三种方式

一、前言 既然是实现杨辉三角&#xff0c;就要知道什么是杨辉三角。如下图&#xff0c;就是两种杨辉三角。 &#xff08;1&#xff09;等边形状的杨辉三角 &#xff08;2&#xff09;直角形状的杨辉三角 在知道这两种都是杨辉三角之后&#xff0c;我们就来实现利用java语言打…

杨辉三角(Java)

实现思路&#xff1a;我们可以先把杨辉三角想象成一个空的二维数组&#xff0c;然后再给它赋值输出即可。 关键在于如何赋值&#xff1a;仔细观察上图可以得出除了每一行第一个数以及最后一个数&#xff08;都是1&#xff09;&#xff0c; 中间的数字规律就是&#xff1a;a[ i …

Java:杨辉三角

键盘录入数字n&#xff0c;输出n行杨辉三角&#xff08;Java&#xff09; 文章目录 前言一、杨辉三角是什么&#xff1f;二、代码拆分解释三、代码运行和结果 1.代码运行2.结果 前言 编写杨辉三角的程序会用到金字塔输出的知识点&#xff0c;点下面连接查看。输入一个整数n&…

Java语言实现杨辉三角

一.提出问题。 使用二维数组打印出如下图的杨辉三角。 二.分析问题。 1.首先想要输出杨辉三角&#xff0c;就要找到它有什么规律&#xff1f; ①第n行有n个数字&#xff1b; ②每一行开始和结束的数字都为1&#xff1b; ③每一个数字都等于它的左上角的数字与右上角数字之和。…

java实现杨辉三角

首先杨辉三角的构成如下 通过分析能得出如下两个规律 1.第n行有n个元素&#xff0c;并且每一行的首尾元素都是1 1.中间的元素等于上面相邻的元素之和&#xff0c;用二维数组表示就是arr[i][j] arr[i-1][j] arr[i-1][j-1] 接下来就是实现动态开辟二维数组以此表示杨辉三角形…

Java编写杨辉三角

如图就是一个7层的杨辉三角&#xff0c;今天我们就用Java来编写这样一个杨辉三角。我还是把这个过程分为几个小的步骤来完成。 一、编写一个二维数组 通过观察&#xff0c;我们可以知道这样一个杨辉三角其实就是每行列数不同的二维数组&#xff0c;且第i行的列数其实就是i&am…

不到50天 零基础 如何学习【数据结构】?

转载于知乎 点击原文链接&#xff0c;可进入原问题 考研计算机&#xff0c;还剩50天&#xff0c;目前零基础&#xff0c;如何学习数据结构&#xff1f; 题主情况&#xff1a; 1.零基础跨专业考研计算机&#xff0c;目前数学英语进度不错。但专业课…因为c语言也是零基础&#x…