java连接redis

1.使用

1.创建java工程

2.引入依赖

<dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId><version>5.2.0</version>
</dependency>

3.

 //1.获取jedis对象,把所有对redis的操作都封装到该类中//默认连接本地localhost,端口号6379Jedis jedis=new Jedis("192.168.64.130",6379);//key操作Set<String> keys = jedis.keys("*");System.out.println(keys);//判断k1是否存在boolean k1 = jedis.exists("k1");System.out.println(k1);//对string类型的操作String set = jedis.set("name", "aaa");String name = jedis.get("name");System.out.println(name);long setnx = jedis.setnx("name", "bbb");System.out.println(setnx);//对hash类型的操作Map<String, String> map = new HashMap<>();map.put("name","张三");map.put("age","18");map.put("sex","男");jedis.hset("people",map);Map<String, String> people = jedis.hgetAll("people");System.out.println(people);jedis.close();

1.2.Jedis连接池

作用:

提供效率,减少频繁创建和销毁连接对象

 @Testpublic void test02(){//创建jedis连接池的配置JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();//最大值jedisPoolConfig.setMaxTotal(10);//最小空闲值jedisPoolConfig.setMinIdle(5);//最大空闲值jedisPoolConfig.setMaxTotal(8);//拿到jedis对象时,是否验证该对象可用jedisPoolConfig.setTestOnBorrow(true);//等待时间jedisPoolConfig.setMaxWaitMillis(3000);//创建jedis连接池JedisPool jedisPool = new JedisPool(jedisPoolConfig,"192.168.64.130",6379);//获取jedis对象Jedis jedis=jedisPool.getResource();//key操作Set<String> keys = jedis.keys("*");System.out.println(keys);//判断k1是否存在boolean k1 = jedis.exists("k1");System.out.println(k1);//对string类型的操作String set = jedis.set("name", "aaa");String name = jedis.get("name");System.out.println(name);long setnx = jedis.setnx("name", "bbb");System.out.println(setnx);//对hash类型的操作Map<String, String> map = new HashMap<>();map.put("name","张三");map.put("age","18");map.put("sex","男");jedis.hset("people",map);Map<String, String> people = jedis.hgetAll("people");System.out.println(people);jedis.close();}

2.java连接redis集群

@Testpublic void test05(){Set<HostAndPort> nodes=new HashSet<HostAndPort>();nodes.add(new HostAndPort("192.168.64.130",7001));nodes.add(new HostAndPort("192.168.64.130",7002));nodes.add(new HostAndPort("192.168.64.130",7003));nodes.add(new HostAndPort("192.168.64.130",7004));nodes.add(new HostAndPort("192.168.64.130",7005));nodes.add(new HostAndPort("192.168.64.130",7006));JedisCluster jedisCluster=new JedisCluster(nodes);jedisCluster.set("k1","v1");String k1 = jedisCluster.get("k1");System.out.println(k1);jedisCluster.close();}

3.springboot整合redis

在springboot中提供了俩个封装类RedisTemplate和StringRedisTemplate。StringRedisTemplate是
RedisTemplate的子类,StringRedisTemplate存储的元素值,都是String类型,不能直接存储对象类型。

1.依赖

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

2.配置文件

#redis相关配置
spring.data.redis.host=192.168.64.130
spring.data.redis.port=6379
spring.data.redis.jedis.pool.max-idle=8
spring.data.redis.jedis.pool.min-idle=0
spring.data.redis.jedis.pool.max-wait=3000
spring.data.redis.jedis.pool.max-active=10

3.测试

3.1StringRedisTemplate

@Autowiredprivate StringRedisTemplate redisTemplate;@Testpublic void test01() throws JsonProcessingException {//操作redis服务 key操作Boolean k1 = redisTemplate.delete("k1");System.out.println(k1);Boolean k11 = redisTemplate.hasKey("k1");System.out.println(k11);//2.string操作,redis对每一种类型的操作都封装了相应的类,由相应类对象操作相应的数据类型ValueOperations<String, String> forValue = redisTemplate.opsForValue();forValue.set("k1","v1",30, TimeUnit.SECONDS);String k12 = forValue.get("k1");System.out.println(k12);//可以通过序列化吧对象转换为相应的json字符ObjectMapper objectMapper=new ObjectMapper();forValue.set("k3",objectMapper.writeValueAsString(new User("bbb", 18)));String k3 = forValue.get("k3");//反序列化User user = objectMapper.readValue(k3, User.class);System.out.println(user);//如果指定的key存在则存储失败,如果不存在则存储成功Boolean k13 = forValue.setIfAbsent("k2", "333", 30, TimeUnit.SECONDS);System.out.println(k13);//3.hash操作HashOperations<String, Object, Object> forHash = redisTemplate.opsForHash();forHash.put("people","name","aaa");forHash.put("people","age","18");Map<Object, Object> people = forHash.entries("people");System.out.println(people);}

上面的StringRedisTemplate的key和value都是string类型

默认不能存储对象类型,要想存储需要把对象序列化,获取时反序列化

3.2RedisTemplate

@Data
@AllArgsConstructor
@NoArgsConstructor
//默认采用jdk的序列化方式
public class User implements Serializable {private String name;private Integer age;
}
 @Autowiredprivate RedisTemplate redisTemplate;@Testpublic void test02(){//可以操作字符串类型ValueOperations valueOperations = redisTemplate.opsForValue();valueOperations.set("k1","v1");System.out.println(valueOperations.get("k1"));//User类不能序列化valueOperations.set("k2",new User("张三",18));System.out.println(valueOperations.get("k2"));}

因为RedisTemplate默认序列化方式为jdk序列化方式,可以指定序列化方式

如果是hash类型还需要设置hash的

redisTemplate.setHashKeySerializer(new GenericJackson2JsonRedisSerializer());

使用一次需要设置一次

可以使用配置类

@Configuration
public class RedisConfig {@Beanpublic RedisTemplate<String,Object> redisTemplate(RedisConnectionFactory factory){RedisTemplate<String, Object> template= new RedisTemplate<>();RedisSerializer<String> redisSerializer=new StringRedisSerializer();Jackson2JsonRedisSerializer jackson2JsonRedisSerializer=new Jackson2JsonRedisSerializer(Object.class);ObjectMapper om=new ObjectMapper();om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);jackson2JsonRedisSerializer.setObjectMapper(om);//key序列化方式template.setConnectionFactory(factory);//value序列化方式template.setKeySerializer(redisSerializer);template.setValueSerializer(jackson2JsonRedisSerializer);template.setHashKeySerializer(redisSerializer);return template;}
}

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

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

相关文章

论文笔记(七十二)Reward Centering(一)

Reward Centering&#xff08;一&#xff09; 文章概括摘要1 奖励中心化理论 文章概括 引用&#xff1a; article{naik2024reward,title{Reward Centering},author{Naik, Abhishek and Wan, Yi and Tomar, Manan and Sutton, Richard S},journal{arXiv preprint arXiv:2405.0…

强化学习笔记7——DDPG到TD3

前提&#xff1a;基于TD 的方法多少都会有高估问题&#xff0c;即Q值偏大。原因两个&#xff1a;一、TD目标是真实动作的高估。 二&#xff1a;自举法高估。 DDPG 属于AC方法&#xff1a;异策略&#xff0c;适合连续动作空间&#xff0c;因为他的策略网络直接输出的动作&#…

算法——结合实例了解Minimax算法(极小化极大算法)

计算机科学中最有趣的事情之一就是编写一个人机博弈的程序。有大量的例子&#xff0c;最出名的是编写一个国际象棋的博弈机器。但不管是什么游戏&#xff0c;程序趋向于遵循一个被称为Minimax算法&#xff0c;伴随着各种各样的子算法在一块。本篇将简要介绍 minimax 算法&#…

腿足机器人之四- 卡尔曼滤波

腿足机器人之四卡尔曼滤波 概率学基础贝叶斯准则熵 卡尔曼滤波扩展卡尔曼滤波信息滤波器 在机器人&#xff08;四足、人形&#xff09;领域&#xff0c;感知和行动的不确定性可能由多种因素引起&#xff0c;如传感器噪声、外部环境的变化、非精确控制以及实时性算力限制等。 和…

基于AWS云平台的法律AI应用系统开发方案

该方案可实现法律文档处理速度提升300%&#xff0c;关键信息提取准确率可达92%以上&#xff08;基于实际测试数据&#xff09;&#xff0c;适合构建企业级法律智能中台。建议采用分阶段实施策略&#xff0c;优先实现文档解析和智能问答模块。 一、技术栈规划 层级技术组件说明…

使用 GPT-SoVITS 克隆声音,很详细

使用 GPT-SoVITS 克隆声音&#xff0c;很详细 一、前言二、下载三、启动四、克隆声音1、准备克隆音频2、分离人声伴奏3、音频分割4、语音降噪5、ASR工具6、语音文本校对标注工具7、训练模型8、微调训练9、推理 一、前言 最近对文本转语言很感兴趣&#xff0c;但对直接在网站上…

基于Python的Flask微博话题舆情分析可视化系统

2024数据 ✅️标价源码 远程部署加 20 ✅️爬虫可用 有六月数据 ✅️修复bug不会突然打不开网页 系统稳定 系统的功能如下: 1.数据的爬取 2.用户的登录注册 3.热词统计&#xff0c;舆情统计 4.文章统计分析 5.发布地址统计 6.评论统计 7.情感分类统计 编程语言&#xff1a;py…

Pygame中自定义事件处理的方法2-2

在《Pygame中自定义事件处理的方法2-1》中提到了处理自定义事件的方法。通过处理自定义事件&#xff0c;可以实现动画等效果。 1 弹跳小球程序 通过处理自定义事件&#xff0c;可以实现弹跳小球程序&#xff0c;如图1所示。 图1 弹跳小球程序 2 弹跳小球程序原理 实现弹跳小…

【Flink快速入门-5.流处理之多流转换算子】

流处理之多流转换算子 实验介绍 前面实验中介绍的算子已经能够满足我们的大部分开发需求了&#xff0c;但是在实际工作中有时候还会遇到一些业务场景&#xff0c;例如需要摄入多个输入流并将其合并处理&#xff0c;或者需要将一条输入流分割为多条子流&#xff0c;在不同的子…

【STM32】DRV8833驱动电机

1.电机如何转动 只需要给电机两个端子加一正一负的极性就会转起来了&#xff0c;但是要注意的是不要将电机两端直接接在5v和gnd之间&#xff0c;这种电机一般要提供几百毫安的电流&#xff0c;而GPIO口只能提供几毫安&#xff0c;所以我们使用一个DRV8833来驱动 DRV8833输入口…

vue2老版本 npm install 安装失败_安装卡主

vue2老版本 npm install 安装失败_安装卡主 特别说明&#xff1a;vue2老版本安装慢、运行慢&#xff0c;建议升级vue3element plus vite 解决方案1&#xff1a; 第一步、修改npm 镜像为国内镜像 使用淘宝镜像&#xff1a; npm config set registry https://registry.npmmir…

Linux相关概念和易错知识点(27)(认识线程、页表与进程地址空间、线程资源划分)

目录 1.认识线程 &#xff08;1&#xff09;进程与线程的关系 &#xff08;2&#xff09;最小执行流 &#xff08;3&#xff09;轻量级进程&#xff08;LWP&#xff09; ①对task_struct的理解 ②轻量级进程 ③LWP和TCB的区别 2.页表与进程地址空间 &#xff08;1&…

GitHub基本操作及Git简单命令

GitHub简介 GitHub就是一个远程仓库&#xff0c;远程仓库可以理解为就是一个可以保存自己代码的地方&#xff0c;在实际开发当中一个项目往往是有多个人来共同协作开发完成的&#xff0c;那么就需要一个统一代码保存的地方&#xff0c;而GitHub就是起到一个共享和汇总代码的作…

数据结构(陈越,何钦铭)第三讲 树(上)

3.1 树与数的表示 3.1.1 顺序查找 int SequentialSearch(List Tbl,ElementType K){int i;Tbl->Element[0]K;for(iTbl->Length;Tbl->Element[i]!K;i--);return i; } typedef struct LNode *List; struct LNode{ElementType Element[MAXSIZE];int Length; };3.1.2 二分…

【PYTORCH】官方的turoria实现中英文翻译

参考 https://pytorch.org/tutorials/intermediate/seq2seq_translation_tutorial.html 背景 pytorch官方的是seq2seq是法语到英文&#xff0c;做了一个中文到英文的。 数据集 下载后解压&#xff0c;使用的data\testsets\devset\UNv1.0.devset.zh和UNv1.0.devset.en&#x…

仿叮咚买菜鸿蒙原生APP

# DingdongShopping 这是一个原生鸿蒙版的仿叮咚买菜APP项目 鸿蒙Next发布至今已经有一年多的时间了&#xff0c;但有时候我们想要实现一些复杂的功能或者效果&#xff0c;在开发文档上查阅一些资料还是比较费时的&#xff0c;有可能还找不到我们想要的内容。而社会层面上分享…

VSCode 接入DeepSeek V3大模型,附使用说明

VSCode 接入DeepSeek V3大模型,附使用说明 由于近期 DeepSeek 使用人数激增,服务器压力较大,官网已 暂停充值入口 ,且接口响应也开始不稳定,建议使用第三方部署的 DeepSeek,如 硅基流动 或者使用其他模型/插件,如 豆包免费AI插件 MarsCode、阿里免费AI插件 TONGYI Lin…

中上211硕对嵌入式AI感兴趣,如何有效规划学习路径?

今天给大家分享的是一位粉丝的提问&#xff0c;中上211硕对嵌入式AI感兴趣&#xff0c;如何有效规划学习路径&#xff1f; 接下来把粉丝的具体提问和我的回复分享给大家&#xff0c;希望也能给一些类似情况的小伙伴一些启发和帮助。 同学提问&#xff1a; 中上211&#xff0c;…

Linux 目录结构与基础命令学习记录

在 Linux 的学习旅程中&#xff0c;熟练掌握基础命令是开启高效操作与系统管理的钥匙。这些命令不仅能帮助我们在 Linux 系统中自由穿梭&#xff0c;还能深入了解系统的运行状态。以下是我对 Linux 基础命令的学习总结&#xff0c;希望能为大家的 Linux 学习提供帮助。 一、Lin…

python学opencv|读取图像(六十五)使用cv2.boundingRect()函数实现图像轮廓矩形标注

【1】引言 前序学习进程中&#xff0c;已经使用cv2.findContours()函数cv2.drawContours()函数实现图像轮廓识别和标注&#xff0c;这种标注沿着图像的轮廓进行&#xff0c;比较细致。相关文章链接为&#xff1a; python学opencv|读取图像&#xff08;六十四&#xff09;使用…