黑马苍穹外卖4 店铺营业状态设置+Redis基础

店铺营业状态设置

在这里插入图片描述
Redis MySQL Java并发 JavaMVC 计算机网络 操作系统 算法,后端面试主要是这些,外加项目

Redis

数据库,基于内存存储的key-value结构。
mysql是磁盘存储,通过二维表存储。
在这里插入图片描述
在文件夹目录打开cmd
服务端:
开启

redis-server.exe redis.windows.conf

客户端:
普通启动连接

redis-cli.exe

显示的指定服务端和端口号

redis-cli.exe -h localhost -p 6379

默认客户端不需要密码就能连接上。
修改配置文件
redis.windows.conf 里 指定密码为123456
requirepass 123456

不需要用户名,客户端链接需要添加上密码

redis-cli.exe -h localhost -p 6379 -a 123456

常用数据类型

value的数据类型,key是字符串
在这里插入图片描述
在这里插入图片描述
常用命令:
1.字符串
在这里插入图片描述
不区分大小写

在图形化界面里按左边栏上的>_
set 
setex 

2.哈希
在这里插入图片描述

hset
hget
hdel 
hkeys
kvals

3.列表操作
在这里插入图片描述

lpush mylist a b c//从左侧插入即从头
lrange mylist 0 -1 //从头到尾
rpop mylist //删最后一个
llen mylist

4.集合操作
在这里插入图片描述

>sadd set1 a b c d//表内顺序和插入顺序无关
4
>smembers set1
>scard set1
4
>sadd set2 a b x y
>sinter set1 set2
b
a
>sunion set1 set3
c
a
b
x
y

5.有序集合操作
在这里插入图片描述
会按照分数排序

>zrange zset1 0 -1
a
b
c
>zrange zset1 0 -1 withscores
a
10
b
10.1
c
11.1
>zincrby zset1 5.0 a//给a的值+5.0

6.通用命令
在这里插入图片描述

>type mylist
list
>type set1
set
>del name set1 zset1
3
>

Redis 的Java 客户端

在这里插入图片描述
用java操作
。。。
(1)操作字符串类型数据

    @Autowired
    private RedisTemplate redisTemplate;
 
    @Test
    public void test01(){
        redisTemplate.opsForValue().set("name","小明"); // 设置k v
        String city = (String) redisTemplate.opsForValue().get("name"); // 拿到key为name的值
        System.out.println(city);
        redisTemplate.opsForValue().set("code","1234",3, TimeUnit.MINUTES); // 设置过期时间为三分钟
        redisTemplate.opsForValue().setIfAbsent("lock","1"); // 设置lock为k的唯一值
        redisTemplate.opsForValue().setIfAbsent("lock","2");
    }
小明

(2)操作哈希类型数据

    @Test
    public void test02(){
        //hset hget hdel hkeys hvals
        HashOperations hashOperations = redisTemplate.opsForHash();
 
        hashOperations.put("100","name","tom"); // 设置k为100,哈希k为name v为100
        hashOperations.put("100","age","20");
 
        String name = (String) hashOperations.get("100", "name"); // 获取k为100,hashk为name的v
        System.out.println(name);
 
        Set keys = hashOperations.keys("100"); // 获取k为100的集合k
        System.out.println(keys);
 
        List values = hashOperations.values("100"); // 获取k为100的集合v
        System.out.println(values);
 
        hashOperations.delete("100","age"); // 删除age字段
    }
tom
[name,age]
[tom,20]

(3)操作列表类型数据

    @Test
    public void test03(){
        //lpush lrange rpop llen
        ListOperations listOperations = redisTemplate.opsForList();
 
        listOperations.leftPushAll("mylist","a","b","c"); // 往k为mylist插入a,b,c
        listOperations.leftPush("mylist","d"); // 插入d
 
        List mylist = listOperations.range("mylist", 0, -1);
        System.out.println(mylist); // 输出
 
        listOperations.rightPop("mylist"); // 删除
 
        Long size = listOperations.size("mylist");
        System.out.println(size);
        System.out.println(listOperations.range("mylist", 0, -1));
    }
