Java项目——苍穹外卖(二)

Redis

简介

Redis是一个基于内存的key-value结构数据库

  • 基于内存存储,读写性能高
  • 适合存储热点数据(热点商品、资讯、新闻)
  • 企业应用广泛

基础操作

启动

在redis安装目录中打开cmd,输入如上图指令即可启动,按下crtl+c停止

连接

保证服务端启动时,在cmd命令行中输入redis-cli.exe -h 用户名 -p 端口号 -a 密码

数据类型

常用命令

字符串操作命令

  • SET key value 设置指定key的值
  • GET key 获取指定key的值
  • SETEX key seconds value 设置指定key的值,并将key的过期时间设为seconds秒
  • SETNX key value 只有key不存在时设置key的值(key已存在则无法设置)

哈希操作命令(Hash Map)

Redis hash 是一个String类型的field和value的映射表,hash特别适合用于存储对象,常用命令:

这些命令中的key是哈希表名,field是字段名,value是值

  • HSET key field value 将哈希表key中的字段field的值设为value
  • HGET key field value 获取存储在哈希表中的指定字段
  • HDEL key field 删除存储在哈希表中的指定字段
  • HKEYS key 获取哈希表中所有字段
  • HVALS key 获取哈希表中所有值

列表操作命令(Linked List)

Redis列表是简单的String列表,按照插入顺序排序,常用命令:

  • LPUSH key value1 [value2] 将一个或多个值插入到列表头部
  • LRANGE key start stop 获取列表指定范围内的元素
  • RPOP key 移除并获取列表最后一个元素
  • LLEN key 获取列表长度

集合操作命令(Set)

Reids set 是String类型的无序集合。集合成员是唯一的,集合中不能出现重复的数据,常用命令:

  • SADD key member1 [member2] 向集合添加一个或多个成员
  • SMEMBERS key 返回集合中的所有成员
  • SCARD key 获取集合的成员数
  • SINTER key1 [key2] 返回给定所有集合的交集
  • SUNION key1 [key2] 返回所有给定集合的并集
  • SREM key member1 [member2] 删除集合中一个或多个成员

有序集合操作命令

Redis有序集合是String类型元素的集合,且不允许有重复成员(集合中的元素是string类型,每个元素有一个double类型的分数,会自动根据分数进行排序)。每个元素都会关联一个double类型的分数,常用命令:member 是元素,score 是分数

  • ZADD key score1 member1 [score2 member2] 向有序集合添加一个或多个成员
  • ZRANGE key start stop [WITHSCORES] 通过索引区间返回有序集合中指定区间内的成员
  • ZINCRBY key increment member 有序集合中对指定成员的分数加上增量increment
  • ZREM key member [member…] 移除有序集合中的一个或多个成员

通用命令

Reids的通用命令是不分数据类型的,都可以使用的命令:

  • KEYS pattern 查找所有符合给定模式(pattern)的key
  • EXISTS key 检查给定key是否存在
  • TYPE key 返回key所储存的数据类型
  • DEL key 该命令用于在key存在时删除key

 Java操作Redis

在Java项目中。可以使用Spring Data Redis来简化操作

步骤:

1.导入Spring Data Redis的maven坐标

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

2、配置Redis数据源

spring:redis:host: ${sky.redis.host}port: ${sky.redis.port}auth: ${sky.redis.auth}database: ${sky.redis.database}
sky:redis:host: localhostport: 6379auth: 325523 #密码database: 0 #指定使用0号数据源

