springboot苍穹外卖实战:六、redis(Spring Data Redis)
Spring Data Redis
简介
网址:https://spring.io/projects/spring-data-redis
Spring Data Redis中提供了一个高度封装的类:RedisTemplate,对相关api进行了归类封装,将同一类型操作封装为operation接口,具体分类如下:
- ValueOperations:string数据操作
- SetOperations:set类型数据操作
- ZSetOperations:zset类型数据操作
- HashOperations:hash类型的数据操作
- ListOperations:list类型的数据操作
环境搭建
导入maven坐标
初始项目结构已经搭建好
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
配置Redis数据源
在application-dev.yml中添加
sky:redis:host: localhostport: 6379password: 123456database: 10
解释说明:
database:指定使用Redis的哪个数据库,Redis服务启动后默认有16个数据库,编号分别是从0到15。如果不在yml文件中指定该参数,默认使用的是DB0。
在application.yml中添加读取application-dev.yml中的相关Redis配置
spring:profiles:active: devredis:host: ${sky.redis.host}port: ${sky.redis.port}password: ${sky.redis.password}database: ${sky.redis.database}
编写配置类,创建RedisTemplate对象
package com.sky.config;import lombok.extern.slf4j.Slf4j;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.StringRedisSerializer;@Configuration
@Slf4j
public class RedisConfiguration {@Bean//形参中的连接工厂对象实际上并不需要我们手动传入,因为我们引入了starter,它会自动帮我们传入的。public RedisTemplate redisTemplate(RedisConnectionFactory redisConnectionFactory){log.info("开始创建redis模板对象");RedisTemplate redisTemplate = new RedisTemplate();//设置redis的连接工厂对象redisTemplate.setConnectionFactory(redisConnectionFactory);//设置redis key的序列化器,否则java传过去的数据存储到redis里面会是一串二进制数或者其他格式的数。//因为这里只设置了key的序列化器,后续测试时可以看到field和value显示的值不一定是java传过去的值。redisTemplate.setKeySerializer(new StringRedisSerializer());return redisTemplate;}
}
解释说明:
当前配置类不是必须的,因为 Spring Boot 框架会自动装配 RedisTemplate 对象,但是默认的key序列化器为JdkSerializationRedisSerializer,导致我们存到Redis中后的数据和原始数据有差别,故设置为StringRedisSerializer序列化器。
且形参的连接工厂对象报红报错是正常的,暂时先别管。
通过RedisTemplate对象操作Redis
在test下新建测试类
package com.sky.test;import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.redis.core.*;@SpringBootTest
public class SpringDataRedisTest {@Autowiredprivate RedisTemplate redisTemplate;@Testpublic void testRedisTemplate(){System.out.println(redisTemplate);//string数据操作ValueOperations valueOperations = redisTemplate.opsForValue();//hash类型的数据操作HashOperations hashOperations = redisTemplate.opsForHash();//list类型的数据操作ListOperations listOperations = redisTemplate.opsForList();//set类型数据操作SetOperations setOperations = redisTemplate.opsForSet();//zset类型数据操作ZSetOperations zSetOperations = redisTemplate.opsForZSet();}
}
编写测试方法
测试字符串
@Testpublic void testString(){// 相当于redis中的set city 背景redisTemplate.opsForValue().set("city", "北京");// 相当于redis中的get cityString city = (String) redisTemplate.opsForValue().get("city");System.out.println(city);// 相当于redis中的setex code 180 1234 因为这里是3分钟,redis中的setex语句默认是秒,所以是180秒redisTemplate.opsForValue().set("code","1234",3, TimeUnit.MINUTES);// 相当于setnx lock 1和setnx lock 2redisTemplate.opsForValue().setIfAbsent("lock","1");redisTemplate.opsForValue().setIfAbsent("lock","2");}
测试哈希
@Testpublic void testHash(){HashOperations hashOperations = redisTemplate.opsForHash();// 相当于redis中的hset 100 name tomhashOperations.put("100","name","tom");hashOperations.put("100","age","20");// 相当于redis中的hget 100 nameString name = (String) hashOperations.get("100", "name");System.out.println(name);//相当于redis中的hkeys 100Set keys = hashOperations.keys("100");System.out.println(keys);//相当于redis中的hvals 100List values = hashOperations.values("100");System.out.println(values);//相当于redis中的hdel 100 agehashOperations.delete("100","age");}
测试列表
/*** 操作列表类型的数据*/@Testpublic void testList(){//lpush lrange rpop llenListOperations listOperations = redisTemplate.opsForList();listOperations.leftPushAll("mylist","a","b","c");listOperations.leftPush("mylist","d");List mylist = listOperations.range("mylist", 0, -1);System.out.println(mylist);listOperations.rightPop("mylist");Long size = listOperations.size("mylist");System.out.println(size);}
测试集合
/*** 操作集合类型的数据*/@Testpublic void testSet(){//sadd smembers scard sinter sunion sremSetOperations setOperations = redisTemplate.opsForSet();setOperations.add("set1","a","b","c","d");setOperations.add("set2","a","b","x","y");Set members = setOperations.members("set1");System.out.println(members);Long size = setOperations.size("set1");System.out.println(size);Set intersect = setOperations.intersect("set1", "set2");System.out.println(intersect);Set union = setOperations.union("set1", "set2");System.out.println(union);setOperations.remove("set1","a","b");}
测试有序列表
/*** 操作有序集合类型的数据*/@Testpublic void testZset(){//zadd zrange zincrby zremZSetOperations zSetOperations = redisTemplate.opsForZSet();zSetOperations.add("zset1","a",10);zSetOperations.add("zset1","b",12);zSetOperations.add("zset1","c",9);Set zset1 = zSetOperations.range("zset1", 0, -1);System.out.println(zset1);zSetOperations.incrementScore("zset1","c",10);zSetOperations.remove("zset1","a","b");}
测试通用
/*** 通用命令操作*/@Testpublic void testCommon(){//keys exists type delSet keys = redisTemplate.keys("*");System.out.println(keys);Boolean name = redisTemplate.hasKey("name");Boolean set1 = redisTemplate.hasKey("set1");for (Object key : keys) {DataType type = redisTemplate.type(key);System.out.println(type.name());}redisTemplate.delete("mylist");}
相关文章:
springboot苍穹外卖实战:六、redis(Spring Data Redis)
Spring Data Redis 简介 网址:https://spring.io/projects/spring-data-redis Spring Data Redis中提供了一个高度封装的类:RedisTemplate,对相关api进行了归类封装,将同一类型操作封装为operation接口,具体分类如下࿱…...
sqli 靶场 Level23-Level30 wp
level-23 (注释被过滤) 抓包,查看正常请求和响应。 略 尝试是否存在注入 id1’,id1’,成周期性变化 尝试 POC POC: id1andextractValue(1,concat(0x7e,user()))-- 结果:failed。怀疑–被过滤掉了,尝试…...
《完蛋!我被美女包围了》突然火了!世界首个开源贡献榜出炉丨 RTE 开发者日报 Vol.75
开发者朋友们大家好: 这里是 「RTE 开发者日报」 ,每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享 RTE (Real Time Engagement) 领域内「有话题的 新闻 」、「有态度的 观点 」、「有意思的 数据 」、「有思考的 文…...
C++ Qt 学习(一):Qt 入门
Qt6 安装教程 0. 基础知识 0.1 qmake 和 cmake 对比 qmake:qt 独有的代码构建工具cmake:C 通用的代码构建工具,绝大部分 C 开源项目都使用 cmake 管理代码qt 项目,没有特殊要求,使用 qmake 即可 0.2 Qt 3 个窗口类的…...
高性能消息中间件 - Kafka3.x(三)
文章目录 高性能消息中间件 - Kafka3.x(三)Kafka Broker ⭐Kafka Broker概念Zookeeper(新版本可以不使用zk了)⭐Zookeeper的作用 Kafka的选举1:Broker选举Leader⭐Broker核心参数⭐案例:服役新节点和退役旧…...
【八】Linux成神之路
Linux成神之路 简介:最近梳理了一下自己linux系统的学习历程,感觉整个成长过程就很顺利,并没有走弯路,于是想着可以不可以把自己linux系统学习的路线记录下来,能够在大家成长的路上有一点帮助,就在这样的一…...
功能测试用例,需要详细到什么程度?
📢专注于分享软件测试干货内容,欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正!📢交流讨论:欢迎加入我们一起学习!📢资源分享:耗时200小时精选的「软件测试」资…...
VScode远程连接错误:进程试图写入不存在的管道
使用VScode连接树莓派时,出现远程连接错误:进程试图写入不存在的管道 解决方案: (1)可以进入config所在文件夹,删除文件 (2)无法解决的化尝试下述方法 输入 Remotting-SSH:Settin…...
Python测试之Pytest详解
概要 当涉及到python的测试框架时,pytest是一个功能强大且广泛应用的第三方库。它提供简洁而灵活的方式来编写和执行测试用例,并具有广泛的应用场景。下面是pytest的介绍和详细使用说明: pytest是一个用于python单元测试的框架,它…...
uni-app微信小程序打开第三方地图
需求 小程序中有个按钮点击以后会调用手机中第三方地图进行导航。参数 位置信息 经度 与纬度。 实现方法 uni.openLocation({latitude: Number(地址纬度),longitude: Number(地址经度),name: 地址名称,address: 地址详情,success: function (res) {console.log(打开系统位置地…...
Android NDK开发详解之NDK 使用入门
Android NDK开发详解之NDK 使用入门 下载 NDK 和工具创建或导入原生项目 原生开发套件 (NDK) 是一套工具,使您能够在 Android 应用中使用 C 和 C 代码,并提供众多平台库,您可使用这些平台库管理原生 activity 和访问实体设备组件,…...
nmap指纹识别要点以及又快又准之方法
nmap指纹识别要点以及又快又准之方法 一. 前言:二. nmap识别实验:一. 实验一:IP配置:空间配置:扫描结果:详细输出二. 实验二:IP配置:空间配置:扫描结果:详细输出三. 实验三:IP配置:空间配置:扫描结果:详细输出四. 实验四:IP...
Rust编程基础之6大数据类型
1.Rust数据类型 在 Rust 中, 每一个值都属于某一个 数据类型(data type), 这告诉 Rust 它被指定为何种数据,以便明确数据处理方式。我们将看到两类数据类型子集:标量(scalar)和复合(compound&a…...
06 MIT线性代数-线性无关,基和维数Independence, basis, and dimension
1. 线性无关 Independence Suppose A is m by n with m<n (more unknowns than equations) Then there are nonzero solutions to Ax0 Reason: there will be free variables! A中具有至少一个自由变量,那么Ax0一定具有非零解。A的列向量可以线性组合得到零向…...
Kubernetes 概述以及Kubernetes 集群架构与组件
目录 Kubernetes概述 K8S 是什么 为什么要用 K8S K8S 的特性 Kubernetes 集群架构与组件 核心组件 Master 组件 Node 组件 编辑 Kubernetes 核心概念 常见的K8S按照部署方式 Kubernetes概述 K8S 是什么 K8S 的全称为 Kubernetes,Kubernetes 是一个可移植、可扩…...
GZ035 5G组网与运维赛题第9套
2023年全国职业院校技能大赛 GZ035 5G组网与运维赛项(高职组) 赛题第9套 一、竞赛须知 1.竞赛内容分布 竞赛模块1--5G公共网络规划部署与开通(35分) 子任务1:5G公共网络部署与调试(15分) 子…...
使用Jasypt3.0.3版本对SpringBoot配置文件加密
时间 2023-11-01 使用Jasypt3.0.3版本对SpringBoot配置文件加密 目录 引入依赖使用密钥生成密文配置yml验证是否自动解密 引入依赖 <!--yml 文件加解密--><dependency><groupId>com.github.ulisesbocchio</groupId><artifactId>jasypt-spring-b…...
生成一篇博客,详细讲解springboot的单点登录功能,有流程图,有源码demo
SpringBoot是目前非常流行的一个Java开发框架,它以简洁的配置和快速的开发效率著称。在实际应用中,单点登录是一个非常重要的功能,它可以让用户在多个应用系统中使用同一个账号登录,提高用户体验和安全性。本文将详细讲解如何在Sp…...
Hadoop、Hive安装
一、 工具 Linux系统:Centos,版本7.0及以上 JDK:jdk1.8 Hadoop:3.1.3 Hive:3.1.2 虚拟机:VMware mysql:5.7.11 工具下载地址: https://pan.baidu.com/s/1JYtUVf2aYl5–i7xO6LOAQ 提取码: xavd…...
PHP自定义函数--输入起始日期和解算日期返回日期差几天和 上一个周期的起始结束日期
/** 日期差几天* param beginDate:2018-01-26 endDatee:2018-01-26* return int days* */ function dateDiff($beginDate, $endDate) {$diff date_diff(date_create($beginDate), date_create($endDate))->format(%R%a);return (int)$diff; }/** 返回上一周期的起始和结束日…...
超流体真空理论:光速本质、微观粒子结构与量子纠缠拓扑机制
摘要本文基于超流体真空理论框架,揭示狭义相对论洛伦兹变换的物理本源,诠释光速不变的底层形成机制,明确微观基本粒子的真空结构起源;同时提出原创性量子纠缠拓扑结构模型,定义纠缠传态的速度极限与物理机制࿰…...
Spire实现Wod与Pdf相互转换
在 Java 中使用 Spire 库进行 Word 和 PDF 的转换,你需要用到两个不同的库:Word 转 PDF:使用 Spire.Doc for Java (免费版)PDF 转 Word:使用 Spire.PDF for Java (免费版)重要提示: 免费版(Free Spire&…...
、SEATA分布式事务——XA模式咀
MySQL 中的 count 三兄弟:效率大比拼! 一、快速结论(先看结论再看分析) 方式 作用 效率 一句话总结 count(*) 统计所有行数 最高 我是专业的!我为统计而生 count(1) 统计所有行数 同样高效 我是 count(*) 的马甲兄…...
7个实用技巧掌握MySQL连接查询:INNER JOIN、LEFT JOIN、RIGHT JOIN实战解析
7个实用技巧掌握MySQL连接查询:INNER JOIN、LEFT JOIN、RIGHT JOIN实战解析 【免费下载链接】mysql-tutorial MySQL入门教程(MySQL tutorial book) 项目地址: https://gitcode.com/gh_mirrors/mys/mysql-tutorial MySQL连接查询是数据…...
RWKV7-1.5B-g1a从零开始:Docker镜像拉取→服务启动→API调用完整指南
RWKV7-1.5B-g1a从零开始:Docker镜像拉取→服务启动→API调用完整指南 1. 模型简介 rwkv7-1.5B-g1a 是一个基于RWKV-7架构的多语言文本生成模型,特别适合以下场景: 基础问答文案续写简短总结轻量中文对话 这个模型在单卡24GB显存的GPU上就…...
打卡信奥刷题(3077)用C++实现信奥题 P7023 [NWRRC 2017] Equal Numbers
P7023 [NWRRC 2017] Equal Numbers 题目描述 给定一个包含 nnn 个整数 a1,…,ana_{1}, \ldots, a_{n}a1,…,an 的列表。你可以执行以下操作:选择某个 aia_{i}ai 并将其乘以任意正整数。 你的任务是计算在进行 kkk 次操作后列表中可能出现的不同整数的最小数…...
技术分享 | MySQL 8.0复制架构主从自动切换脚本
在技术领域,我们常常被那些闪耀的、可见的成果所吸引。今天,这个焦点无疑是大语言模型技术。它们的流畅对话、惊人的创造力,让我们得以一窥未来的轮廓。然而,作为在企业一线构建、部署和维护复杂系统的实践者,我们深知…...
亚马逊向忠实Kindle用户“致谢“:停止支持旧款设备
亚马逊正以停止支持旧款设备的方式"回馈"长期忠实的Kindle用户,但同时也试图以新设备八折优惠及电子书购书抵用金来"降低影响"。正如科技领域的规律——没有任何设备能永远获得支持。亚马逊在今日发送给用户的邮件中宣布,自2026年5月…...
基于 InHand ER815 ER2000 的企业分支 SD-WAN 组网方案实践
一、项目背景随着连锁门店、企业分支数量不断增加,传统专线或宽带方案逐渐暴露出以下问题:网络成本高(专线费用昂贵)部署周期长(跨区域开通困难)运维复杂(缺乏统一管理能力)与此同时…...
模型和算法篇(二)监督学习分类问题
分类问题算法...
