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

【项目实战 Day5】springboot + vue 苍穹外卖系统(Redis + 店铺经营状态模块 完结)

目录

一、Redis入门

1、Redis下载与安装

2、Redis常用数据类型

3、Redis常用命令

(1)字符串类型常用命令

(2)哈希表类型常用命令

(3)列表类型常用命令

(4)列表类型常用命令

(5)有序列表类型常用命令

(6)通用命令

4、在Java中操作Redis

(1)环境搭建

(2)操作字符串类型数据

(3)操作哈希表类型数据

(4)操作列表类型数据

(5)操作集合类型数据

(6)操作有序集合类型数据

(7)操作通用类型

二、店铺经营状态设置模块

1、设置营业状态 - PUT接口

2、查询营业状态 - GET接口

(1)管理员端 - ShopController

(2)用户端 - ShopController

三、接口文档中分开设置端口小技巧


一、Redis入门

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

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

1、Redis下载与安装

(1)在资料包中day5找到对应安装包

解压文件

(2)点击解压后的文件包,选中地址框输入cmd进入控制台,并输入(复制粘贴好像不行)下面命令后按回车【如果想退出,在这个页面按Ctrl+C】

redis-server.exe redis.windows.conf

(3)在地址栏输入cmd重新启动一个控制台(另一个不要关)

输入下面命令

redis-cli.exe

测试是否连接成功

(4)【新手不建议设置密码!!】为了安全我们需要设置密码,先退出客户端(输入exit+回车)和服务器(ctrl+c)服务

再打开redis.windows.conf文件

找到下面图示的语句,取消注释,设置自己的密码后ctrl+S保存即可

再次启动服务器和客户端服务,这样输入密码才能登陆

(5)图形化界面下载,在资料包直接点击下载即可

注意:新建链接前,先cmd启动服务器服务!!!

2、Redis常用数据类型

Redis存储的是key-value结构的数据,其中key是字符串类型,value有5种常用的数据类型:

  • 字符串 string
  • 哈希 hash
  • 列表 list
  • 集合 set
  • 有序集合 sorted set/zset

3、Redis常用命令

(1)字符串类型常用命令

命令作用应用场景
SET key value设置指定key的值
GET key获取指定key的值
SETEX key seconds value设置指定key的值,并将 key 的过期时间设为 seconds 秒短信验证码
SETNX key value只有在 key 不存在时设置 key 的值分布式锁


 

(2)哈希表类型常用命令

命令作用应用场景
HSET key field value将哈希表 key 中的字段 field 的值设为 value
HGET key field获取存储在哈希表中指定字段的值
HDEL key field删除存储在哈希表中的指定字段
HKEYS key获取哈希表中所有字段
HVALS key获取哈希表中所有值





 

(3)列表类型常用命令

命令作用备注
LPUSH key value1 [value2]将一个或多个值插入到列表头部LPUSH 即 LeftPush
LRANGE key start stop获取列表指定范围内的元素lrange name 0 -1 获取列表所有元素
RPOP key移除并获取列表最后一个元素RPOP 即 RightPop
LLEN key获取列表长度







 

(4)列表类型常用命令

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










 

(5)有序列表类型常用命令

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








 

(6)通用命令

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

命令作用备注
KEYS pattern查找所有符合给定模式( pattern)的 key
EXISTS key检查给定 key 是否存在
TYPE key返回 key 所储存的值的类型
DEL keykey 存在时删除





 

4、在Java中操作Redis

(1)环境搭建

【1】导入Spring Data Redis 的maven

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

【2】配置Redis数据源

在application-dev.yml中设置具体的值,在application-dev.yml中引用

  redis:host: ${sky.redis.host}port: ${sky.redis.port}database: ${sky.redis.database}

【3】编写配置类,创建RedisTemplate对象

@Configuration
@Slf4j
public class RedisConfiguration {@Beanpublic RedisTemplate redisTemplate(RedisConnectionFactory redisConnectionFactory){log.info("开始创建redis模板对象");RedisTemplate redisTemplate = new RedisTemplate();//设置redis连接工厂对象redisTemplate.setConnectionFactory(redisConnectionFactory);//设置redis key序列化器redisTemplate.setKeySerializer(new StringRedisSerializer());return redisTemplate;}
}

 【4】创建测试类

@SpringBootTest
public class SpringDataRedisTest {@Autowiredprivate RedisTemplate redisTemplate;/*** 操作字符串类型数据*/@Testpublic void testString(){}
}

(2)操作字符串类型数据

