【苍穹外卖项目】Day05

📘博客主页:程序员葵安

🫶感谢大家点赞👍🏻收藏⭐评论✍🏻

一、Redis入门

Redis简介

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

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

二、Redis数据类型

5种常用数据类型

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

  • 字符串 String :普通字符串,Redis中最简单的数据类型
  • 哈希 hash :也叫散列,类似于Java中的HashMap结构
  • 列表 list :按照插入顺序排序,可以有重复元素,类似于Java中的LinkedList
  • 集合 set :无序集合,没有重复元素,类似于Java中的HashSet
  • 有序集合 sorted set / zset :集合中每个元素关联一个double类型的分数score,根据分数升序排序,没有重复元素

三、Redis常用命令

字符串操作命令

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

哈希操作命令

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

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

列表操作命令

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

集合操作命令

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

有序集合操作命令

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

通用命令

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

四、Java中操作Redis

Redis的Java客户端

Redis的Java客户端很多,常用的几种:

  • Jedis
  • Lettuce
  • Spring Data Redis

Spring Data Redis 是 Springs 的一部分,对 Redis 底层开发包进行了高度封装。

在 Spring 项目中,可以使用Spring Data Redis简化操作

Spring Data Redis使用方式

操作步骤:

  1. 导入Spring Data Redis的 maven坐标

  2. 配置Redis数据源

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

    java 复制代码
    @Configuration
    @Slf4j
    public class RedisConfiguration {
        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. 通过RedisTemplate对象操作Redis

    java 复制代码
    @SpringBootTest
    public class SpringDataRedisTest {
        @Autowired
        private RedisTemplate redisTemplate;
    
        @Test
        public void testRedisTemplate(){
            System.out.println(redisTemplate);
            //string数据操作
            ValueOperations valueOperations = redisTemplate.opsForValue();
            //hash类型的数据操作
            HashOperations hashOperations = redisTemplate.opsForHash();
            //list类型的数据操作
            ListOperations listOperations = redisTemplate.opsForList();
            //set类型数据操作
            SetOperations setOperations = redisTemplate.opsForSet();
            //zset类型数据操作
            ZSetOperations zSetOperations = redisTemplate.opsForZSet();
        }
    }

五、店铺营业状态设置

需求分析接口设计

接口设计:

  • 设置营业状态

  • 管理端查询营业状态

  • 用户端查询营业状态

**注:**从技术层面分析,其实管理端和用户端查询营业状态时,可通过一个接口去实现即可。因为营业状态是一致的。但是,本项目约定:

  • 管理端发出的请求,统一使用/admin作为前缀。

  • 用户端发出的请求,统一使用/user作为前缀。

因为访问路径不一致,故分为两个接口实现。

代码开发

根据接口定义创建ShopController的setStatus设置营业状态方法:

java 复制代码
package com.sky.controller.admin;

import com.sky.result.Result;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

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

    public static final String KEY = "SHOP_STATUS";

    @Autowired
    private RedisTemplate redisTemplate;

    /**
     * 设置店铺的营业状态
     * @param status
     * @return
     */
    @PutMapping("/{status}")
    @ApiOperation("设置店铺的营业状态")
    public Result setStatus(@PathVariable Integer status){
        log.info("设置店铺的营业状态为:{}",status == 1 ? "营业中" : "打烊中");
        redisTemplate.opsForValue().set(KEY,status);
        return Result.success();
    }
}

根据接口定义创建ShopController的getStatus查询营业状态方法:

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

根据接口定义创建ShopController的getStatus查询营业状态方法:

java 复制代码
package com.sky.controller.user;

import com.sky.result.Result;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.web.bind.annotation.*;

@RestController("userShopController")
@RequestMapping("/user/shop")
@Api(tags = "店铺相关接口")
@Slf4j
public class ShopController {

    public static final String KEY = "SHOP_STATUS";

    @Autowired
    private RedisTemplate redisTemplate;

    /**
     * 获取店铺的营业状态
     * @return
     */
    @GetMapping("/status")
    @ApiOperation("获取店铺的营业状态")
    public Result<Integer> getStatus(){
        Integer status = (Integer) redisTemplate.opsForValue().get(KEY);
        log.info("获取到店铺的营业状态为:{}",status == 1 ? "营业中" : "打烊中");
        return Result.success(status);
    }
}
相关推荐
孟婆来包棒棒糖~22 分钟前
Docker快速入门
运维·spring boot·docker·容器·tomcat
hqxstudying1 小时前
SpringBoot启动项目详解
java·spring boot·后端
一枚小小程序员哈1 小时前
基于springboot/java/VUE的旅游管理系统/旅游网站的设计与实现
spring boot·spring·java-ee·maven·intellij-idea·旅游
Code blocks8 小时前
关于“LoggerFactory is not a Logback LoggerContext but Logback is on ......“的解决方案
java·spring boot·后端
飞翔的佩奇8 小时前
基于SpringBoot+MyBatis+MySQL+VUE实现的经方药食两用服务平台管理系统(附源码+数据库+毕业论文+部署教程+配套软件)
数据库·vue.js·spring boot·mysql·毕业设计·mybatis·经方药食两用平台
04Koi.10 小时前
八股训练--Spring
java·后端·spring
纯洁的小魔鬼11 小时前
Springboot 配置 doris 连接
spring boot·doris·连接池
c_zyer11 小时前
Mermaid流程图可视化系统:基于Spring Boot与Node.js的三层架构实现
spring boot·node.js·流程图·mermaid
Livingbody12 小时前
【心理咨询师数字孪生对话数据集】标准化为 ShareGPT OpenAI 格式
后端