【项目实战 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接口
2、查询营业状态 - GET接口
(1)管理员端 - ShopController
(2)用户端 - ShopController
三、接口文档中分开设置端口小技巧
一、Redis入门
Redis是一个基于内存的 key-value 结构数据库。
- 基于内存存储,读写性能高
- 适合存储热点数据(热点商品、资讯、新闻)
- 企业应用广泛
1、Redis下载与安装
(1)在资料包中day5找到对应安装包
解压文件
(2)点击解压后的文件包,选中地址框输入cmd进入控制台,并输入(复制粘贴好像不行)下面命令后按回车【如果想退出,在这个页面按Ctrl+C】
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
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency>
【2】配置Redis数据源
在application-dev.yml中设置具体的值,在application-dev.yml中引用
redis:host: ${sky.redis.host}port: ${sky.redis.port}database: ${sky.redis.database}
【3】编写配置类,创建RedisTemplate对象
@Configuration @Slf4j public class RedisConfiguration {@Beanpublic RedisTemplate redisTemplate(RedisConnectionFactory redisConnectionFactory){log.info("开始创建redis模板对象");RedisTemplate redisTemplate = new RedisTemplate();//设置redis连接工厂对象redisTemplate.setConnectionFactory(redisConnectionFactory);//设置redis key序列化器redisTemplate.setKeySerializer(new StringRedisSerializer());return redisTemplate;} }
【4】创建测试类
@SpringBootTest public class SpringDataRedisTest {@Autowiredprivate RedisTemplate redisTemplate;/*** 操作字符串类型数据*/@Testpublic void testString(){} }
(2)操作字符串类型数据
/*** 操作字符串类型数据*/@Testpublic void testString(){//setredisTemplate.opsForValue().set("city","北京");//getString 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)操作哈希表类型数据
/*** 哈希表类型数据*/@Testpublic 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)操作列表类型数据
/*** 列表类型数据*/@Testpublic 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)操作集合类型数据
/*** 集合类型数据*/@Testpublic 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)操作有序集合类型数据
/*** 有序集合类型数据*/@Testpublic 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)操作通用类型
/*** 通用类型命令*/@Testpublic 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
@RestController("adminShopController") @RequestMapping("/admin/shop") @Slf4j @Api(tags = "营业状态相关接口") public class ShopController {public static final String KEY = "SHOP_STATUS";@Autowiredprivate 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
@RestController("userShopController") @RequestMapping("/user/shop") @Slf4j @Api(tags = "营业状态相关接口") public class ShopController {public static final String KEY = "SHOP_STATUS";@Autowiredprivate 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)修改相关代码
/*** 通过knife4j生成接口文档* @return*/@Beanpublic 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;}
/*** 通过knife4j生成接口文档* @return*/@Beanpublic 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