标签:外卖 redis Object Redis key 集合 第五天 苍穹 public
店铺营业状态设置
Redis入门
Redis简介
Redis是一个基于内存的 key-value 结构数据库。
Redis的特点
- 基于内存存储,读写性能高。
- 适合存储热点数据(热点商品、资讯、新闻)。
- 企业应用广泛。
Redis的网站
Redis的下载与安装
下载
- Redis安装包分为 Windows 版和 Linux 版:
安装
- Redis的Windows版属于绿色软件,直接解压即可使用,解压后目录结构如下:
Redis服务启动与停止
服务端
- 服务端启动命令:命令行中输入
redis-server.exe redis.windows.conf
。
- Redis服务默认端口号为 6379 ,通过快捷键Ctrl + C 即可停止Redis服务。
客户端
- 客户端连接命令:命令行中输入
redis-cli.exe
。
- 通过redis-cli.exe命令默认连接的是本地的redis服务,并且使用默认6379端口。也可以通过指定如下参数连接:
参数名 |
说明 |
-h |
ip地址 |
-p |
端口号 |
-a |
密码(如果需要) |
Redis密码
- 设置Redis服务密码:在redis.windows.conf修改
# requirepass foobared
为requirepass 密码
即可。
- 注意:
- 修改密码后需要重启Redis服务才能生效。
- Redis配置文件中#表示注释。
Redis数据类型
Redis的数据类型特指value有的数据类型,value有5种常用的数据类型:字符串(string)、哈希(hash)、列表(list)、集合(set)和有序集合(sorted set / zset),其特点如下:
数据类型 |
特点 |
字符串(string) |
普通字符串,Redis中最简单的数据类型 |
哈希(hash) |
也叫散列,类似于Java中的HashMap结构 |
列表(list) |
按照插入顺序排序,可以有重复元素,类似于Java中的LinkedList |
集合(set) |
无序集合,没有重复元素,类似于Java中的HashSet |
有序集合(sorted set / zset) |
集合中每个元素关联一个分数(score),根据分数升序排序,没有重复元素 |
Redis常用命令
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 中的字段 field 的值设为 value |
HGET key field |
获取存储在哈希表中指定字段的值 |
HDEL key field |
删除存储在哈希表中的指定字段 |
HKEYS key |
获取哈希表中所有字段 |
HVALS key |
获取哈希表中所有值 |
列表操作命令
- Redis 列表是简单的字符串列表(队列),按照插入顺序排序,常用命令有:
常用命令 |
说明 |
LPUSH key value1 [value2 ...] |
将一个或多个值插入到列表尾部(左边) |
LRANGE key start stop |
获取列表指定范围内的元素 |
RPOP key |
移除并获取列表最后一个元素(右边) |
LLEN key |
获取列表长度 |
集合操作命令
- Redis set 是string类型的无序集合。集合成员是唯一的,集合中不能出现重复的数据,常用命令有:
常用命令 |
说明 |
SADD key member1 [member2 ...] |
向集合添加一个或多个成员 |
SMEMBERS key |
返回集合中的所有成员 |
SCARD key |
获取集合的成员数 |
SINTER key1 [key2 ...] |
返回给定所有集合的交集 |
SUNION key1 [key2 ...] |
返回所有给定集合的并集 |
SREM key member1 [member2 ...] |
删除集合中一个或多个成员 |
有序集合操作命令
- Redis有序集合是string类型元素的集合,且不允许有重复成员。每个元素都会关联一个double类型的分数,默认按照分数升序排列。常用命令有:
常用命令 |
说明 |
ZADD key score1 member1 [score2 member2 ...] |
向有序集合添加一个或多个成员 |
ZRANGE key start stop [WITHSCORES] |
通过索引区间返回有序集合中指定区间内的成员, 加上withscores后会同时返回每个成员的分数 |
ZINCRBY key increment member |
有序集合中对指定成员的分数加上增量increment |
ZREM key member [member ...] |
移除有序集合中的一个或多个成员 |
通用命令
- Redis的通用命令是不分数据类型,都可以使用的命令:
常用命令 |
说明 |
KEYS pattern |
查找所有符合给定模式(pattern)的 key |
EXISTS key |
检查给定 key 是否存在 |
TYPE key |
返回 key 所储存的值的类型 |
DEL key [key ...] |
该命令用于在 key 存在时删除 key |
在Java中操作Redis
Redis的Java客户端
-
Redis 的 Java 客户端很多,常用的几种:
- Jedis
- Lettuce
- Spring Data Redis
-
Spring Data Redis 是 Spring 的一部分,对 Redis 底层开发包进行了高度封装。
-
在 Spring 项目中,建议使用Spring Data Redis来简化操作。
Spring Data Redis使用步骤
- 导入Spring Data Redis 的maven坐标
<!--pom.xml-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
- 配置Redis数据源
#application-dev.yml
spring:
redis:
host: localhost
port: 6379
password: 密码
[database: 数据库标号,默认为0]
#application.yml
spring:
redis:
host: ${sky.redis.host}
port: ${sky.redis.port}
password: ${sky.redis.password}
[database: ${sky.redis.database}]
- 编写配置类,创建RedisTemplate对象
//RedisConfiguration.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的序列化器,默认为JdkSerializationRedisSerializer
redisTemplate.setKeySerializer(new StringRedisSerializer());
return redisTemplate;
}
}
- 通过RedisTemplate对象操作Redis
Spring Data Redis使用方式
- RedisTemplate 针对大量api进行了归类封装,将同一数据类型的操作封装为对应的Operation接口,具体分类如下:
接口 |
说明 |
ValueOperations |
string类型数据操作 |
HashOperations |
hash类型的数据操作 |
ListOperations |
list类型的数据操作 |
SetOperations |
set类型数据操作 |
ZSetOperations |
zset类型数据操作 |
RedisTemplate redisTemplate = new RedisTemplate() //通用命令直接通过redisTemplate对象使用
ValueOperations valueOperations = redisTemplate.opsForValue(); //获取string类型数据操作的对象
HashOperations hashOperations = redisTemplate.opsForHash(); //获取hash类型数据操作的对象
ListOperations listOperations = redisTemplate.opsForList(); //获取list类型数据操作的对象
SetOperations setOperations = redisTemplate.opsForSet(); //获取set类型数据操作的对象
ZSetOperations zsetOperations = redisTemplate.opsForZSet(); //获取zset类型数据操作的对象
ValueOperations的常用方法 |
说明 |
public void set(Object key, Object value) |
设置指定key的值 |
public Object get(Object key) |
获取指定key的值 |
public void set(Object key, Object value, long timeout, TimeUnit unit) |
设置指定key的值,并将key的过期时间设为timeout,单位为unit |
public Boolean setIfAbsent(Object key, Object value) |
只有在key不存在时设置key的值 |
HashOperations的常用方法 |
说明 |
public void put(Object key, Object hashKey, Object value) |
将哈希表key中的字段hashKey的值设为value |
public Object get(Object key, Object hashKey) |
获取存储在哈希表key中字段hashKey的值 |
public Long delete(Object key, Object... hashKeys) |
删除存储在哈希表中的一个或多个字段 |
public Set keys(Object key) |
获取哈希表中所有字段 |
public List values(Object key) |
获取哈希表中所有值 |
ListOperations的常用方法 |
说明 |
public Long leftPush(Object key, Object value) |
将一个值插入到列表尾部(左边) |
public Long leftPushAll(Object key, Object... values) |
将多个值插入到列表尾部(左边) |
public List range(Object key, long start, long end) |
获取列表指定范围内的元素 |
public Object rightPop(Object key) |
移除并获取列表最后一个元素(右边) |
public Long size(Object key) |
获取列表长度 |
SetOperations的常用方法 |
说明 |
public Long add(Object key, Object... values) |
向集合添加一个或多个成员 |
public Set member(Object key) |
返回集合中的所有成员 |
public Long size(Object key) |
获取集合的成员数 |
public Set intersect(Collection keys) |
返回给定所有集合的交集 |
public Set intersect(Object key, Object otherKey) |
返回给定所有集合的交集 |
public Set intersect(Object key, Collection otherKeys) |
返回给定所有集合的交集 |
public Set union(Collection keys) |
返回所有给定集合的并集 |
public Set union(Object key, Object otherKey) |
返回所有给定集合的并集 |
public Set union(Object key, Collection otherKeys) |
返回所有给定集合的并集 |
public Long remove(Object key, Object... values) |
删除集合中一个或多个成员 |
ZSetOperations的常用方法 |
说明 |
public Boolean add(Object key, Object value, double score) |
向有序集合添加一个成员 |
public Set range(Object key, long start, long end) |
通过索引区间返回有序集合中指定区间内的成员 |
public Double incrementScore(Object key, Object value, double delta) |
有序集合中对指定成员的分数加上增量increment |
public Long remove(Object key, Object... values) |
移除有序集合中的一个或多个成员 |
通用命令的常用方法 |
说明 |
public Set keys(Object pattern) |
查找所有符合给定模式(pattern)的 key |
public Boolean hasKey(Object key) |
检查给定 key 是否存在 |
public DataType type(Object key) |
返回 key 所储存的值的类型 |
public Boolean delete(Object key) |
该命令用于在 key 存在时删除 key |
店铺营业状态设置
需求分析和设计
产品原型
接口设计
设置营业状态
管理端查询营业状态
用户端查询营业状态
本项目约定
- 管理端发出的请求,统一使用/admin作为前缀。
- 用户端发出的请求,统一使用/user作为前缀。
营业状态数据存储方式
代码开发
设置营业状态
- admin.ShopController.java
@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();
}
}
管理端查询营业状态
- admin.ShopController.java
@GetMapping("/status")
@ApiOperation("查询店铺营业状态")
public Result<Integer> getStatus() {
Integer status = (Integer) redisTemplate.opsForValue().get(KEY);
log.info("查询店铺营业状态为:{}", status == 1 ? "营业中" : "打烊中");
return Result.success(status);
}
用户端查询营业状态
@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);
}
}
修改配置类WebMvcConfiguration使Swagger接口文档中用户端接口和管理端接口分别展示
- 修改WebMvcConfiguration.java中的docket方法:
- 将docket方法复制一份并修改其方法名。
- 分别修改两个docket方法的扫描范围。
- 分别为两个docket方法设置分组名。
@Bean
public Docket docketAdmin() {
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 docketUser() {
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;
}
功能测试
- 可以通过接口文档进行测试,最后完成前后端联调测试即可。
标签:外卖,
redis,
Object,
Redis,
key,
集合,
第五天,
苍穹,
public
From: https://www.cnblogs.com/zgg1h/p/18132721