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