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

苍穹外卖|DAY6-Redis和店铺营业状态设置模块

目录九、Redis1. Redis入门1.1 Redis下载与安装1.2 Redis服务启动与停止1.3 Redis图形化工具2. Redis数据类型3. Redis常用命令3.1 字符串操作命令3.2 哈希操作命令3.3 列表操作命令3.4 集合操作命令3.5 有序集合操作命令3.6 通用命令4. 在Java中操作Redis4.1 Redis的Java客户端4.2 Spring Data Redis使用方式十、店铺营业状态设置1. 需求分析和设计2. 代码开发3. 功能测试十一、小tip九、RedisRedis是一个基于内存的key-value结构数据库redis和mysql数据库的区别redis是通过键值对来存储数据mysql是通过二维表来存储数据redis是将数据存储在内存里→内存存储mysql是将数据通过数据文件的方式存储在磁盘上→磁盘存储redis特点基于内存存储 读写性能高适合存储热点数据热点商品、咨询、新闻企业应用广泛由于内存有限 所以不可能将数据全都存储在redis业务数据→mysql热点数据→redis1. Redis入门1.1 Redis下载与安装redis的Windows版属于绿色软件 直接解压即可使用 解压后目录结构如下1.2 Redis服务启动与停止注redis-server.exe redis.windows.conf→启动redis服务 ctrlC→退出redis服务注redis-cli.exe→连接redis服务 默认连接本地redis 并使用默认端口号6379redis-cli.exe -h 要连接的ip -p 指定端口号→指定连接哪个地方哪个端口的服务redis配置文件中默认是没有配置密码的 即默认情况下 客户端是不需要通过密码就可以连接上的→不安全 修改redis配置文件注把foobared改为想要修改的密码连接redis是没有用户的概念的 即不需要提供用户名 只提供密码即可配置密码后需要加-a 密码 来进行连接 否则操作无法正常进行通过redis-server启动redis服务 通过redis-cli连接redis1.3 Redis图形化工具Another Redis Desktop Manager2. Redis数据类型redis存储的是key-value结构的数据 其中key是字符串类型 value有五种常用的数据类型字符串 string普通字符串 redis中最简单的数据类型哈希 hash也叫散列 类似于Java中的HashMap结构→比较适合存储对象列表 list按照插入顺序排序 可以有重复元素 类似于Java中的LinkedList集合 set无序集合 没有重复元素 类似于Java中的HashSet有序集合 sorted set/zset集合中每个元素关联一个分数score 根据分数升序排序 没有重复元素3. Redis常用命令mysql数据库中通过sql语句操作数据库 sql的结构跟数据类型无关redis数据库中插入数据需要看数据类型 不同数据类型的命令不同3.1 字符串操作命令注SETEX key seconds value适用场景→短信验证码SETNX key value适用场景→分布式锁一种在分布式系统多个独立进程或服务中 用来保证同一时刻只有一个客户端能访问共享资源的机制3.2 哈希操作命令3.3 列表操作命令注L是left R是rightstart为0头部 stop为-1尾部 代表将列表的所有元素返回3.4 集合操作命令3.5 有序集合操作命令注ZRANGE key start stop返回默认是升序排列3.6 通用命令4. 在Java中操作Redis4.1 Redis的Java客户端Redis的Java客户端很多 常用的几种JedisLettuce底层是基于Netty高性能、异步事件驱动的网络应用框架这个多线程框架来实现的 性能高效Spring Data RedisSpring Data Redis是Spring的一部分 对redis底层开发包Jedis、Lettuce进行了高度封装在Spring项目中 可以使用Spring Data Redis来简化操作4.2 Spring Data Redis使用方式配置redis数据源编写配置类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 //RedisConnectionFactory→redis的连接工厂对象 public RedisTemplate redisTemplate(RedisConnectionFactory redisConnectionFactory){ log.info(开始创建redis模板对象...); RedisTemplate redisTemplate new RedisTemplate(); //设置连接工厂对象 redisTemplate.setConnectionFactory(redisConnectionFactory); //设置redis key的序列化器key在redis中显示正常 redisTemplate.setKeySerializer(new StringRedisSerializer()); return redisTemplate; } }SpringDataRedisTestpackage 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.*; ​ import java.util.concurrent.TimeUnit; ​ SpringBootTest public class SpringDataRedisTest { Autowired private RedisTemplate redisTemplate; ​ Test public void RedisTemplate() { System.out.println(redisTemplate); //获取操作字符串的value对象 ValueOperations valueOperations redisTemplate.opsForValue(); //获取操作哈希的value对象 HashOperations hashOperations redisTemplate.opsForHash(); //获取操作列表的value对象 ListOperations listOperations redisTemplate.opsForList(); //获取操作集合的value对象 SetOperations setOperations redisTemplate.opsForSet(); //获取操作有序集合的value对象 ZSetOperations zSetOperations redisTemplate.opsForZSet(); } }操作字符串类型的数据/** * 操作字符串类型的数据 * */ Test public void testString() { //value在redis中显示是有问题的 因为通过java程序存储的数据 redis中存储的是序列化之后的数据 redisTemplate.opsForValue().set(city, 北京); String city (String) redisTemplate.opsForValue().get(city); System.out.println(city); redisTemplate.opsForValue().set(code,1234,3, TimeUnit.MINUTES); //value可以给任意类型Object 最终都会把这个对象进行序列化 转成redis当中的string进行存储 redisTemplate.opsForValue().setIfAbsent(lock,1); redisTemplate.opsForValue().setIfPresent(lock,2); }操作哈希类型的数据/** * 操作哈希类型数据 * */ Test public void testHash() { HashOperations hashOperations redisTemplate.opsForHash(); hashOperations.put(1,name,tom); hashOperations.put(1,age,18); String name (String) hashOperations.get(1, name); System.out.println(name); Set keys hashOperations.keys(1); System.out.println( keys); List values hashOperations.values(1); System.out.println(values); hashOperations.delete(1,age); }其他类型的数据操作类似/** * 操作列表类型数据 * */ Test public void testList() { ListOperations listOperations redisTemplate.opsForList(); listOperations.leftPushAll(list, 1, 2, 3); listOperations.leftPush(list, a); ​ List list listOperations.range(list, 0, -1); System.out.println(list); ​ listOperations.rightPop(list); ​ long size listOperations.size(list); System.out.println(size); } ​ /** * 操作集合类型数据 * */ Test public void testSet() { SetOperations setOperations redisTemplate.opsForSet(); setOperations.add(set1, 1, 2, 3); setOperations.add(set2, 2, 3, a); 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, 1); } ​ /** * 操作有序集合类型数据 * */ Test public void testZSet() { ZSetOperations zSetOperations redisTemplate.opsForZSet(); zSetOperations.add(zset, 1, 1); zSetOperations.add(zset, 2, 2); zSetOperations.add(zset, 3, 3); Set zset zSetOperations.range(zset, 0, -1); System.out.println(zset); ​ zSetOperations.incrementScore(zset, 1, 10); ​ zSetOperations.remove(zset, 1); } ​ /** * 通用命令操作 */ Test public void testCommon() { Set keys redisTemplate.keys(*); System.out.println(keys); ​ Boolean city redisTemplate.hasKey(city); System.out.println(city); ​ for (Object key : keys){ DataType type redisTemplate.type(key); System.out.println(type.name()); } ​ redisTemplate.delete(city); }Redis不能直接存储Java对象 所以RedisTemplate内部会使用序列化器将对象转换成字节数组再存进去 取数据时再用同样的序列化器把字节变回对象十、店铺营业状态设置1. 需求分析和设计接口设计设置营业状态、管理端查询营业状态、用户端查询营业状态本项目约定管理端发出的请求 统一使用/admin作为前缀用户端发出的请求 统一使用/user作为前缀所以查询营业状态接口需要分为管理端和用户端营业状态数据存储方式基于redis的字符串来进行存储约定1代表营业 0代表打烊2. 代码开发基于redis存储 不需要调用service、mapper等package com.sky.config; ​ import lombok.extern.slf4j.Slf4j; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import springfox.documentation.builders.ApiInfoBuilder; import springfox.documentation.builders.PathSelectors; import springfox.documentation.builders.RequestHandlerSelectors; import springfox.documentation.service.ApiInfo; import springfox.documentation.spi.DocumentationType; import springfox.documentation.spring.web.plugins.Docket; ​ Configuration Slf4j public class Knife4jConfiguration { ​ /** * 通过knife4j生成接口文档管理端接口文件 * * return */ Bean public Docket docket1() { ApiInfo apiInfo new ApiInfoBuilder().title(苍穹外卖项目接口文档).version(2.0).description(苍穹外卖项目接口文档).build(); ​ return new Docket(DocumentationType.SWAGGER_2) .apiInfo(apiInfo) .groupName(01-管理端接口文档) //分组名称 .select() .apis(RequestHandlerSelectors.basePackage(com.sky.controller.admin)) //设置扫描包范围 .paths(PathSelectors.any()) .build(); } ​ ​ /** * 通过knife4j生成接口文档用户端接口文档 * * return */ Bean public Docket docket2() { ApiInfo apiInfo new ApiInfoBuilder().title(苍穹外卖项目接口文档).version(2.0).description(苍穹外卖项目接口文档).build(); ​ return new Docket(DocumentationType.SWAGGER_2) .apiInfo(apiInfo) .groupName(02-用户端接口文档) //分组名称 .select() .apis(RequestHandlerSelectors.basePackage(com.sky.controller.user)) //设置扫描包范围 .paths(PathSelectors.any()) .build(); } ​ }注接口文档分为管理端和用户端 以便区分 修改扫描包的范围和分组名3. 功能测试十一、小tip通过redis-server启动redis服务 通过redis-cli连接redis业务数据→mysql 热点数据→redis由于内存有限 所以不可能将数据全都存储在redisRedis不能直接存储Java对象 所以RedisTemplate内部会使用序列化器将对象转换成字节数组再存进去 取数据时再用同样的序列化器把字节变回对象接口文档分为管理端和用户端 以便区分 修改扫描包的范围和分组名