[d,c,b,a]
3
[d,c,b]

(4)操作集合类型数据

    @Test
    public void test4(){
        //sadd smembers scard sinter sunion srem
        SetOperations setOperations = redisTemplate.opsForSet();
 
        setOperations.add("set1","a","b","c","d"); // 往set1 插入abcd
        setOperations.add("set2","a","b","x","y"); // 往set2 插入abxy
 
        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"); // 在set1里面删除ab
    }
[a,b,c,d]
4
[a,b]
[a,b,c,d,x,y]

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

    /**
     * 操作有序集合类型的数据
     */
    @Test
    public void test05(){
        //zadd zrange zincrby zrem
        ZSetOperations zSetOperations = redisTemplate.opsForZSet();
 
        zSetOperations.add("zset1","a",10); // 设置k为zset1v为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); // 为k为zset1v为c的加10分
 
        zSetOperations.remove("zset1","a","b"); // 删除ab
    }
[c,a,b]

(6)通用命令操作

    @Test
    public void test06(){
        //keys exists type del
        Set keys = redisTemplate.keys("*"); // 查找所有符合给定模式( pattern)的 key 
        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"); // 删除mylist
    }
[set2,zset1,set1]
SET
ZSET
SET

总结:
Spring Data Redis中提供了一个高度封装的类:RedisTemplate,对相关api进行了归类封装,将同一类型操作封装为operation接口,具体分类如下:

ValueOperations:string数据操作
SetOperations:set类型数据操作
ZSetOperations:zset类型数据操作
HashOperations:hash类型的数据操作
ListOperations:list类型的数据操作

回归正题:店铺营业状态设置

在这里插入图片描述
用户端与管理端一样只是路径变为/user/shop/status

admin.ShopController.java

@RestController("adminShopController")//为了区分他俩
@RequestMapping("/admin/shop")
@Slf4j
@Api(tags = "店铺相关接口")
public class ShopController {

    public static final String KEY="SHOP_STATUS";

    @Autowired
    private RedisTemplate redisTemplate;//注入redis对象

    @PutMapping("/{status}")
    @ApiOperation("设置店铺运营状态")
    public Result setStatus(@PathVariable Integer status){
        redisTemplate.opsForValue().set("SHOP_STATUS",status);//保存状态值
        return Result.success();
    }

    @GetMapping("/status")
    @ApiOperation("显示店铺运营状态")
    public Result<Integer> getStatus(){
        Integer status = (Integer) redisTemplate.opsForValue().get(KEY);
        log.info("获取到店铺的营业状态为:{}",status == 1 ? "营业中":"打烊中");
        return Result.success();
    }

}

为了避免两个Bean都叫shopController的冲突,所以用@RestController(“UserShopController”)//为了区分他俩
user.ShopController.java

@RestController("UserShopController")//为了区分他俩
@RequestMapping("/user/shop")
@Api(tags = "店铺相关接口")
@Slf4j
public class ShopController {

    public static final String KEY = "SHOP_STATUS";

    @Autowired
    private RedisTemplate redisTemplate;

    @GetMapping("/status")
    @ApiOperation("显示店铺运营状态")
    public Result<Integer> getStatus() {
        log.info("店铺查询状态");
        return Result.success((Integer) redisTemplate.opsForValue().get(KEY));
    }

}

另外:为了将接口文档的用户和admin的接口区分开
修改配置类,分别扫描两个包,分组展示,形成两份接口文档

@Bean
    public Docket docketOne() {
        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;
    }

    @Bean
    public Docket docketTwo() {
        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;
    }

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

HNU操作系统2023期中考试试卷及参考答案

本试题参考 甘晴void 的CSDN博客【2.2】操作系统OS_甘晴void的博客-CSDN博客&#xff0c;本意为期中复习自用&#xff0c;答案在其基础上进行进一步完善&#xff0c;若有错误还请指正&#xff01; 第一题&#xff1a;基础题&#xff08;20分&#xff09; 1.1&#xff08;4分&a…