    /*** 操作字符串类型数据*/@Testpublic void testString(){//setredisTemplate.opsForValue().set("city","北京");//getString city = (String)redisTemplate.opsForValue().get("city");System.out.println(city);//setex 设置过期时间redisTemplate.opsForValue().set("code","1234",3, TimeUnit.MINUTES);//setnx 只有key不存在时设置key值redisTemplate.opsForValue().setIfAbsent("lock","1");redisTemplate.opsForValue().setIfAbsent("lock","2");}

(3)操作哈希表类型数据

    /*** 哈希表类型数据*/@Testpublic void testHash(){HashOperations hashOperations = redisTemplate.opsForHash();hashOperations.put("100","name","roye");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");}

(4)操作列表类型数据

    /*** 列表类型数据*/@Testpublic void testList(){ListOperations 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);}

(5)操作集合类型数据

    /*** 集合类型数据*/@Testpublic void testSet(){SetOperations 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);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");}

(6)操作有序集合类型数据

    /*** 有序集合类型数据*/@Testpublic void testZset(){ZSetOperations 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");}

(7)操作通用类型

    /*** 通用类型命令*/@Testpublic void testcommon(){Set 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");}

二、店铺经营状态设置模块

1、设置营业状态 - PUT接口

2、查询营业状态 - GET接口

查询营业状态分管理员端admin、用户端user

因为admin和user的ShopController重名,因此设置

@RestController("userShopController")
@RestController("adminShopController")

(1)管理员端 - ShopController

@RestController("adminShopController")
@RequestMapping("/admin/shop")
@Slf4j
@Api(tags = "营业状态相关接口")
public class ShopController {public static final String KEY = "SHOP_STATUS";@Autowiredprivate RedisTemplate redisTemplate;/*** 查询营业状态* @return*/@GetMapping("/status")@ApiOperation("查询营业状态")public Result<Integer> getStatus(){Integer shop_status = (Integer) redisTemplate.opsForValue().get(KEY);log.info("获取到店铺营业状态为:{}",shop_status == 1? "营业中" : "打烊中");return Result.success(shop_status);}
}

(2)用户端 - ShopController

@RestController("userShopController")
@RequestMapping("/user/shop")
@Slf4j
@Api(tags = "营业状态相关接口")
public class ShopController {public static final String KEY = "SHOP_STATUS";@Autowiredprivate RedisTemplate redisTemplate;/*** 查询营业状态* @return*/@GetMapping("/status")@ApiOperation("查询营业状态")public Result<Integer> getStatus(){Integer shop_status = (Integer) redisTemplate.opsForValue().get(KEY);log.info("获取到店铺营业状态为:{}",shop_status == 1? "营业中" : "打烊中");return Result.success(shop_status);}
}

三、接口文档中分开设置端口小技巧

(1)找到Web配置类

(2)修改相关代码

    /*** 通过knife4j生成接口文档* @return*/@Beanpublic Docket docket1() {ApiInfo apiInfo = new ApiInfoBuilder().title("苍穹外卖项目接口文档").version("2.0").description("苍穹外卖项目接口文档").build();Docket docket = new Docket(DocumentationType.SWAGGER_2).groupName("管理端接口").apiInfo(apiInfo).select().apis(RequestHandlerSelectors.basePackage("com.sky.controller.admin")).paths(PathSelectors.any()).build();return docket;}

    /*** 通过knife4j生成接口文档* @return*/@Beanpublic Docket docket2() {ApiInfo apiInfo = new ApiInfoBuilder().title("苍穹外卖项目接口文档").version("2.0").description("苍穹外卖项目接口文档").build();Docket docket = new Docket(DocumentationType.SWAGGER_2).groupName("用户端接口").apiInfo(apiInfo).select().apis(RequestHandlerSelectors.basePackage("com.sky.controller.user")).paths(PathSelectors.any()).build();return docket;}

(3)运行代码,并重新进入接口文档http://localhost:8080/doc.html

http://www.dtcms.com/a/395299.html

相关文章:

  • 旧衣回收小程序:非技术视角下的价值重构与发展前景
  • 使用vue-i18n实现语言切换
  • 做小程序找哪家公司,解析小程序开发定制公司哪家适合你
  • 【python】python进阶——math模块
  • NHD-6108 全自动远、近光检测仪:智能高效的汽车灯光检测方案
  • 《 Linux 点滴漫谈: 一 》开源之路:Linux 的历史、演进与未来趋势
  • C#和微软System.Speech.Synthesis库实现语音合成
  • C++概述 (一)
  • 【开题答辩全过程】以 基于springboot的高校仪器共享管理系统设计和实现为例,包含答辩的问题和答案
  • 【python】FastAPI简介
  • IDEA lombok注解无效的问题,运行时提示java: 找不到符号或者方法
  • Windows 系统部署 Kronos 金融 K 线基础模型——基于 EPGF 架构
  • 010 Rust流程控制
  • MyBatisPlus快速入门:简化CRUD操作
  • 网络编程套接字(三)---简单的TCP网络程序
  • 背景建模(基于视频,超炫)项目实战!
  • ios26版本回退到ios18
  • OpenCV直方图比较:原理与四种方法详解
  • OpenCV - 图像金字塔
  • 寄存柜频繁维护还卡顿?杰和IB2-281主板:智能化升级高效省心
  • 海外短剧系统开发:多语言适配与跨地区部署的架构实践
  • JVM内存模型详解:看内存公寓如何分配“房间“
  • 【论文阅读】4D-VLA:时空视觉-语言-动作预训练与跨场景校准
  • 【论文阅读】MDM : HUMAN MOTION DIFFUSION MODEL
  • 【论文阅读】RynnVLA-001:利用人类示范改进机器人操作
  • Leecode hot100 - 105.从前序与中序遍历序列构造二叉树
  • 联邦学习论文分享:Federated Learning with GAN-based Data Synthesis for Non-IID Clients
  • 绕过百度网盘无限制下载
  • 【自记】PyCharm 更换阿里云国内源教程
  • 【Axure原型分享】区间K线图