相关文章:

苍穹外卖|DAY6-Redis和店铺营业状态设置模块

目录 九、Redis 1. Redis入门 1.1 Redis下载与安装 1.2 Redis服务启动与停止 1.3 Redis图形化工具 2. Redis数据类型 3. Redis常用命令 3.1 字符串操作命令 3.2 哈希操作命令 3.3 列表操作命令 3.4 集合操作命令 3.5 有序集合操作命令 3.6 通用命令 4. 在Java中操…...

一级-链式提升机(论文+CAD图纸)机械课程设计

在物料垂直输送领域,一级-链式提升机凭借其结构紧凑、运行稳定的特点,成为工业场景中不可或缺的基础设备。其核心作用在于通过链条牵引料斗,实现物料从低处到高处的连续输送,尤其适用于粉状、颗粒状或小块状物料的短距离提升。相比…...

别再傻傻用pip了!用Anaconda的conda管理Python环境,效率提升不止一点点

从pip到conda:Python环境管理的效率革命 在Python开发的世界里,环境管理一直是个让人头疼的问题。想象一下这样的场景:你正在开发一个新项目,需要特定版本的NumPy和Pandas,但你的另一个项目却依赖这些库的不同版本。传…...

别再只会 make 了!Makefile 的 -f、-n、-j 参数实战指南(附常用场景)