Windows反截屏开发实现

文章目录 Windows反截屏开发实现1. SetWindowDisplayAffinity2. 反截屏系统3. 总结 Windows反截屏开发实现 最近在我们云桌面中需要做到反截屏能力&#xff0c;所谓反截屏就是我们无法通过截图软件&#xff08;微信&#xff0c;QQ&#xff0c;截图等程序&#xff09;截取桌面的…

lock-锁的概念

锁的简介 锁是计算机协调多个进程或线程并发访问某一资源的机制&#xff08;避免发生资源争抢&#xff09; 在并发环境下&#xff0c;多个线程会对同一个资源进行争抢&#xff0c;可能会导致数据不一致的问题。为了解决这一问题&#xff0c;需要通过一种抽象的锁来对资源进行…

springboot + Vue前后端项目(第十八记)

项目实战第十八记 写在前面1. 前台页面搭建&#xff08;Front.vue&#xff09;2. 路由3.改动登录页面Login.vue4. 前台主页面搭建Home.vue总结写在最后 写在前面 本篇主要讲解系统前台搭建&#xff0c;通常较大的项目都会搭建前台 1. 普通用户登录成功后前台页面效果&#xf…

RestTemple请求GET接口403

问题描述 使用oss接口获取资源的时候&#xff0c;通过浏览器可以直接下载&#xff0c;在代码中使用RestTemplate的get方式访问的时候&#xff0c;出现403错误 问题排查 因为返回状态码是403&#xff0c;就想着是不是授权问题&#xff0c;因为有的接口是有防抓取规则的&…

Java实现自动定时任务配置并判断当天是否需要执行示例

最近接到一个需求&#xff0c;用户要能配置一个定时循环的任务&#xff0c;就是和手机闹钟循环差不多&#xff0c;设置好比如周一、周二、周三&#xff0c;那么在这几天内这个任务就需要自动执行 需求不复杂&#xff0c;首先我需要判断当前是周几&#xff0c;当然用户说了让我…

【廉颇老矣,尚能饭否】传统的数据仓库是否还能发挥作用?

引言&#xff1a;随着数字化转型的深入和大数据技术的发展&#xff0c;大数据平台、数据中台和和数据湖技术不断涌现&#xff0c;给人感觉传统的数据仓库技术已经过时&#xff0c;廉颇老矣&#xff0c;不能应对新的挑战&#xff0c;在数字化转型中&#xff0c;不能发挥重要作用…

第4章 工程经济评价指标 作业

第4章 工程经济评价指标 作业 一单选题&#xff08;共27题&#xff0c;100分&#xff09; (单选题)利息备付率是指( )与应付利息费用的比值。 A. 息税前利润 B. 利润总额 C. 净利润 D. 营业收入 正确答案: A:息税前利润; (单选题)当净现值( )0时,该项目不可行。 A. < B. …

界面构件开发之RC文件

代码; #include <gtk-2.0/gtk/gtk.h> #include <gtk-2.0/gdk/gdkkeysyms.h> #include <glib-2.0/glib.h> #include <stdio.h>int main(int argc, char *argv[]) {gtk_init(&argc, &argv);gtk_rc_parse("./mainrc");GtkWidget *winN…

珈和科技和比昂科技达成战略合作,共创智慧农业领域新篇章

6月14日&#xff0c;四川省水稻、茶叶病虫害监测预警与绿色防控培训班在成都蒲江举办。本次培训班由四川省农业农村厅植物保护站主办&#xff0c;蒲江县农业农村局、成都比昂科技筹办。四川省农业农村厅植物保护站及四川省14个市州36个县植保站负责人进行了观摩学习。 武汉珈…

轻松选购指南:如何挑选3D建模和3D渲染的高效计算机?

