苍穹外卖-Redis部分

P49 课程介绍

Redis入门

P50 redis

一个基于内存的key-value结构数据库。(mysql基于磁盘存储,二维表存储)redis是键值对形式。

基于内存存储,读写性能高。一般适合存储热点数据,热点商品、资讯、新闻等。

我的安装在D盘,版本为Redis_x64_5.0.14.1。

启动redis的操作:

  • 进入redis的安装目录,

  • redis-server.exe redis.windows.conf,默认端口号6379

  • 连接redis服务,redis-cli.exe,默认连接本地的redis。连接其他的redis

    • redis-cli.exe -h ip地址 -p 端口号 -a 有密码就输入密码
  • redis配置文件中默认没有配置密码,修改配置文件redis.window.conf

    • 在文件中找到requirepass foobared,设置密码配置,取消注释,foobared就是自己需要修改的密码,保存重启redis就可以了

可以使用redis的图形界面,例如Another-Redis-Desktop-Manager

P51 Redis常用数据类型

Redis中存储的是key-value的数据,其中key是字符串类型,value有5种常用类型:

  • 字符串string

  • 哈希hash,类似java中的hashmap结构,适合存储对象

  • 列表list,带有顺序,按照插入顺序排序,可以有重复元素,类似java的LinkedList,适合存储有顺序有关的

  • 集合set,无序的,没有重复元素,类似java中的hashset

  • 有序集合sorted set/ zset,集合中每个元素会关联一个分数,根据分数升序排序,没有重复元素

P52 redis常用命令-Redis字符串类型常用命令

不同数据类型有独特的命令,也有通用命令

Redis字符串类型常用命令:

  • SET key value设置键值

  • GET key获取指定key的值

  • SETEX key seconds value,seconds为秒数,应用场景短信验证码

  • SETNX key value,只有在key不存在时设置key的值,存在则不进行设置。典型应用场景分布式锁

P53 redis常用命令-哈希操作命令

  • HSET key field value

  • HGET key field

  • HDEL key field,删除

  • HKEYS key

  • HVALS key

P54 redis常用命令-列表操作命令

Redis列表是简单的字符串列表,按照插入顺序排序,常用命令:

  • LPUSH key value1 [value2],插入数据,从左侧插入,右侧移除

  • LRANGE key start stop

  • RPOP key移除并获取列表最后一个元素

  • LLEN key

P55 redis常用命令-集合操作命令

无序,无重复,

  • SADD key member1[member2]

  • SMEMBERS key,返回集合中所有成员

  • SCARD key获取集合中的成员数

  • SINTER key1 [key2]返回给定集合的交集

  • SUNION key1 [key2]返回并集

  • SREM key member1 [member2]

P56 redis常用命令-有序集合操作命令

有序,不重复,每个元素会关联一个double类型的分数

  • ZADD key score1 member1 [score2 member2]

  • ZRANGE key start stop [WITHSCORES]

  • ZINCRBY key increment member对分数加上增量

  • ZREM key member [member]移除

P57 redis通用命令

不分数据类型

  • KEYS patter

  • EXISTS key检查key是否存在

  • TYPE key

  • DEL key

在java中操作Redis

P58 Redis的java客户端

常见的:

  • Jedis

  • Lettuce

  • Spring data Redis,spring的一部分,对redis底层开发包进行了高度封装,建议使用

spring data redis使用方式:

  • 导入坐标

在sky server模块的pom中引入坐标,

Java 复制代码
<!--        使用spring data redis-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>
  • 配置redis数据源

在sky server模块下配置文件中配置,

Java 复制代码
spring:
 redis:
    host: localhost
    port: 6379
    # 如果有密码可以加上密码
    # database: 默认创建了16个库,DB0-15,默认就是DB0

可以修改,在yml.dev中使用,然后在yml中引用,

  • 编写配置类,RedisTemplate,redis模板对象