解锁 Makefile 高阶技巧:-f、-n、-j 参数深度实战手册 当你已经熟悉了 make 的基本用法,却发现构建速度跟不上项目增长,或是调试复杂的构建规则时频繁踩坑,这篇文章就是为你准备的。我们将深入探讨三个能显著提升效率的 make 参数…...

【SQL注入】SQLMAP v1.10.3 稳定汉化版

简介 CN_Sqlmap 是由 GitHub 开发者 Datch666 基于开源渗透测试工具 sqlmap 深度汉化的版本,专为中文用户优化,降低英语使用门槛。该工具专注于自动化检测和利用 Web 应用程序中的SQL 注入漏洞,帮助安全测试人员高效验证目标系统的安全性。通…...

x86‌汇编 REPE CMPSB‌ 指令学习

REPE CMPSB‌ 是 x86 汇编语言中用于‌逐字节比较两个字符串‌的组合指令;‌CMPSB‌:比较两个内存区域中的字节,分别由 DS:SI 和 ES:DI 指向。 比较后会设置标志寄存器中的 ‌ZF(零标志位)‌:若两字节相等&…...

CSS如何制作悬停文字下划线动画_利用width过渡

用width过渡原生text-decoration无效,因下划线非独立元素;应使用::after伪元素配合transform: scaleX()实现稳定渐变动画,并注意中英文混排宽度偏差及移动端hover不可靠问题。hover下划线动画用width过渡为什么常失效直接给 text-decoration:…...

【AI面试八股文 | 面试题库】AI工程师面试题库:100+来源的系统性解题思路