选择最适合 3D 建模和3D渲染的计算机可能是一项艰巨的任务&#xff0c;特别是对于初学者来说。有很多因素需要考虑&#xff0c;包括处理器、显卡、内存和存储容量。 如果你计划购买一台计算机或利用3D产品渲染服务&#xff0c;那么你必须了解需要考虑的特性。以下是选择3D建模…

数据结构(中)

完全二叉树的第6层有10个结点&#xff0c;那么有&#xff08;21&#xff09;个叶子结点。 10-52*2*2*2 设树中某结点不是根结点&#xff0c;则离它最近的祖先结点是双亲结点 一颗有5个结点的深度为3的二叉树采用顺序存储方式存储&#xff0c;存储数组的大小至少为7 看深度&…

python自动化系列:自动复制一个工作簿的所有工作表到其他工作簿

作品介绍 作品名称&#xff1a;自动复制一个工作簿的所有工作表到其他工作簿 开发环境&#xff1a;PyCharm 2023.3.4 python3.7 用到的库&#xff1a;os、xlwings 作品效果&#xff1a; 实现过程 一、代码设计 以下是代码的详细说明&#xff1a; 导入模块&#xff1a; …

数字乡村:绘就乡村振兴的智慧新画卷

在乡村振兴战略的宏伟蓝图下&#xff0c;“数字乡村”作为新时代农村现代化的重要抓手&#xff0c;正悄然改变着中国乡村的面貌。本文旨在深度剖析数字乡村建设的核心价值、关键技术、成功案例以及未来展望&#xff0c;为乡村振兴战略提供前瞻性的思考与启示。 数字乡村的核心价…

【Golang - 90天从新手到大师】Day09 - string

系列文章合集 Golang - 90天从新手到大师 String 一个字符串是一个不可改变的字节序列。字符串可以包含任意的数据&#xff0c;但是通常是用来包含人类可读的文本。 len()返回字符串字节数目&#xff08;不是rune数&#xff09;。 通过索引可以访问某个字节值&#xff0c;0…

Vue3 头像是圆形,hover上去时头像出现黑色半透明样式,且中间显示修改两字的实现

实现效果 原头像 hover效果 实现方式 博主在实际开发过程中使用mouseover和mouseout会出现无法点击或hover频繁闪动的问题&#xff0c;故这里采用的是css中的hover&#xff0c;利用hover也能轻松实现上述效果&#xff0c;且完全不会影响点击事件的使用。 <template> &…

Walrus:去中心化存储和DA协议,可以基于Sui构建L2和大型存储

Walrus是为区块链应用和自主代理提供的创新去中心化存储网络。Walrus存储系统今天以开发者预览版的形式发布&#xff0c;面向Sui开发者征求反馈意见&#xff0c;并预计很快会向其他Web3社区广泛推广。 通过采用纠删编码创新技术&#xff0c;Walrus能够快速且稳健地将非结构化数…

实践分享|关于 nebula-stats-exporter 的使用

大家好&#xff0c;这里是玖叁叁&#xff0c;目前从事全栈工程师工作&#xff0c;刚刚接触 NebulaGraph 不久&#xff0c;还在努力学习当中。图数据库可以高效地表达、存储和分析复杂关系和网络&#xff0c;在特定场景下有着不错的性能。希望通过这篇 nebula-stats-exporter 的…

从0-1实现一个自己的脚手架

当我们在开发的时候&#xff0c;时常会在创建项目的时候重复很多操作&#xff0c;比如下载相同的依赖(锁定依赖版本)、封装网络请求、封装路由、配置代码提示/检查、配置vite/webpack打包、配置自动导入(auto-import)、配置项目基础结构、注册全局指令等&#xff0c;有非常多重…

连锁餐厅降低员工离职率:发誓!绝不是靠“舌尖上的诱惑”

员工社交与成长&#xff0c;企业福利与文化&#xff0c;沃可趣多维度优化员工体验。 连锁餐饮业在全球范围内迅速发展&#xff0c;要为消费者提供更多便利&#xff0c;2023年中国餐饮市场连锁化率达到21%。 然而&#xff0c;这些分散式门店为企业运营创造了挑战。Black Box I…