3、编写配置类,创建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 {@Beanpublic RedisTemplate redisTemplate(RedisConnectionFactory redisConnectionFactory){log.info("开始创建Reids模版对象...");RedisTemplate redisTemplate = new RedisTemplate();//设置reids的连接工厂对象redisTemplate.setConnectionFactory(redisConnectionFactory);//设置redis key序列化器redisTemplate.setKeySerializer(new StringRedisSerializer());return redisTemplate;}
}

4、通过ReidsTemplate对象操作Redis

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.*;import java.util.List;
import java.util.Set;
import java.util.concurrent.TimeUnit;@SpringBootTest
public class SpringDataRedisTest {@Autowiredprivate RedisTemplate redisTemplate;@Testpublic void testRedisATemplate(){System.out.println(redisTemplate);ValueOperations valueOperations = redisTemplate.opsForValue();HashOperations hashOperations = redisTemplate.opsForHash();ListOperations listOperations = redisTemplate.opsForList();SetOperations setOperations = redisTemplate.opsForSet();ZSetOperations zSetOperations = redisTemplate.opsForZSet();}/*** 操作字符串数据类型*/@Testpublic void testString(){redisTemplate.opsForValue().set("city","北京");String city = (String) redisTemplate.opsForValue().get("city");System.out.println(city);redisTemplate.opsForValue().set("code","1234",3, TimeUnit.MINUTES);//设置3分钟后过期redisTemplate.opsForValue().setIfAbsent("lock","1");//如果不存在才能设置redisTemplate.opsForValue().setIfAbsent("lock","2");}@Testpublic void testHash(){HashOperations hashOperations = redisTemplate.opsForHash();hashOperations.put("100","name","tom");//向哈希中插入键值对hashOperations.put("100","age","20");String name = (String)hashOperations.get("100", "name");//根据键获取值System.out.println(name);Set keys = hashOperations.keys("100");//返回哈希中的所有键System.out.println(keys);List values = hashOperations.values("100");//返回哈希中的所有值System.out.println(values);hashOperations.delete("100","age");//根据键删除键值对}
}

Spring Cache

简介

Spring Cache是一个框架,实现了基于注解的缓存功能,只需要简单地加一个注解,就能实现缓存功能

Spring Cache提供了一层抽象,底层可以切换不同的缓存实现,例如:

  • EHCache
  • Caffeine
  • Redis

在pom.xml中配置相关坐标即可使用Spring Cache框架

常用注解

@EnableCaching开启注解缓存功能,通常加在启动类上
@Cacheable在方法执行前先查询缓存中是否有数据,如果有数据,则世界返回缓存数据;如果没有缓存数据,调用方法并将方法返回值放到缓存中
@CachePut将方法的返回值放到缓存中
@CacheEvict将一条或多条数据从缓存中删除

这些注解本质是通过代理对象执行的

项目应用

思路

  • 导入Spring Cache 和Redis的相关maven坐标
  • 在启动类上加入@EnableCaching注解,开启缓存注解功能
  • 在用户端接口SetmealController的list方法上加入@Cacheable注解
  • 在管理端接口SetmealController的save、delete、update等方法上加入@CacheEvict注解

新增操作需要精确清理缓存(新增哪个就清理哪个)

删、改操作需要清空全部缓存

查询操作先在缓存中查,缓存中没有再去数据库中查,并把查询结果放入缓存中

代码实现

用户端接口SetmealController

/*** 条件查询* @param categoryId* @return*/@GetMapping("/list")@ApiOperation("根据分类id查询套餐")@Cacheable(cacheNames = "setmealCache",key ="#categoryId")//key:setmealCache::categoryIdpublic Result<List<Setmeal>> list(Long categoryId) {Setmeal setmeal = new Setmeal();setmeal.setCategoryId(categoryId);setmeal.setStatus(StatusConstant.ENABLE);List<Setmeal> list = setMealService.list(setmeal);return Result.success(list);}

管理端接口SetmealController

/*** 新增套餐* @param setmealDTO* @return*/@PostMapping@ApiOperation("新增套餐")@CacheEvict(cacheNames = "setmealCache",key = "#setmealDTO.categoryId")public Result save(@RequestBody SetmealDTO setmealDTO){log.info("新增套餐:{}",setmealDTO);setMealService.saveWithDish(setmealDTO);return Result.success();}/*** 批量删除套餐* @param ids* @return*/@DeleteMapping@ApiOperation("批量删除套餐")@CacheEvict(cacheNames = "setmealCache",allEntries = true)//清空所有缓存public Result delete (@RequestParam List<Long> ids){log.info("批量删除套餐:{}",ids);setMealService.delete(ids);return Result.success();}/*** 修改套餐* @param setmealDTO* @return*/@PutMapping@ApiOperation("修改套餐")@CacheEvict(cacheNames = "setmealCache",allEntries = true)//清空所有缓存public Result update(@RequestBody SetmealDTO setmealDTO){setMealService.update(setmealDTO);return Result.success();}/*** 起售停售菜品* @param status* @param id* @return*/@PostMapping("/status/{status}")@ApiOperation("起售停售菜品")@CacheEvict(cacheNames = "setmealCache",allEntries = true)//清空所有缓存public Result updateStatus(@PathVariable Integer status,Long id){setMealService.updateStatus(status,id);return Result.success();}

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

【嘉立创EDA】画PCB板中为什么要两面铺铜为GND,不能一面GND一面VCC吗?

在新手画板子铺铜时&#xff0c;经常会铺一面GND一面VCC。但一般情况下我们不会这样铺铜。下面将详细分析为什么要两面铺铜为GND&#xff0c;而不是一面GND一面VCC的原因&#xff1a; 提高散热能力 金属导热性&#xff1a;金属具有良好的导热性&#xff0c;铺铜可以有效分散PCB…

unity的学习

因为需要构建一个三维物理环境,所以学习了unity,半天就可以,非常简单清晰 1.安装 去官网下载unity hub . 然后需要下载editor,但注意已经有了vs2022就不要再下一次了,下的时候会全放c盘,再安装.c盘都装不下了. 如果美游vs2022,就先自己把vs2022安装好,再安装unity hub.(其实不…

基于YOLOv5的农作物叶片病害识别系统

植物农作物叶片病虫害识别系统&#xff1a;农作物叶片病害AI检测与识别系统 源码 带UI界面说明视频 模型&#xff1a;yolov5 功能: 农作物叶片病害检测系统用于智能检测常见农作物叶片病害情况&#xff0c;自动化标注、记录和保存病害位置和类型&#xff0c;辅助作物病害防治以…

MyBatis XML映射文件编写【后端 18】

MyBatis XML映射文件编写 MyBatis 是一个优秀的持久层框架&#xff0c;它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解用于配置和原始映射&#xff0c;将接口和 Java 的 POJOs …

红帽7—Mysql的源码编译

到官网选择源码进行安装 使用wget命令下载链接 下载安装后对文件包进行解压 [rootnginx ~]# tar zxf mysql-boost-5.7.44.tar.gz 安装cmake编译工具 [rootnginx ~]# yum install cmake 使用源码编译安装mysql [rootmysql-node10 mysql-5.7.44]# cmake \ -DCMAKE_INSTALL_PRE…

6个Python小游戏项目源码【免费】

6个Python小游戏项目源码 源码下载地址&#xff1a; 6个Python小游戏项目源码 提取码: bfh3

Stable diffusion 学习过程

diffusion model 讲解&#xff1a; 【较真系列】讲人话-Diffusion Model全解(原理代码公式)_哔哩哔哩_bilibili stable diffusion【CVPR2022】 原始论文&#xff1a; https://arxiv.org/pdf/2112.10752 讲解&#xff1a;【论文简介】Stable Diffusion的基础论文:2112.High…

JZ2440开发板——S3C2440的UART的使用

以下内容源于韦东山课程的学习与整理&#xff0c;如有侵权请告知删除。 一、UART硬件简介 UART&#xff0c;全称是“Universal Asynchronous Receiver Transmitter”&#xff0c;即“通用异步收发器”&#xff0c;也就是我们日常说的“串口”。 它在嵌入式中用途非常广泛&…

牛客周赛 Round 60(下)

构造序列 题目描述 登录—专业IT笔试面试备考平台_牛客网 运行代码 #include <iostream> #include<stdio.h> #include<math.h> using namespace std; int main() {int n, m;cin >> n >> m;int minVal min(n, m);int maxVal max(n, m);cout …

右值生命周期的延长

第一个例子&#xff1a; output&#xff1a; result&#xff08;&#xff09;创建了一个临时对象&#xff0c;它是一个右值&#xff0c;通过结果我们可以看到直到main函数结束时这个对象才调用了析构函数&#xff1b; result&#xff08;&#xff09;返回右值&#xff0c;我…

面向对象分析与设计-系统架构师(六十七)

1网络设计过程包括逻辑网络设计和物理网络设计两个阶段&#xff0c;下面的选项中&#xff0c;&#xff08;&#xff09;应该属于逻辑网络设计阶段的任务。 A选择路由协议 B设备选型 C结构化布线 D机房设计 解析&#xff1a; 物理网络设计的内容包括&#xff1a;设备选型、…

pdf去水印怎么去掉免费?6个pdf去除水印的方法快码住,超级好用!

pdf去水印怎么去掉免费&#xff1f;您是否有一些带有水印的pdf文档&#xff0c;让您感觉到头疼&#xff1f;您又是否希望能够去除这些水印&#xff0c;或者想用其他水印来替换现有的水印&#xff1f;如果是这样的话&#xff0c;我非常推荐您继续阅读本篇文章。本文将为您提供一…

Gateway网关的实现

API网关 网关路由必须支持负载均衡&#xff0c;服务列表是从注册中心拉取的客户端发出请求的URL指向的是网关&#xff0c;URL还必须要包含目标信息网关收到URL&#xff0c;通过一定的规则&#xff0c;要能识别出交给哪个实例去处理网关有能力对请求响应进行修改 引入依赖包 …

使用LangGPT提示词让大模型比较浮点数

使用LangGPT提示词让大模型比较浮点数 背景介绍环境准备创建虚拟环境安装一些必要的库安装其他依赖部署大模型启动图形交互服务设置提示词与测试 LangGPT结构化提示词 背景介绍 LLM在对比浮点数字时表现不佳&#xff0c;经验证&#xff0c;internlm2-chat-1.8b (internlm2-cha…

计算机视觉—3d点云数据基础

点云数据 3d点云数据由来 3d点云 3D Point Cloud是一种用于表示三维空间中对象或场景的数据结构。在最基础的形式中&#xff0c;它是一个包含多个三维坐标点&#xff08;X, Y, Z&#xff09;的集合。这些点是通过对实际物体或场景表面进行离散采样而获得的&#xff0c;因此&a…

代码随想录:动态规划4-5

42.接雨水 题目 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图&#xff0c;计算按此排列的柱子&#xff0c;下雨之后能接多少雨水。 示例 1&#xff1a; 输入&#xff1a;height [0,1,0,2,1,0,1,3,2,1,2,1] 输出&#xff1a;6 解释&#xff1a;上面是由数组 [0,1,0,2,…

python正则表达式如何不区分大小写

使用python的re模块做模式匹配时&#xff0c;有时需要忽略大小写&#xff0c;只需要在re.search()函数中添加参数re.IGNORECASE即可。 mystring some string pattern some pattern match re.search(pattern, mystring, re.IGNORECASE)

【Linux】理解和解释shell命令的工具

&#x1f41a;作者简介&#xff1a;花神庙码农&#xff08;专注于Linux、WLAN、TCP/IP、Python等技术方向&#xff09;&#x1f433;博客主页&#xff1a;花神庙码农 &#xff0c;地址&#xff1a;https://blog.csdn.net/qxhgd&#x1f310;系列专栏&#xff1a;C语言编程&…

2025年最新大数据毕业设计选题-Hadoop综合项目

选题思路 回忆学过的知识(Python、Java、Hadoop、Hive、Sqoop、Spark、算法等等。。。) 结合学过的知识确定大的方向 a. 确定技术方向&#xff0c;比如基于Hadoop、基于Hive、基于Spark 等等。。。 b. 确定业务方向&#xff0c;比如民宿分析、电商行为分析、天气分析等等。。。…

必备工具,AI生成证件照,再也不用麻烦他人,电子驾驶证等多种证件照一键生成

最近有一个生成证件照的开源项目很火&#xff0c;今天我们来学习一下。之前我生成证件照都是线下去拍照&#xff0c;线上使用也是各种限制&#xff0c;需要付费或看广告&#xff0c;而且效果也不是很理想&#xff0c; 今天要分享的这个 AI 证件照生成工具可以一键可以生成一寸…