苍穹外卖-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;
    }
相关推荐
一只叫煤球的猫8 小时前
写代码很6,面试秒变菜鸟?不卖课,面试官视角走心探讨
前端·后端·面试
bobz9658 小时前
tcp/ip 中的多路复用
后端
bobz9658 小时前
tls ingress 简单记录
后端
皮皮林5519 小时前
IDEA 源码阅读利器,你居然还不会?
java·intellij idea
你的人类朋友10 小时前
什么是OpenSSL
后端·安全·程序员
bobz96510 小时前
mcp 直接操作浏览器
后端
前端小张同学12 小时前
服务器部署 gitlab 占用空间太大怎么办,优化思路。
后端
databook12 小时前
Manim实现闪光轨迹特效
后端·python·动效
武子康13 小时前
大数据-98 Spark 从 DStream 到 Structured Streaming:Spark 实时计算的演进
大数据·后端·spark
该用户已不存在13 小时前
6个值得收藏的.NET ORM 框架
前端·后端·.net