毕设项目<<基于微信小程序的餐馆外卖系统的设计后端>>(开发记录(四)店铺状态设置/Redis学习)
视频传送带
店铺状态设置
1.Redis
介绍
1.1 简介
Redis
是一个基于内存的key-value
结构数据库。
优点
- 基于内存存储读写性能高
- 适合存储热点数据
- 企业应用广泛
1.2 下载安装
Redis安装包分为 Windows 版和 Linux 版:
Windows版下载地址:https://github.com/microsoftarchive/redis/releases
Linux版下载地址: https://download.redis.io/releases/
-
启动命令:
redis-server.exe redis.windows.conf
-
结束命令:按下 CTRL+C。Redis服务默认端口号为 6379
-
客户端连接
-
新打开命令行窗口输入
redis-cli.exe
-
显式链接:
redis-cli.exe -h localhost -p 6379
(指定连接服务名称和端口号) -
测试连接;输入
keys *
通过redis-cli.exe命令默认连接的是本地的redis服务,并且使用默认6379端口。也可以通过指定如下参数连接:
-h
ip地址
-p
端口号
-a
密码(如果需要)
-
-
退出命令 exit
-
通过修改配置文件设定密码 取消注释
requirepass foobared
并设置密码- 密码连接
redis-cli.exe -h localhost -p 6379 -a SGLPy1314
- 密码连接
-
redis 图形控制界面
- Another-Redis-Desktop-Manager.1.5.5
-
快捷下载1.6.4 密码:g3uc
- Another-Redis-Desktop-Manager.1.5.5
1.3 Redis数据类型
5种常用数据类型
Redis存储的是key-value结构数据,其中key是字符串类型,value有五种常用数据类型:
- 字符串string
- 哈希 hash
- 列表 list
- 集合 set
- 有序集合 sorted set /zset
各数据类型的特点
- 字符串(string):普通字符串,Redis中最简单的数据类型
- 哈希(hash):也叫散列,类似于Java中的HashMap结构
- 列表(list):按照插入顺序排序,可以有重复元素,类似于Java中的LinkedList
- 集合(set):无序集合,没有重复元素,类似于Java中的HashSet
- 有序集合(sorted set / zset):集合中每个元素关联一个分数(score),根据分数升序排序,没有重复元素
1.4 Redis 常用命令
1.4.1 字符串操作命令
SET key value | 设置指定key的值 |
---|---|
GET key | 获取指定key的值 |
SETEX key seconds value | 设置指定key的值,并将 key 的过期时间设为 seconds 秒 |
SETNX key value | 只有在 key 不存在时设置 key 的值 |
1.4.2 哈希操作命令
命令 | 说明 |
---|---|
HSET key field value | 将哈希表 key 中的字段 field 的值设为 value |
HGET key field | 获取存储在哈希表中指定字段的值 |
HDEL key field | 删除存储在哈希表中的指定字段 |
HKEYS key | 获取哈希表中所有字段 |
HVALS key | 获取哈希表中所有值 |
1.4.3 列表操作命令
Redis 列表是简单的字符串列表,按照插入顺序排序,常用命令:
命令 | 说明 |
---|---|
LPUSH key value1 [value2] | 将一个或多个值插入到列表头部(左边) |
LRANGE key start stop | 获取列表指定范围内的元素 |
RPOP key | 移除并获取列表最后一个元素(右边) |
LLEN key | 获取列表长度 |
1.4.4 集合操作命令
Redis set 是string类型的无序集合。集合成员是唯一的,集合中不能出现重复的数据,常用命令:
命令 | 说明 |
---|---|
SADD key member1 [member2] | 向集合添加一个或多个成员 |
SMEMBERS key | 返回集合中的所有成员 |
SCARD key | 获取集合的成员数 |
SINTER key1 [key2] | 返回给定所有集合的交集 |
SUNION key1 [key2] | 返回所有给定集合的并集 |
SREM key member1 [member2] | 删除集合中一个或多个成员 |
-
sadd set a c b d e
-
- sadd set1 a c d g h i
-
smembers set
-
scard set1
-
sinter set set1
-
SUNION set set1
-
srem set a b
1.4.5 有序集合操作命令
Redis有序集合是string类型元素的集合,且不允许有重复成员。每个元素都会关联一个double类型的分数。常用命令:
命令 | 说明 |
---|---|
ZADD key score1 member1 [score2 member2] | 向有序集合添加一个或多个成员 |
ZRANGE key start stop [WITHSCORES] | 通过索引区间返回有序集合中指定区间内的成员 |
ZINCRBY key increment member | 有序集合中对指定成员的分数加上增量 increment |
ZREM key member [member …] | 移除有序集合中的一个或多个成员 |
1.4.6 通用命令
Redis的通用命令是不分数据类型的,都可以使用的命令:
命令 | 说明 |
---|---|
KEYS pattern | 查找所有符合给定模式( pattern)的 key |
EXISTS key | 检查给定 key 是否存在 |
TYPE key | 返回 key 所储存的值的类型 |
DEL key | 该命令用于在 key 存在是删除 key |
-
keys *
-
exists set2
-
1.5 在Java中操作redis
1.5.1 redis 的Java客户端
- Jedis
- Lettuce
- Spring Data Redis
1.5.2 Spring Data Redis 使用方式
操作步骤
-
导入Spring Data Redis 的maven坐标
-
配置Redis 数据源
-
编写配置类,创建RedisTemplate对象
-
通过RedisTemplate对象操作Redis
- RedisTemplate 针对大量api进行了归类封装,将同一数据类型的操作封装为对应的Operation接口,具体分类如下:
- ValueOperations:string数据操作
- SetOperations:set类型数据操作
- ZSetOperations:zset类型数据操作
- HashOperations:hash类型的数据操作
- ListOperations:list类型的数据操作
@Configuration @Slf4j public class RedisConfiguration { @Bean public RedisTemplate redisTemplate(RedisConnectionFactory redisConnectionFactory){ log.info("开始创建redis模板类..."); RedisTemplate redisTemplate = new RedisTemplate(); // 设置Key的序列化器,默认为JdkSerializationRedisSerializer redisTemplate.setKeySerializer(new StringRedisSerializer()); redisTemplate.setConnectionFactory(redisConnectionFactory); return redisTemplate; } }
2. 店铺状态设置
2.1 需求分析和设计
2.1.1产品原型
2.1.2 接口设计
-
设置营业状态/修改操作/put方式
-
管理端查询营业状态/查询方式get
-
用户端查询营业状态
注:管理端发出的请求,统一使用/admin作为前缀
用户端发出的请求统一使用/user作为前缀
2.1.3 数据库设计
营业状态的数据存储方式:基于Redis的字符串来进行存储
2.2 代码开发
2.2.1 admin/ShopController
package com.sky.controller.admin;
import com.sky.result.Result;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.models.auth.In;
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.*;
/**
* projectName: sky-take-out
* package: com.sky.controller.admin
* author: Amos
* description: 设置店铺状态开发
* date: 2024/1/21 0021 22:41:08
* version: 1.0
*/
@RestController("adminShopController")
@Slf4j
@RequestMapping("/admin/shop")
@Api(tags = "店铺相关接口")
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();
}
/**
* 获取店铺的营业状态
* @return
*/
@GetMapping("/status")
@ApiOperation("获取店铺的营业状态")
public Result<Integer> getStatus(){
Integer status = (Integer) redisTemplate.opsForValue().get(KEY);
log.info("获取到店铺的营业状态为:{}",status == 1 ? "营业中" : "打烊中");
return Result.success(status);
}
}
2.2.2 user/ShopController
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.*;
/**
* projectName: sky-take-out
* package: com.sky.controller.admin
* author: Amos
* description: 设置店铺状态开发
* date: 2024/1/21 0021 22:41:08
* version: 1.0
*/
@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);
}
}
2.3 代码测试
-
设置店铺状态
-
获取店铺运营状态