Java 复制代码
@Configuration
@Slf4j
public class RedisConfiguration {
    // 引入了spring data redis,会自动将连接工厂放到spring容器中,只需要在下面的方法中声明
    @Bean  // 注入redis连接工厂
    public RedisTemplate redisTemplate(RedisConnectionFactory redistConnectionFactory) {
        // 日志
        log.info("开始创建redis模板对象");
        RedisTemplate redisTemplate = new RedisTemplate();
        // 设置redis连接工厂对象
        redisTemplate.setConnectionFactory(redistConnectionFactory);
        // 设置redis key的序列化器(指定string类型的序列化器,便于图形界面展示)
        redisTemplate.setKeySerializer(new StringRedisSerializer());
        // 返回对象
        return redisTemplate;
    }
}
  • 通过RedisTemplate对象操作redis

创建对象,示例:

Java 复制代码
 // 操作字符串数据类型
        ValueOperations valueOperations = redisTemplate.opsForValue();
        // 操作hash类型
        HashOperations hashOperations = redisTemplate.opsForHash();
        // 操作列表
        ListOperations listOperations = redisTemplate.opsForList();
        // 操作集合
        SetOperations setOperations = redisTemplate.opsForSet();
        // 操作有序集合
        ZSetOperations zSetOperations = redisTemplate.opsForZSet();

P60 在java中操作Redis-操作字符串类型的数据

示例:

Java 复制代码
redisTemplate.opsForValue().set("city", "北京");
String city = (String) redisTemplate.opsForValue().get("city");
System.out.println(city);
// setex 对应java操作还是 set,
redisTemplate.opsForValue().set("city", "湖南", 3, TimeUnit.MINUTES); // 表示期限为3分钟
// 设置setnx 对应 
// setnx
redisTemplate.opsForValue().setIfAbsent("locked", "1");

java中设置时间期限为:

P61 在java中操作Redis-操作哈希类型的数据

P62 其他类型数据的操作

店铺营业状态设置

P63 需求分析

有查询状态的接口,然后修改状态的接口

营业状态数据存储方式,建议使用基于redis的字符串进行存储。

P64 代码开发

示例:设置和查询操作

Java 复制代码
    @PutMapping("/{status}")
    @ApiOperation("管理端设置店铺营业状态")
    public Result setStatus(@PathVariable Integer status){
        log.info("设置店铺营业状态为:{}", status ==1 ? "1营业中" : "0打烊中");
        // 创建redis的string类型
        redisTemplate.opsForValue().set("SHOP_STATUS", status);
        return  Result.success();
    }

    @GetMapping("/status")
    @ApiOperation("获取店铺的营业状态")
    public Result getStatus(){
        Integer shop_staatus = (Integer) redisTemplate.opsForValue().get("SHOP_STAATUS");
        return Result.success(shop_staatus);

    }

注意用户端和客户端如果都有查询店铺营业状态的,但是controller都是shopcontroller则会报错,两者冲突,可以在注解@Restcontroller中进行设置,例如:

Java 复制代码
@RestController("adminShopController")

P65 功能测试

先登录账户,使用管理端设置redis数据库中店铺状态,注意本地运行要启动本地的redis数据库。

如果希望接口文档按照管理端和用户端进行显示,则需要在接口文档的配置中重新编写,例如下述代码,分别扫描用户端和客户端的包,然后设置分组group。

重新启动则可以按照不同类别进行显示了。

Java 复制代码
@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;
    }

    @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;
    }
相关推荐
XINGTECODE几秒前
海盗王集成网关和商城服务端功能golang版
开发语言·后端·golang
soulteary2 分钟前
突破内存限制:Mac Mini M2 服务器化实践指南
运维·服务器·redis·macos·arm·pika
天天扭码6 分钟前
五天SpringCloud计划——DAY2之单体架构和微服务架构的选择和转换原则
java·spring cloud·微服务·架构
程序猿进阶6 分钟前
堆外内存泄露排查经历
java·jvm·后端·面试·性能优化·oom·内存泄露
FIN技术铺11 分钟前
Spring Boot框架Starter组件整理
java·spring boot·后端
小曲程序18 分钟前
vue3 封装request请求
java·前端·typescript·vue
gma99927 分钟前
Etcd 框架
数据库·etcd
爱吃青椒不爱吃西红柿‍️30 分钟前
华为ASP与CSP是什么?
服务器·前端·数据库
凡人的AI工具箱33 分钟前
15分钟学 Go 第 60 天 :综合项目展示 - 构建微服务电商平台(完整示例25000字)
开发语言·后端·微服务·架构·golang
陈王卜36 分钟前
django+boostrap实现发布博客权限控制
java·前端·django