redis在项目中运用(基础)
mysql学完命令之后,学过jdbc。
redis也要使用Java连接redis数据库
1.Jedis
2.RedisTemplate[重点]
1、Jedis【了解】
jedis是redis的java版本的客户端实现,jedis中提供了针对redis命令的操作
1.1导入jar文件
Maven方式
<dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId><version>3.3.0</version> </dependency>
测试
入门案例
package com.qf.day63_redis.jedis;
import redis.clients.jedis.Jedis;
/*** ---厚德载物---** @Author wangbo* @Date 2024/10/11* @Desc 人的一生适可而止*/
public class App {public static void main(String[] args) {//1.创建jedis对象Jedis jedis = new Jedis("127.0.0.1", 6379);System.out.println(jedis);//2.设置一个数据jedis.set("likeNum", "100");//.3获取数据String s = jedis.get("likeNum");System.out.println(s);}
}
像一个问题? windows版本的redis 启动时候默认是没有密码的
如何设置密码启动?
1.找到redis.window.conf
找到503行 requirepass root(自己定义的密码)
2.启动 使用命令启动
redis-server redis.windows.conf
package com.qf.day63_redis.jedis;
import redis.clients.jedis.Jedis;
/*** ---厚德载物---** @Author wangbo* @Date 2024/10/11* @Desc 人的一生适可而止*/
public class App {public static void main(String[] args) {//1.创建jedis对象Jedis jedis = new Jedis("127.0.0.1", 6379);//1.1设置密码 如果有密码启动的时候 才取设置的!!!jedis.auth("root");System.out.println(jedis);//2.设置一个数据jedis.set("likeNum", "100");//.3获取数据String s = jedis.get("likeNum");System.out.println(s);}
}
1.2JedisPool
Jedis对象并不是线程安全的,在多线程下使用同一个Jedis对象会出现并发问题。为了避免每次使用Jedis对象时都需要重新构建,Jedis提供了JedisPool。JedisPool是基于Commons Pool 2实现的一个线程安全的连接池。如果使用jedis连接池,需要commons-pool2的jar包
package com.qf.day63_redis.jedis;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;
/*** ---厚德载物---** @Author wangbo* @Date 2024/10/11* @Desc 人的一生适可而止*/
public class JedisUtils {//1.声明连接池的对象private static JedisPool jedisPool = null;static {//2.创建redisPool连接池的配置对象JedisPoolConfig config = new JedisPoolConfig();//最多与多少个jedis对象config.setMaxTotal(50);//最多有多少空闲的jedis对象config.setMaxIdle(20);//最大等待时间config.setMaxWaitMillis(5000);//检查连接的有效性config.setTestOnBorrow(true);
//第二个参数:redis服务器的ip//第三个参数:端口//第四个参数:连接服务器的超时时间//第五个参数:密码//创建redis连接池对象jedisPool = new JedisPool(config, "127.0.0.1", 6379, 1000, "root");}//封装好一个方法,获取Jedis对象public static Jedis getJedis() {Jedis jedis = jedisPool.getResource();return jedis;}//jedis放回池子中public static void close(Jedis jedis) {jedis.close();//}
}
2、在springboot 中集成redis
2.1RedisTemplate
spring-data-redis的jar中,提供在spring应用中通过简单的配置访问redis服务的功能,它对reids底层开发包进行了高度封装。
针对reids的操作,包中提供了RedisTemplate类和StringRedisTemplate类,其中StringRedisTemplate是RedisTemplate的子类,该类只支持key和value为String的操作
2.2主要封装接口
RedisTemplate针对不同数据类型的操作进行封装,将同一类型操作封装为Operation接口
ValueOperations:简单K-V操作,获取方式 redisTemplate.opsForValue();
SetOperations:set类型数据操作,获取方式 redisTemplate.opsForSet();
ZSetOperations:zset类型数据操作,获取方式 redisTemplate.opsForZSet();
HashOperations:针对hash类型的数据操作, 获取方式 redisTemplate.opsForHash();
ListOperations:针对list类型的数据操作,获取方式 redisTemplate.opsForList();
2.3序列化策略
StringRedisTemplate默认采用的是String的序列化策略,保存的key和value都是采用此策略序列化保存的。
RedisTemplate默认采用的是JDK的序列化策略,保存的key和value都是采用此策略序列化保存的。
GenericToStringSerializer: 可以将任何对象泛化为字符串并序列化
Jackson2JsonRedisSerializer: 跟JacksonJsonRedisSerializer实际上是一样的
JacksonJsonRedisSerializer: 序列化object对象为json字符串
JdkSerializationRedisSerializer: 序列化java对象(被序列化的对象必须实现Serializable接口)
StringRedisSerializer: 简单的字符串序列化
GenericToStringSerializer:类似StringRedisSerializer的字符串序列化
GenericJackson2JsonRedisSerializer:类似Jackson2JsonRedisSerializer,但使用时构造函数不用特定的类
【注意】: 存储数据的时候指定 序列化策略
2.4导入jar
<!-- redis --> <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId> </dependency> <!-- pool 对象池 --> <dependency><groupId>org.apache.commons</groupId><artifactId>commons-pool2</artifactId> </dependency>
在SpringBoot 1.5.x版本默认的Redis客户端是Jedis实现的,SpringBoot 2.x版本默认客户端是用lettuce实现的
2.5yml中配置
# redis 配置spring:redis:# 地址host: 127.0.0.1# 端口,默认为6379port: 6379# 数据库索引database: 0# 密码password: root# 连接超时时间timeout: 10slettuce:pool:# 连接池中的最小空闲连接min-idle: 0# 连接池中的最大空闲连接max-idle: 8# 连接池的最大数据库连接数max-active: 8# #连接池最大阻塞等待时间(使用负值表示没有限制)max-wait: -1ms
2.6redis配置类
SpringBoot自动在容器中创建了RedisTemplate对象和StringRedisTemplate对象。但是,RedisTemplate的泛型是<Object,Object>,进行数据处理时比价麻烦,我们需要自定义一个RedisTemplate对象
package com.qf.day63_redis.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;
import javax.annotation.Resource;
/*** ---厚德载物---** @Author wangbo* @Date 2024/10/11* @Desc 人的一生适可而止*/
@Configuration
public class RedisConfig {@Resource//lettuceConnectionFactory 创建lettuce对象的private LettuceConnectionFactory lettuceConnectionFactory;//自定义redisTemplate对象@Beanpublic RedisTemplate<String,Object> redisTemplate() {RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();GenericJackson2JsonRedisSerializer jackson2JsonRedisSerializer = new GenericJackson2JsonRedisSerializer();//key采用String的序列化方式redisTemplate.setKeySerializer(stringRedisSerializer);// value序列化方式采用jacksonredisTemplate.setValueSerializer(jackson2JsonRedisSerializer);// hash的key也采用String的序列化方式redisTemplate.setHashKeySerializer(stringRedisSerializer);// hash的value序列化方式采用jacksonredisTemplate.setHashValueSerializer(jackson2JsonRedisSerializer);redisTemplate.setConnectionFactory(lettuceConnectionFactory);return redisTemplate;}
}
直接测试
package com.qf.day63_redis;
import com.qf.day63_redis.entity.User;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.redis.core.RedisTemplate;
import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.List;
@SpringBootTest
class Day63RedisApplicationTests {@Resourceprivate RedisTemplate<String, Object> redisTemplate;
@Testvoid contextLoads() {redisTemplate.opsForValue().set("viewNum", 1000);Integer num = (Integer)redisTemplate.opsForValue().get("viewNum");System.out.println(num);}@Testvoid test1 () {User user = new User();user.setName("狗蛋");user.setAge(21);redisTemplate.opsForValue().set("user", user);//{"@class":"com.qf.day63_redis.entity.User","name":"狗蛋","age":21}
}@Testvoid test2 () {User user = new User();user.setName("狗蛋");user.setAge(21);User user1 = new User();user1.setName("狗蛋1");user1.setAge(22);User user2 = new User();user2.setName("狗蛋2");user2.setAge(22);List<User> list = new ArrayList<>();list.add(user);list.add(user1);list.add(user2);redisTemplate.opsForValue().set("userList", list);List<User> list1 = (List<User>)redisTemplate.opsForValue().get("userList");System.out.println(list1);////["java.util.ArrayList",[{"@class":"com.qf.day63_redis.entity.User","name":"狗蛋","age":21},{"@class":"com.qf.day63_redis.entity.User","name":"狗蛋1","age":22},{"@class":"com.qf.day63_redis.entity.User","name":"狗蛋2","age":22}]]
}
}
发现对redis数据库操作的时候,还得写ops方法 再根set get del 操作
有一个想法,把这些操作封装到 一个类中,直接使用类调用方法即可
RedisUtils工具类
工具类的第一种写法:
package com.qf.day63_redis.utils;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
/*** ---厚德载物---** @Author wangbo* @Date 2024/10/11* @Desc 人的一生适可而止*/
@Component//把工具类放到了容器中了
public class RedisUtils {@Resourceprivate RedisTemplate<String, Object> redisTemplate;//直接注入public static void setValue (String key, Object value) {redisTemplate.opsForValue().set(key, value);}
}
使用
@Testvoid test4 () {User user1 = new User();user1.setName("狗蛋1");user1.setAge(22);redisUtils.setValue("user1", user1);}
工具类的第二种写法:
就是方法中加了static修饰符 无法 在RedisUtils中注入redisTemplate的对象的
只能借助于一个叫SpringBeanUtils 自己写的工具类型
package com.qf.day63_redis.utils;
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;
/***---厚德载物---*@Author wangbo*@Date 2024/10/11*@Desc* 人的一生适可而止**/
@Component
public class SpringBeanUtils implements ApplicationContextAware {
/*** Spring应用上下文对象*/private static ApplicationContext applicationContext = null;
/*** 注入上下文对象** @param applicationContext* @throws BeansException*/@Overridepublic void setApplicationContext(ApplicationContext applicationContext) throws BeansException {SpringBeanUtils.applicationContext = applicationContext;}
/*** 根据名称获取bean对象** @param name* @param <T>* @return* @throws BeansException*/public static <T> T getBean(String name) {return (T) applicationContext.getBean(name);}
/*** 根据类型获取bean对象** @param clz* @param <T>* @return*/public static <T> T getBean(Class<T> clz) {T result = (T) applicationContext.getBean(clz);return result;}
}
第二种写法的工具类
package com.qf.day63_redis.utils;
import org.springframework.data.redis.core.RedisTemplate;
/*** ---厚德载物---** @Author wangbo* @Date 2024/10/11* @Desc 人的一生适可而止*/
public class RedisUtils1 {//不要使用@Resource注入redisTemplate这个对象了//但是需要redisTemplate对象 咋办? 写一个工具类 获取bean对象的工具类private static RedisTemplate<String , Object> redisTemplate = SpringBeanUtils.getBean("redisTemplate");
public static void setValue (String key, Object value) {redisTemplate.opsForValue().set(key, value);}
}
测试
@Test
void test5 () {User user1 = new User();user1.setName("xixi");user1.setAge(25);RedisUtils1.setValue("user2", user1);
}
项目中杂加redis
1.导包
2.yml文件
2.配置类
3.工具类型
以上全部黏贴复制!!!!
相关文章:
redis在项目中运用(基础)
mysql学完命令之后,学过jdbc。 redis也要使用Java连接redis数据库 1.Jedis 2.RedisTemplate[重点] 1、Jedis【了解】 jedis是redis的java版本的客户端实现,jedis中提供了针对redis命令的操作 1.1导入jar文件 Maven方式 <dependency><group…...
libaom 源码分析系列:svc_encoder_rtc.cc 文件
源码函数关系 文件功能:实现 AV1 svc 编码的 RTC 功能 demo文件位置:libaom/examples/svc_encoder_rtc.cc文件内函数关系图: 结构体 AppInput:svc_encoder_rtc.cc 所属 demo 的结构体,作为从命令行接受参数的结构体;AvxVideoWriter:输出视频写入结构体;aom_codec_enc_c…...
MySQL备份和还原,用mysqldump、mysql和source命令来完成
MySQL备份和还原,都是利用mysqldump、mysql和source命令来完成的。 mysqldump命令使用方法 1运行 | cmd |利用 cd C:\Program Files\MySQL\MySQL Server 9.0\bin”命令进入bin文件夹 2输入命令 mysqldump -h127.0.0.1 -P3306 -uroot -pQWERTY zssjkcf>d:123.sql mysqldump -…...
MySQL Server、HeidiSQL(MySQL 数据库工具)
目录 一、MySQL Server (一)官网下载 (二)安装与配置 二、HeidiSQL软件 (一)安装 1. 官网下载 2. 打开 3. 使用 (1)打开服务 (2)新增数据库 ÿ…...
矩阵相关算法
矩阵旋转90度 给定一个 n n 的二维矩阵 matrix 表示一个图像,请你将图像顺时针旋转 90 度。 #include <iostream> #include <vector>using namespace std;void rotate(vector<vector<int>>& matrix) {int n matrix.size();// 第一步…...
微信小程序-封装通用模块
文章目录 微信小程序-封装通用模块封装toast和modal封装storage封装网络请求 微信小程序-封装通用模块 封装toast和modal /** 提示消息框 */ function toast({title "数据加载中",icon "none",duration 2000,mask true, }) {wx.showToast({title,ico…...
Modnet 人像抠图(论文复现)
Modnet 人像抠图(论文复现) 本文所涉及所有资源均在传知代码平台可获取 文章目录 Modnet 人像抠图(论文复现)论文概述论文方法复现WebUI部署 论文概述 人像抠图(Portrait matting)旨在预测一个精确的 alpha 抠图,可以用…...
利用session机制造测试账号,无需前端也可以测试后端接口
适用场景:我们在测试的时候经常会遇到前端还没有开发完毕,后端已经结束开发了,但是后端的有些接口是需要特定的账号身份调用才会生效,此时因为前端未开发完毕,所以我们不能通过web页面进行登录,那么如何解决…...
JAVA_18
JAVA_18 1.IO流2.JAVA_IO流3.标准输入输出4.对象序列化5.字符编码与字符集6.异常处理和资源关闭 1.IO流 IO流(Input/Output stream)是用于在程序和外部设备(如文件、网络等)之间进行数据传输的机制。它是Java中处理输入和输出操作的一种抽象方式。概念: 输入流(Input Stream):…...
Linux升级openssl版本
Linux升级openssl版本 服务器编译依赖库检查 $ yum -y install gcc gcc-c make libtool zlib zlib-devel版本检测 $ openssl version OpenSSL 1.0.1e-fips 11 Feb 2013 $ ssh -V OpenSSH_6.6.1p1, OpenSSL 1.0.1e-fips 11 Feb 2013下载openssl 地址:https://www.o…...
多态对象的存储方案小结
某个类型有几种不同的子类,Jackson中的JsonTypeInfo 和JsonSubTypes可以应对这种情形,但有点麻烦,并且name属性必须是字符串、必须用Jackson为基础的json工具类对json字符串和对象进行序列化和反序列化。用过一次这种方案后边就不想再用了。 …...
Linux 之 nano 编辑器
使用git提交的时候,发生冲突或要记录相关信息时会弹出nano这个编辑器。 nano [选项] [[行,列] 文件名]... nano[必要参数][选择参数][文件] 命令行白的部分是组合键,后面的则是该组合键的功能。指数符号(^)代表的是键盘的[ctrl]按键,(M)表示…...
zipkin启动脚本并指定mysql数据存储
#!/bin/bash# 配置部分 ############################################################## Zipkin JAR 文件的名称 # 这里指定了 Zipkin 的可执行 JAR 文件,确保该文件在当前目录中可用。 ZIPKIN_JAR"zipkin-server-2.23.2-exec.jar"# PID 文件的位置 # 该…...
超越GPT-4的视觉与文本理解能力,开源多模态模型领跑者 - Molmo
Molmo是由艾伦人工智能研究所(Ai2)发布的一系列多模态人工智能模型,旨在提高开放系统在性能上与专有系统(如商业模型)之间的竞争力。以下是对Molmo的详细总结: Molmo是什么: Molmo是基于Qwen2和…...
输入输出--I/O流【C++提升】()
1.1基础知识: 在C中,输入输出(IO)流是通过标准库中的 <iostream> 头文件来处理的。C 提供了几种基本的输入输出流类,最常用的有以下几种: std::cin:用于输入。std::cout:用于…...
Maven 中央仓库地址推荐
目录 Maven 中央仓库地址推荐 Maven Maven 中央仓库概述 什么是 Maven 中央仓库? 中央仓库的作用 常用的 Maven 中央仓库地址 官方 Maven 中央仓库 阿里云 Maven 中央仓库镜像 腾讯云 Maven 中央仓库镜像 网易 Maven 中央仓库镜像 华为云 Maven 中央仓库…...
Fastgpt本地化部署 - 以MAC为例
1.认识fastgpt 2.私有化部署 MongoDB:用于存储除了向量外的各类数据PostgreSQL/Milvus:存储向量数据OneAPI: 聚合各类 AI API,支持多模型调用 (任何模型问题,先自行通过 OneAPI 测试校验) (1&a…...
SpringBoot框架下购物推荐网站的设计模式与实现
3系统分析 3.1可行性分析 通过对本东大每日推购物推荐网站实行的目的初步调查和分析,提出可行性方案并对其一一进行论证。我们在这里主要从技术可行性、经济可行性、操作可行性等方面进行分析。 3.1.1技术可行性 本东大每日推购物推荐网站采用JAVA作为开发语言&…...
Apache Flink 和 Apache Kafka
Apache Flink 和 Apache Kafka 都是大数据生态系统中非常重要的工具,但它们的作用和应用场景有所不同。下面将分别介绍两者的主要特性和它们之间的异同点。 Apache Kafka 作用: 消息队列:Kafka 主要作为消息队列使用,用于解耦生…...
Excel中Ctrl+e的用法
重点:想要使用ctrle,前提是整合或拆分后的结果放置的单元格必须和被提取信息的单元格相邻,且被提取信息的单元格也必须相连。 下图为错误示例 这样则可以使用ctrle 1、信息整合 2、提取信息 3、添加符号 4、信息顺序调换 5、数字提取 crtle还…...
(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)
题目:3442. 奇偶频次间的最大差值 I 思路 :哈希,时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况,哈希表这里用数组即可实现。 C版本: class Solution { public:int maxDifference(string s) {int a[26]…...
多云管理“拦路虎”:深入解析网络互联、身份同步与成本可视化的技术复杂度
一、引言:多云环境的技术复杂性本质 企业采用多云策略已从技术选型升维至生存刚需。当业务系统分散部署在多个云平台时,基础设施的技术债呈现指数级积累。网络连接、身份认证、成本管理这三大核心挑战相互嵌套:跨云网络构建数据…...
Linux 文件类型,目录与路径,文件与目录管理
文件类型 后面的字符表示文件类型标志 普通文件:-(纯文本文件,二进制文件,数据格式文件) 如文本文件、图片、程序文件等。 目录文件:d(directory) 用来存放其他文件或子目录。 设备…...
React第五十七节 Router中RouterProvider使用详解及注意事项
前言 在 React Router v6.4 中,RouterProvider 是一个核心组件,用于提供基于数据路由(data routers)的新型路由方案。 它替代了传统的 <BrowserRouter>,支持更强大的数据加载和操作功能(如 loader 和…...
【OSG学习笔记】Day 16: 骨骼动画与蒙皮(osgAnimation)
骨骼动画基础 骨骼动画是 3D 计算机图形中常用的技术,它通过以下两个主要组件实现角色动画。 骨骼系统 (Skeleton):由层级结构的骨头组成,类似于人体骨骼蒙皮 (Mesh Skinning):将模型网格顶点绑定到骨骼上,使骨骼移动…...
return this;返回的是谁
一个审批系统的示例来演示责任链模式的实现。假设公司需要处理不同金额的采购申请,不同级别的经理有不同的审批权限: // 抽象处理者:审批者 abstract class Approver {protected Approver successor; // 下一个处理者// 设置下一个处理者pub…...
免费数学几何作图web平台
光锐软件免费数学工具,maths,数学制图,数学作图,几何作图,几何,AR开发,AR教育,增强现实,软件公司,XR,MR,VR,虚拟仿真,虚拟现实,混合现实,教育科技产品,职业模拟培训,高保真VR场景,结构互动课件,元宇宙http://xaglare.c…...
TSN交换机正在重构工业网络,PROFINET和EtherCAT会被取代吗?
在工业自动化持续演进的今天,通信网络的角色正变得愈发关键。 2025年6月6日,为期三天的华南国际工业博览会在深圳国际会展中心(宝安)圆满落幕。作为国内工业通信领域的技术型企业,光路科技(Fiberroad&…...
Docker拉取MySQL后数据库连接失败的解决方案
在使用Docker部署MySQL时,拉取并启动容器后,有时可能会遇到数据库连接失败的问题。这种问题可能由多种原因导致,包括配置错误、网络设置问题、权限问题等。本文将分析可能的原因,并提供解决方案。 一、确认MySQL容器的运行状态 …...
【无标题】湖北理元理律师事务所:债务优化中的生活保障与法律平衡之道
文/法律实务观察组 在债务重组领域,专业机构的核心价值不仅在于减轻债务数字,更在于帮助债务人在履行义务的同时维持基本生活尊严。湖北理元理律师事务所的服务实践表明,合法债务优化需同步实现三重平衡: 法律刚性(债…...