2026年3月,一个港中深的研究生在牛客网发了篇阿里云AI Infra二面复盘帖。 1帖子开头写着:「整体感受是,这轮不是那种偏八股或者偏刷题的面试,更像是围绕项目经历一路深挖,看你到底有没有真的做过优化,也看…...

云计算Linux——基础操作命令(一)

前言在当今的技术环境中,高效的工具选择对开发者和系统管理员至关重要。Linux作为一个强大的开源操作系统,以其稳定性、灵活性和丰富的命令行生态著称,尤其适用于服务器管理、开发环境搭建及自动化任务处理。与此同时,MobaXterm P…...

Wan2.2-I2V-A14B一文详解:Diffusers pipeline定制与自定义scheduler实践

Wan2.2-I2V-A14B一文详解:Diffusers pipeline定制与自定义scheduler实践 1. 镜像概述与核心能力 Wan2.2-I2V-A14B是专为文生视频任务优化的私有部署镜像,基于RTX 4090D 24GB显存和CUDA 12.4环境深度定制。该镜像内置完整的运行环境和优化组件&#xff…...

FlowState Lab 赋能智能运维:服务器异常波动检测与根因分析

FlowState Lab 赋能智能运维:服务器异常波动检测与根因分析 1. 运维工程师的日常困境 凌晨三点,刺耳的告警铃声把张工从睡梦中惊醒。监控大屏上,核心业务集群的CPU使用率曲线像过山车一样剧烈波动。他揉了揉发红的眼睛,开始逐一…...

腾兴热点 | 马斯克打造超级计算机集群 小鹏从车企到AI集团 游宝阁用户突破5千万 Sora负责人离职

2026 全球 AI 与科技产业深度观察:算力军备竞赛、企业战略重构与行业格局重塑2026 年,全球科技产业正迎来新一轮变革浪潮,AI 算力竞赛持续白热化,传统车企加速向科技生态转型,AI 赛道战略收缩与技术落地并行推进&#…...

如何用 dispatchEvent 在 window 全局触发自定义的消息通知

直接在window上用dispatchEvent触发自定义消息通知,核心是创建带数据的CustomEvent并派发到全局作用域;通过new CustomEvent(type,{detail:data})创建事件,window.dispatchEvent()派发,可统一封装为window.emit()函数,…...

CSS如何解决栅格重叠问题_使用Grid-area明确划分元素占位

grid-area 未生效的主因是父容器未设置 display: grid;必须确保父元素声明 display: grid 或 inline-grid,且 grid-area 值与 grid-template-areas 中命名严格一致(含引号、空格、换行),并用 DevTools 验证 computed 样…...

AGI自主编写0day Exploit仅需23秒?实测GPT-5、Claude-4、Qwen-AGI在CVE-2024-XXXX系列漏洞上的武器化效率对比

