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

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学完命令之后&#xff0c;学过jdbc。 redis也要使用Java连接redis数据库 1.Jedis 2.RedisTemplate[重点] 1、Jedis【了解】 jedis是redis的java版本的客户端实现&#xff0c;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 &#xff08;一&#xff09;官网下载 &#xff08;二&#xff09;安装与配置 二、HeidiSQL软件 &#xff08;一&#xff09;安装 1. 官网下载 2. 打开 3. 使用 &#xff08;1&#xff09;打开服务 &#xff08;2&#xff09;新增数据库 ​&#xff…...

矩阵相关算法

矩阵旋转90度 给定一个 n n 的二维矩阵 matrix 表示一个图像&#xff0c;请你将图像顺时针旋转 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 人像抠图&#xff08;论文复现&#xff09; 本文所涉及所有资源均在传知代码平台可获取 文章目录 Modnet 人像抠图&#xff08;论文复现&#xff09;论文概述论文方法复现WebUI部署 论文概述 人像抠图(Portrait matting)旨在预测一个精确的 alpha 抠图&#xff0c;可以用…...

利用session机制造测试账号,无需前端也可以测试后端接口

适用场景&#xff1a;我们在测试的时候经常会遇到前端还没有开发完毕&#xff0c;后端已经结束开发了&#xff0c;但是后端的有些接口是需要特定的账号身份调用才会生效&#xff0c;此时因为前端未开发完毕&#xff0c;所以我们不能通过web页面进行登录&#xff0c;那么如何解决…...

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 地址&#xff1a;https://www.o…...

多态对象的存储方案小结

某个类型有几种不同的子类&#xff0c;Jackson中的JsonTypeInfo 和JsonSubTypes可以应对这种情形&#xff0c;但有点麻烦&#xff0c;并且name属性必须是字符串、必须用Jackson为基础的json工具类对json字符串和对象进行序列化和反序列化。用过一次这种方案后边就不想再用了。 …...

Linux 之 nano 编辑器

使用git提交的时候&#xff0c;发生冲突或要记录相关信息时会弹出nano这个编辑器。 nano [选项] [[行,列] 文件名]... nano[必要参数][选择参数][文件] 命令行白的部分是组合键&#xff0c;后面的则是该组合键的功能。指数符号(^)代表的是键盘的[ctrl]按键&#xff0c;(M)表示…...

zipkin启动脚本并指定mysql数据存储

#!/bin/bash# 配置部分 ############################################################## Zipkin JAR 文件的名称 # 这里指定了 Zipkin 的可执行 JAR 文件&#xff0c;确保该文件在当前目录中可用。 ZIPKIN_JAR"zipkin-server-2.23.2-exec.jar"# PID 文件的位置 # 该…...

超越GPT-4的视觉与文本理解能力,开源多模态模型领跑者 - Molmo

Molmo是由艾伦人工智能研究所&#xff08;Ai2&#xff09;发布的一系列多模态人工智能模型&#xff0c;旨在提高开放系统在性能上与专有系统&#xff08;如商业模型&#xff09;之间的竞争力。以下是对Molmo的详细总结&#xff1a; Molmo是什么&#xff1a; Molmo是基于Qwen2和…...

输入输出--I/O流【C++提升】()

1.1基础知识&#xff1a; 在C中&#xff0c;输入输出&#xff08;IO&#xff09;流是通过标准库中的 <iostream> 头文件来处理的。C 提供了几种基本的输入输出流类&#xff0c;最常用的有以下几种&#xff1a; std::cin&#xff1a;用于输入。std::cout&#xff1a;用于…...

Maven 中央仓库地址推荐

目录 Maven 中央仓库地址推荐 Maven Maven 中央仓库概述 什么是 Maven 中央仓库&#xff1f; 中央仓库的作用 常用的 Maven 中央仓库地址 官方 Maven 中央仓库 阿里云 Maven 中央仓库镜像 腾讯云 Maven 中央仓库镜像 网易 Maven 中央仓库镜像 华为云 Maven 中央仓库…...

Fastgpt本地化部署 - 以MAC为例

1.认识fastgpt 2.私有化部署 MongoDB&#xff1a;用于存储除了向量外的各类数据PostgreSQL/Milvus&#xff1a;存储向量数据OneAPI: 聚合各类 AI API&#xff0c;支持多模型调用 &#xff08;任何模型问题&#xff0c;先自行通过 OneAPI 测试校验&#xff09; &#xff08;1&a…...

SpringBoot框架下购物推荐网站的设计模式与实现

3系统分析 3.1可行性分析 通过对本东大每日推购物推荐网站实行的目的初步调查和分析&#xff0c;提出可行性方案并对其一一进行论证。我们在这里主要从技术可行性、经济可行性、操作可行性等方面进行分析。 3.1.1技术可行性 本东大每日推购物推荐网站采用JAVA作为开发语言&…...

Apache Flink 和 Apache Kafka

