【苍穹外卖项目】Day05

发布于:2025-08-02 ⋅ 阅读:(10) ⋅ 点赞:(0)

📘博客主页:程序员葵安

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

一、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对象
    @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
    @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设置营业状态方法:

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查询营业状态方法:

	/**
     * 获取店铺的营业状态
     * @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查询营业状态方法:

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);
    }
}


网站公告

今日签到

点亮在社区的每一天
去签到