第一章:AGI的网络安全攻防能力 2026奇点智能技术大会(https://ml-summit.org) 通用人工智能(AGI)在网络安全领域正展现出远超传统AI系统的动态攻防潜力——它不仅能实时解析零日漏洞利用链,还可自主构建对抗性样本绕过多层检测机…...

AGI能否真正接管火电厂DCS?深度拆解华能集团“智核一号”项目——2026奇点大会唯一通过TÜV莱茵认证的自主决策案例

第一章:2026奇点智能技术大会:AGI与能源管理 2026奇点智能技术大会(https://ml-summit.org) AGI驱动的实时电网优化范式 本届大会首次公开展示了基于自主推理型AGI架构的分布式能源调度系统“GridMind-7”,该系统在德国鲁尔工业区试点中实现…...

SDMatte模型部署故障排查手册:从环境配置到推理失败的常见问题

SDMatte模型部署故障排查手册:从环境配置到推理失败的常见问题 1. 引言 最近在星图平台部署SDMatte模型时,遇到了不少坑。作为一款强大的图像抠图模型,SDMatte在实际部署过程中可能会遇到各种环境配置和调用问题。本文将汇总我在部署过程中…...

伏羲天气预报开源生态:复旦FuXi与Pangu-Weather、FourCastNet对比分析

伏羲天气预报开源生态:复旦FuXi与Pangu-Weather、FourCastNet对比分析 天气预报,这个看似传统的气象学领域,正经历着一场由人工智能驱动的深刻变革。过去,我们依赖复杂的物理方程和超级计算机进行数值模拟,而现在&…...

工业相机“心跳”监测脚本(C# 版) 支持海康 / Basler / 堡盟工业相机

工业相机“心跳”监测脚本(C# 版) 支持海康 / Basler / 堡盟,一套代码搞定多品牌在线状态监控!“产线半夜停机,发现相机离线了?” “PLC 发了触发信号,但相机没反应?” “现场网络一…...

JDK动态代理为什么只能代理有接口的类?

在Java基础面试中,“JDK动态代理为什么只能代理有接口的类”是高频核心考点,尤其在考察Spring AOP底层原理时,经常作为前置提问出现。很多开发者仅能记住“必须有接口”这个结论,却无法说清底层逻辑、继承约束和代码验证细节&…...

中小企业降本妙招:Hunyuan免费翻译模型部署实战

中小企业降本妙招:Hunyuan免费翻译模型部署实战 1. 为什么中小企业需要关注翻译成本? 对于中小企业来说,国际化业务拓展往往面临一个现实问题:翻译成本。传统的商业翻译API虽然方便,但按字数或调用次数计费的模式&am…...

2026.4.19

大概在2024年开始,我尝试了写下东西表达,因为我实在不知道该如何写作,从小学的是应考的八股,“写作”对于我而言是模糊的概念。我甚至从网络/社交平台开始写留言开始,我意识到如果你的表达不够准确,你就要被…...

AGI工程师画像重构迫在眉睫,如何用LLM+行为埋点实现候选人真实能力穿透式验证?

第一章:AGI工程师画像重构迫在眉睫,如何用LLM行为埋点实现候选人真实能力穿透式验证? 2026奇点智能技术大会(https://ml-summit.org) 传统AGI工程师评估严重依赖简历关键词匹配与结构化面试,导致“Paper AGI”泛滥——候选人能复…...

山东大学项目实训个人博客(1)构建AlgoTutor的安全代码执行沙箱

​ 允许用户提交任意代码执行是最大的安全风险。本文将详细阐述我为AlgoTutor构建安全沙箱的“纵深防御”策略,从进程隔离、资源限制到系统调用过滤,确保100%的沙箱逃逸防御成功率。我的核心任务之一是打造一个“牢笼”,让用户代码在其中安全…...

WSL 极速部署 llama.cpp:三步搞定 CPU、GPU 本地运行大模型(CUDA 加速)

摘要: 想在 Windows 下本地跑大模型,又不想搞双系统?WSL llama.cpp 是最轻量、高效的选择。本文将带你一步步完成环境配置、源码编译(可选 NVIDIA GPU 加速),并下载模型直接运行。无需复杂依赖&#xff0c…...

语音转文字神器FunASR体验:支持中英日韩多语言,识别效果惊艳

语音转文字神器FunASR体验:支持中英日韩多语言,识别效果惊艳 1. 为什么选择FunASR语音识别 在日常工作和生活中,我们经常需要将语音内容转换为文字。无论是会议记录、采访整理,还是视频字幕制作,传统的手工转录方式既…...

Pixel Language Portal 开发环境搭建:Windows 系统下 Visual Studio 与 Python 联调指南

Pixel Language Portal 开发环境搭建:Windows 系统下 Visual Studio 与 Python 联调指南 1. 前言:为什么需要跨语言开发环境 在开发Pixel Language Portal这类涉及多种编程语言的项目时,经常需要同时处理Python脚本和C扩展模块。Windows平台…...

Pi0机器人模型亲测体验:Web界面操作简单,动作生成快速

Pi0机器人模型亲测体验:Web界面操作简单,动作生成快速 1. 项目概述与体验背景 Pi0是一个创新的视觉-语言-动作流模型,专为通用机器人控制设计。作为一名长期关注机器人控制技术的开发者,我有幸体验了这个项目的Web演示界面。与传…...

忍者像素绘卷参数详解:Steps=20/30/50对16-Bit像素块清晰度影响可视化分析

忍者像素绘卷参数详解:Steps20/30/50对16-Bit像素块清晰度影响可视化分析 1. 引言:像素艺术的生成挑战 在复古游戏风格创作中,16-Bit像素艺术因其独特的视觉魅力而备受青睐。忍者像素绘卷作为一款专为像素艺术优化的生成工具,其…...

Linux 的 runcon 命令

Linux 的 runcon 命令是一个用于在指定安全上下文中运行程序的工具,它是 SELinux(Security-Enhanced Linux)安全子系统的重要组成部分。该命令的基本语法为: runcon [选项] 上下文 命令 [参数] 主要功能和使用场景: …...