使用Java操作Redis的两种方式Jedis、RedisTemplate

在这里插入图片描述

  各位小伙伴们大家好,欢迎来到这个小扎扎的Redis 6专栏,在这个系列专栏中我对B站黑马的Redis教程进行一个总结,鉴于 看到就是学到、学到就是赚到 精神,这波依然是血赚 ┗|`O′|┛

💡Redis知识点速览

  • 🍖 Jedis的使用
    • 🥩 Jedis快速入门
    • 🥩 Jedis连接池
  • 🍖 SpringBoot整合RedisTemplate
    • 🥩 自定义配置RedisTemplate
    • 🥩 StringRedisTemplate

在这里插入图片描述  我们知道,redis是一个很强大的NoSQL数据库,从上面那一张图就可以看出来它分别拥有支持多种语言的客户端,Java语言就是其中之一。上面的截图来源于官网:https://redis.io/docs/clients/在这里插入图片描述  点开Java可以看到,官方推荐我们使用前三种Redisson、Jedis、Lettuce客户端,那么他们分别有何优缺点,我们又该如何选择呢?

  • Redisson是一个基于Redis实现的分布式、可伸缩的Java数据结构集合。包含了诸如Map、Queue、Lock、 Semaphore、AtomicLong等强大功能
  • Jedis以Redis命令作为方法名称,学习成本低,简单实用。但是Jedis实例是线程不安全的,多线程环境下必须需要使用连接池来连接
  • Lettuce是基于Netty实现的,支持同步、异步和响应式编程方式,并且是线程安全的。支持Redis的哨兵模式、集群模式和管道模式

  基于目前的使用状况,我们先学习Jedis的原生API,然后再学习Spring整合Spring Data Redis框架,该框架底层很好的兼容了Jedis和Lettuce

🍖 Jedis的使用

🥩 Jedis快速入门

  官网地址: https://github.com/redis/jedis
第一步: 导依赖

<!--jedis依赖-->
<dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId><version>3.7.0</version>
</dependency><!--单元测试依赖-->
<dependency><groupId>org.junit.jupiter</groupId><artifactId>junit-jupiter</artifactId><version>5.7.0</version>
</dependency>

第二步: 与redis建立连接,在Java中的体现就是实例化一个Jedis对象,构造器的参数需要虚拟机的ip地址,可以使用如下命令查看在这里插入图片描述

/*** 与Redis建立连接 @BeforeEach表示每个方法执行之前都需要执行该方法* @Param void* @return*/
@BeforeEach
void setUp() {// 建立连接jedis = new Jedis("你的虚拟机ip", 6379);// 设置redis的密码jedis.auth("你的redis密码");// 选择使用的库 默认是0号库jedis.select(0);
}

第三步: 测试各种添加查询操作,API的名和redis的命令一致,其他操作参考redis的命令

/** * K-V的测试* @Param void * @return */
@Test
void testHash() {Map<String, String> map = new HashMap<String, String>();map.put("id", "1");map.put("username", "zhagnsan");map.put("age", "20");// 存入数据jedis.hset("user", map);// 获取命令Set<String> userKeys = jedis.hkeys("user");List<String> userValues = jedis.hvals("user");// 输出获取的结果System.out.println(userKeys);System.out.println("============================");System.out.println(userValues);
}

第四步: 断开连接

/*** 关闭连接  @AfterEach表示每个方法执行之后都需要执行该方法* @Param void* @return*/
@AfterEach
void tearDown() {if (jedis != null) {jedis.close();}
}
redis.clients.jedis.exceptions.JedisConnectionException: Failed to create socket.

  如果报上面的错误连接不上的话,可以参考这篇博客https://blog.csdn.net/qq_44624536/article/details/120213607,如果还是无法解决的话,很有可能就是虚拟机的防火墙没有关闭,可以使用如下命令查看并关闭一下(我的就是这个错误原因)

# 查看防火墙状态的命令
systemctl status firewalld
# 关闭防火墙的命令
systemctl stop firewalld

在这里插入图片描述运行结果在这里插入图片描述

🥩 Jedis连接池

  上面说过Jedis本身是线程不安全的,如果在多线程并发操作下极有可能出现线程安全问题,因此在并发的环境下,一定要为每一个线程创建一个独立的线程对象。但是频繁的创建销毁连接会导致性能损耗,因此需要使用到Jedis连接池来代替Jedis的直接连接方式。
第一步: 使用工具类创建并配置连接池对象,并使用静态方法返回连接

public class JedisConnectionFactory {private static final JedisPool JEDIS_POOL;static {// 配置连接池JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();// 设置最大连接数、最大空闲连接、最小空闲连接、设置无连接的等待时间(毫秒为单位)jedisPoolConfig.setMaxTotal(8);jedisPoolConfig.setMaxIdle(8);jedisPoolConfig.setMinIdle(0);jedisPoolConfig.setMaxWaitMillis(1000);// 创建连接池对象JEDIS_POOL = new JedisPool(jedisPoolConfig, "你的虚拟机ip", 6379, 1000, "你的redis密码");}public static Jedis getJedis() {return JEDIS_POOL.getResource();}
}

第二步: 调用静态方法建立连接即可,剩下的操作都一样

@BeforeEach
void setUp() {// 建立连接jedis = JedisConnectionFactory.getJedis();// 选择使用的库 默认是0号库jedis.select(0);
}

🍖 SpringBoot整合RedisTemplate

🥩 自定义配置RedisTemplate

第一步: 导入SpringBoot整合RedisTemplate的依赖,连接池的依赖,SpringBoot项目不用指定技术版本,继承使用父工程中已经配置好的版本

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId>
</dependency><dependency><groupId>org.apache.commons</groupId><artifactId>commons-pool2</artifactId>
</dependency>

第二步: 配置信息

spring:redis:host: 你的虚拟机ipport: 6379password: 你的redis密码lettuce:pool:max-active: 8max-idle: 8min-idle: 0max-wait: 1000

第三步: 直接注入redisTemplate对象,使用它内部的API

@Autowired
private RedisTemplate redisTemplate;@Test
void contextLoads() {redisTemplate.opsForValue().set("name", "zhangsan");Object name = redisTemplate.opsForValue().get("name");System.out.println("name ==>" + name);
}

结果显示并没有问题,可以正常的存入读出在这里插入图片描述但是切换到redis中查看就有问题了,没有name这个key,但是有一个乱码的K-V生成,这是什么原因呢?是因为redisTemplate底层将这个K-V当做对象进行了默认的jdk序列化操作在这里插入图片描述jdk序列化差生的结果会有很多的问题,结果可读性很差,短字符串的话又会很占用内存空间,于是我们可以选择使用其他的序列化方式,使用配置类替代默认的序列化配置

@Configuration
public class RedisConfig {@Beanpublic RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {// 创建RedisTemple对象RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();// 设置连接工厂redisTemplate.setConnectionFactory(redisConnectionFactory);// 创建JSON序列化工具GenericJackson2JsonRedisSerializer jsonRedisSerializer = new GenericJackson2JsonRedisSerializer();// 设置K序列化redisTemplate.setKeySerializer(RedisSerializer.string());redisTemplate.setHashKeySerializer(RedisSerializer.string());// 设置V序列化redisTemplate.setValueSerializer(jsonRedisSerializer);redisTemplate.setHashValueSerializer(jsonRedisSerializer);// 返回RedisTemplate对象return redisTemplate;}
}

由于使用到了JSON所以需要导入相关依赖,如果导入mvc的依赖的话会默认导入JSON但是,我们的项目没有导MVC也没有JSON,所以需要导一下

<dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId>
</dependency>

在这里插入图片描述
按理来说,value也可以是一个对象,redisTemplate会将其序列化为JSON对象进行存储

 @Test
void test01() {redisTemplate.opsForValue().set("user", new User("zhangsan", 20));Object name = redisTemplate.opsForValue().get("name");System.out.println("user ==> " + name);
}

在这里插入图片描述

🥩 StringRedisTemplate

  由于上面使用配置类自定义序列化的方式,导致序列化之后的字符串会带",而且Jason对象序列化之后会带有类的全限定名,数据量大了之后也会影响到存储的性能。于是出现了StringRedisTemplate,这种模板很好的解决了上述问题,但是需要我们手动的将对象进行序列化和反序列化

@SpringBootTest
public class StringRedistemplateTest {@Autowiredprivate StringRedisTemplate stringRedisTemplate;@Testvoid contextLoads() {stringRedisTemplate.opsForValue().set("name", "lisi");Object name = stringRedisTemplate.opsForValue().get("name");System.out.println("name ==>" + name);}// 创建ObjectMapper对象用于序列化和反序列化private static final ObjectMapper MAPPER = new ObjectMapper();@Testvoid test01() throws JsonProcessingException {// 创建user对象  并序列化对象User user = new User("zhangsan", 20);String userJson = MAPPER.writeValueAsString(user);// 写数据stringRedisTemplate.opsForValue().set("user", userJson);// 读数据并反序列化输出String res = stringRedisTemplate.opsForValue().get("user");User jsonUser = MAPPER.readValue(res, User.class);System.out.println("user ==> " + jsonUser);}
}

在这里插入图片描述

@Test
void testHash() {stringRedisTemplate.opsForHash().put("user01", "name", "lisi");stringRedisTemplate.opsForHash().put("user01", "age", "21");Map<Object, Object> user01 = stringRedisTemplate.opsForHash().entries("user01");System.out.println(user01);
}

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/535026.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python提取数据库数据_Python如何读取MySQL数据库表数据

本文实例为大家分享了Python读取MySQL数据库表数据的具体代码&#xff0c;供大家参考&#xff0c;具体内容如下 环境&#xff1a;Python 3.6 ,Window 64bit 目的&#xff1a;从MySQL数据库读取目标表数据&#xff0c;并处理 代码&#xff1a; # -*- coding: utf-8 -*- import p…

【项目实战】基于Redis实现短信验证码登录 (附源码、思路)

各位小伙伴们大家好&#xff0c;欢迎来到这个小扎扎的Redis 6专栏&#xff0c;在这个系列专栏中我对B站黑马的Redis教程进行一个总结&#xff0c;鉴于 看到就是学到、学到就是赚到 精神&#xff0c;这波依然是血赚 ┗|&#xff40;O′|┛ &#x1f4a1;Redis知识点速览&#…

加工中心刻字宏程序_FANUC OI系列图书——车床、铣床及加工中心编程

☞ 这是金属加工(mw1950pub)发布的第10035篇文章导读今天跟大家分享FANUC OI系列图书&#xff0c;包括车床、铣床及加工中心编程&#xff0c;快来看看吧&#xff01;《FANUC 0i数控车床/加工中心编程技巧与实例》选择在企业里应用*广泛、编程*具代表性的日本FANUCSeries0i-TC/T…

Redis 的缓存策略

各位小伙伴们大家好&#xff0c;欢迎来到这个小扎扎的Redis 6专栏&#xff0c;在这个系列专栏中我对B站黑马的Redis教程进行一个总结&#xff0c;鉴于 看到就是学到、学到就是赚到 精神&#xff0c;这波依然是血赚 ┗|&#xff40;O′|┛ &#x1f4a1;Redis知识点速览&#…

关闭后天 树莓派_陪你一起玩树莓派-系统安装

从今天就开始我们的树莓派之旅&#xff0c;心情是不是有点小激动&#xff1f;我们拿到一个树莓派是一个裸机。我们要准备一张16G的高速TF闪存卡&#xff0c;一个5V/2A的USB电源和一根micro B的 usb线。装机步骤&#xff1a;一、下载树莓派系统1、浏览器打开树莓派官方网站 http…

简单的签到代码_PHP实现一个小小的签到功能,到底用MySQL还是Redis?

来源 | http://suo.im/5EWN3k今天&#xff0c;看下签到功能怎么选择&#xff1f;现在的网站和app开发中&#xff0c;签到是一个很常见的功能&#xff0c;如微博签到送积分&#xff0c;签到排行榜~微博签到如移动app &#xff0c;签到送流量等活动&#xff0c;移动app签到用户签…

【Redis 6】缓存穿透、缓存雪崩、缓存击穿(附解决方案、代码)

各位小伙伴们大家好&#xff0c;欢迎来到这个小扎扎的Redis 6专栏&#xff0c;在这个系列专栏中我对B站黑马的Redis教程进行一个总结&#xff0c;鉴于 看到就是学到、学到就是赚到 精神&#xff0c;这波依然是血赚 ┗|&#xff40;O′|┛ &#x1f4a1;Redis知识点速览&#…

8软件遇到的问题及解决方法_Excel工作表中的8个常见问题,你一定遇到过,附解决方法...

在Excel工作表中&#xff0c;最常用的还是一些技巧&#xff0c;如果能够熟练掌握&#xff0c;对于工作效率的提高绝对不是一点点哦&#xff0c;结合工作实际&#xff0c;小编对工作中常见的问题进行了总结&#xff0c;一共有8类&#xff0c;你一定也遇到过……一、Excel工作表常…

unity着色器和屏幕特效开发秘笈_Oculus研发分享:开发移动VR内容时应避免的PC渲染技术...

查看引用/信息源请点击&#xff1a;映维网开发移动VR内容时应避免的PC渲染技术&#xff08;映维网 2019年11月25日&#xff09;有不少开发者都是以与PC相同的方式来开发Quest游戏&#xff0c;但这可能会导致优化性能方面出现大量困难。Oculus软件工程师特雷弗达什&#xff08;T…

Java包装类、java中的方法传参机制:按值调用

各位小伙伴们大家好&#xff0c;欢迎来到这个小扎扎的《Java核心技术 卷Ⅰ》笔记专栏&#xff0c;在这个系列专栏中我将记录浅学这本书所得收获&#xff0c;鉴于 看到就是学到、学到就是赚到 精神&#xff0c;这波简直就是血赚 &#x1f4a1;涉及的知识点速通&#x1f6eb; 方法…

尤克里里怎么样_尤克里里和吉他区别?尤克里里与吉他相比有什么不可替代的优势...

尤克里里和吉他有什么区别&#xff1f;想必大家都见过尤克里里吧&#xff0c;就是类似吉他形状的一种小型弦拨乐器。我们可以简单的认为&#xff1a;尤克里里是简化版本的吉他&#xff0c;更加简单&#xff0c;更加便宜。小编弹的就是尤克里里2.从外观上&#xff1a;吉他很大&a…

饿汉懒汉单例设计模式的使用及区别、java中的import关键字

各位小伙伴们大家好&#xff0c;欢迎来到这个小扎扎的《Java核心技术 卷Ⅰ》笔记专栏&#xff0c;在这个系列专栏中我将记录浅学这本书所得收获&#xff0c;鉴于 看到就是学到、学到就是赚到 精神&#xff0c;这波简直就是血赚 &#x1f4a1;涉及的知识点速通&#x1f6eb; 关于…

广电运通不好进吗_我可以说郑州新风的安装大部分都是垃圾吗?

说郑州的新风安装都是垃圾&#xff0c;这话很无礼&#xff0c;很自大&#xff0c;很傲慢&#xff0c;但是我能说确实是这样嘛&#xff1f;其实包括我以前安装的也不合格——虽然我不是故意的。这几年见过许多家同行安装的新风&#xff0c;可以说目前见到的很多家都不合格&#…

Java迭代器和Collection接口

各位小伙伴们大家好&#xff0c;欢迎来到这个小扎扎的《Java核心技术 卷Ⅰ》笔记专栏&#xff0c;在这个系列专栏中我将记录浅学这本书所得收获&#xff0c;鉴于 看到就是学到、学到就是赚到 精神&#xff0c;这波简直就是血赚 &#x1f4a1;涉及的知识点速通&#x1f6eb; 关于…

私钥经过哈希计算可以产生公钥_「区块链基础概念100」:公钥和私钥 | 027

免责声明&#xff1a;本文旨在传递更多市场信息&#xff0c;不构成任何投资建议。文章仅代表作者观点&#xff0c;不代表火星财经官方立场。小编&#xff1a;记得关注哦投资区块链&#xff0c;猛戳&#xff1a;火星财经App下载来源&#xff1a;学习区块链原文标题&#xff1a;「…

关于List集合类ArrayList、LinkedList、Vector详解

各位小伙伴们大家好&#xff0c;欢迎来到这个小扎扎的《Java核心技术 卷Ⅰ》笔记专栏&#xff0c;在这个系列专栏中我将记录浅学这本书所得收获&#xff0c;鉴于 看到就是学到、学到就是赚到 精神&#xff0c;这波简直就是血赚 &#x1f4a1;涉及的知识点速通&#x1f6eb; 关于…

关于Set集合类你都知道什么?来自《卷Ⅰ》的灵魂提问

各位小伙伴们大家好&#xff0c;欢迎来到这个小扎扎的《Java核心技术 卷Ⅰ》笔记专栏&#xff0c;在这个系列专栏中我将记录浅学这本书所得收获&#xff0c;鉴于 看到就是学到、学到就是赚到 精神&#xff0c;这波简直就是血赚 &#x1f4a1;涉及的知识点速通&#x1f6eb; 关于…

流程图虚线框表示什么_UI设计|APP的交互线框布局设计

一.流程图设计流程图(Flow Chart)&#xff1a;用图示的方式反映出特定主体为了满足特定需求而进行的有特定逻辑关系的一系列操作过程。流程图的四种基本结构&#xff1a;顺序结构&#xff0c;条件结构(又称选择结构)&#xff0c;循环结构&#xff0c;分支结构。1.流程图的常用符…

使用Redis完成商品秒杀业务

各位小伙伴们大家好&#xff0c;欢迎来到这个小扎扎的Redis 6专栏&#xff0c;在这个系列专栏中我对B站黑马的Redis教程进行一个总结&#xff0c;鉴于 看到就是学到、学到就是赚到 精神&#xff0c;这波依然是血赚 ┗|&#xff40;O′|┛ &#x1f4a1;Redis知识点速览&#…

表格列隐藏_【excel每日提升】Excel隐藏列,不让别人打开!

【新朋友】点击标题下面蓝色字“王俊东“关注。 【老朋友】点击右上角&#xff0c;转发或分享本页面内容。excel系列课程excel特效系列课程开始了&#xff0c;今天第2节&#xff01;第1节&#xff1a;Excel有公式的单元格标记颜色&#xff0c;很简单&#xff01;第2节&#xf…