Apache Flink 和 Apache Kafka 都是大数据生态系统中非常重要的工具&#xff0c;但它们的作用和应用场景有所不同。下面将分别介绍两者的主要特性和它们之间的异同点。 Apache Kafka 作用&#xff1a; 消息队列&#xff1a;Kafka 主要作为消息队列使用&#xff0c;用于解耦生…...

Excel中Ctrl+e的用法

重点&#xff1a;想要使用ctrle&#xff0c;前提是整合或拆分后的结果放置的单元格必须和被提取信息的单元格相邻&#xff0c;且被提取信息的单元格也必须相连。 下图为错误示例 这样则可以使用ctrle 1、信息整合 2、提取信息 3、添加符号 4、信息顺序调换 5、数字提取 crtle还…...

服务器很卡,是CC攻击造成的吗

之前有客户反馈&#xff0c;服务器有一段时间使用总是会遇到卡的情况&#xff0c;查看并无流量攻击的情况&#xff0c;程序也未进行过什么修改&#xff0c;用户人数也没有什么变化。来咨询是什么原因导致的。导致机器卡的情况&#xff0c;一般有带宽不够&#xff0c;硬件性能不…...

错位排序算法

首先&#xff0c;让我们理解什么是错位排列&#xff1a;错位排列是指在排列中&#xff0c;任何一个元素都不在自己原来的位置上。比如&#xff0c;对于序列 {1,2,3}{1,2,3}&#xff0c;一个错位排列可能是 {3,1,2}{3,1,2}&#xff0c;因为 11 不在位置 11 上&#xff0c;22 不在…...

毕业设计实战:基于Java+MySQL的教务管理系统设计与实现指南

毕业设计实战&#xff1a;基于JavaMySQL的教务管理系统设计与实现指南 在开发“基于JavaMySQL的教务管理系统”毕业设计时&#xff0c;曾因课程报名表未通过学生ID与课程ID双外键关联踩过关键坑——初期仅设计报名编号、报名时间等基础字段&#xff0c;未与学生表、课程表建立关…...

企微API集成指南——从回调到主动发送,全流程代码解析

企业微信提供了丰富的API&#xff0c;用于接收用户添加事件、发送消息、管理标签等。今天从实战角度&#xff0c;给出API集成的最佳实践&#xff0c;附带伪代码。一、核心API清单API用途频率限制获取access_token调用其他API的前提2000次/分钟添加外部联系人通过好友每个号300人…...

昆明理工大学材料科学与工程考研复试资料|F001现代材料测试技术专项复习包|电子版

温馨提示&#xff1a;文末有联系方式一、昆明理工大学材料科学与工程专业复试资料全面升级 专为报考昆明理工大学材料科学与工程学院硕士研究生设计&#xff0c;深度对标最新复试大纲&#xff0c;系统梳理核心考核模块&#xff0c;助力考生精准把握复试命方向与评分标准。二、F…...

抖音批量下载神器:免费一键收藏创作者全部作品

抖音批量下载神器&#xff1a;免费一键收藏创作者全部作品 【免费下载链接】douyin-downloader A practical Douyin downloader for both single-item and profile batch downloads, with progress display, retries, SQLite deduplication, and browser fallback support. 抖音…...

GLM-OCR模型Node.js环境配置与API服务搭建全指南

GLM-OCR模型Node.js环境配置与API服务搭建全指南 你是不是也遇到过这样的场景&#xff1f;手头有一堆图片需要提取文字&#xff0c;比如扫描的文档、截图或者手机拍的照片。自己手动录入&#xff1f;效率太低。用现成的在线OCR工具&#xff1f;又担心数据安全和调用限制。特别…...

别再找插件了!手把手教你用uni-app的Canvas API画一个带渐变和刻度的环形进度条

原生Canvas魔法&#xff1a;在uni-app中打造高性能渐变环形进度条 每次看到那些酷炫的数据可视化图表&#xff0c;你是不是也想过自己动手实现&#xff1f;但面对复杂的第三方图表库文档和性能问题又望而却步。今天我要分享的是如何用uni-app原生Canvas API&#xff0c;从零开始…...

Wi-Fi 6高密度网络优化:实战漫游与性能提升

Wi-Fi 6高密度网络优化&#xff1a;实战漫游与性能提升在诸如大型企业园区、高流量高校、人流密集的会展中心等高密度用户环境中&#xff0c;传统Wi-Fi网络面临着严峻的无线接入挑战。Wi-Fi 6 (802.11ax) 标准以更高的频谱效率、更低的延迟和卓越的设备并发能力&#xff0c;为解…...

保姆级教程:手把手教你用GLM-4v-9b搭建图片问答机器人

保姆级教程&#xff1a;手把手教你用GLM-4v-9b搭建图片问答机器人 你是不是经常遇到这样的情况&#xff1a;看到一张复杂的图表&#xff0c;想快速了解里面的数据含义&#xff1b;或者收到一张产品图&#xff0c;想知道它的具体型号和功能&#xff1b;又或者辅导孩子作业时&am…...