【项目实战 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接口](#1、设置营业状态 - PUT接口)

[2、查询营业状态 - GET接口](#2、查询营业状态 - GET接口)

[(1)管理员端 - ShopController](#(1)管理员端 - ShopController)

[(2)用户端 - ShopController](#(2)用户端 - ShopController)

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


一、Redis入门

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

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

1、Redis下载与安装

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

解压文件

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

java 复制代码
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 key | key 存在时删除 | |

4、在Java中操作Redis

(1)环境搭建

【1】导入Spring Data Redis 的maven

XML 复制代码
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>

【2】配置Redis数据源

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

XML 复制代码
  redis:
    host: ${sky.redis.host}
    port: ${sky.redis.port}
    database: ${sky.redis.database}

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

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

【4】创建测试类

java 复制代码
@SpringBootTest
public class SpringDataRedisTest {
    @Autowired
    private RedisTemplate redisTemplate;

    /**
     * 操作字符串类型数据
     */
    @Test
    public void testString(){
        
    }
}

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

java 复制代码
    /**
     * 操作字符串类型数据
     */
    @Test
    public void testString(){
        //set
        redisTemplate.opsForValue().set("city","北京");
        //get
        String 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)操作哈希表类型数据

java 复制代码
    /**
     * 哈希表类型数据
     */
    @Test
    public 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)操作列表类型数据

java 复制代码
    /**
     * 列表类型数据
     */
    @Test
    public 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)操作集合类型数据

java 复制代码
    /**
     * 集合类型数据
     */
    @Test
    public 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)操作有序集合类型数据

java 复制代码
    /**
     * 有序集合类型数据
     */
    @Test
    public 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)操作通用类型

java 复制代码
    /**
     * 通用类型命令
     */
    @Test
    public 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

java 复制代码
@RestController("adminShopController")
@RequestMapping("/admin/shop")
@Slf4j
@Api(tags = "营业状态相关接口")
public class ShopController {
    public static final String KEY = "SHOP_STATUS";
    @Autowired
    private 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

java 复制代码
@RestController("userShopController")
@RequestMapping("/user/shop")
@Slf4j
@Api(tags = "营业状态相关接口")
public class ShopController {
    public static final String KEY = "SHOP_STATUS";
    @Autowired
    private 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)修改相关代码

java 复制代码
    /**
     * 通过knife4j生成接口文档
     * @return
     */
    @Bean
    public 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;
    }
java 复制代码
    /**
     * 通过knife4j生成接口文档
     * @return
     */
    @Bean
    public 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

相关推荐
Q_Q5110082852 小时前
python+nodejs+springboot在线车辆租赁信息管理信息可视化系统
spring boot·python·信息可视化·django·flask·node.js·php
JIngJaneIL2 小时前
记账本|基于SSM的家庭记账本小程序设计与实现(源码+数据库+文档)
java·数据库·vue.js·spring boot·论文·毕设·家庭记账本小程序
Ting-yu2 小时前
Nginx快速入门
java·服务器·前端·nginx
泉城老铁3 小时前
除了群机器人,如何通过钉钉工作通知API给指定用户发消息?
spring boot·后端
小虎l3 小时前
李兴华-JavaWEB就业编程实战
java
泉城老铁3 小时前
springboot 对接钉钉发送消息
spring boot·后端
Bug生产工厂3 小时前
支付系统缓存策略:Redis实战与最佳实践
redis
shallwe小威3 小时前
SpringBoot集成Kafka
spring boot·后端·kafka