苍穹外卖-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;
    }
相关推荐
建投数据17 分钟前
建投数据与腾讯云数据库TDSQL完成产品兼容性互认证
数据库·腾讯云
向前看-1 小时前
验证码机制
前端·后端
xlsw_1 小时前
java全栈day20--Web后端实战(Mybatis基础2)
java·开发语言·mybatis
Hacker_LaoYi1 小时前
【渗透技术总结】SQL手工注入总结
数据库·sql
岁月变迁呀1 小时前
Redis梳理
数据库·redis·缓存
独行soc1 小时前
#渗透测试#漏洞挖掘#红蓝攻防#护网#sql注入介绍06-基于子查询的SQL注入(Subquery-Based SQL Injection)
数据库·sql·安全·web安全·漏洞挖掘·hw
神仙别闹2 小时前
基于java的改良版超级玛丽小游戏
java
你的微笑,乱了夏天2 小时前
linux centos 7 安装 mongodb7
数据库·mongodb
黄油饼卷咖喱鸡就味增汤拌孜然羊肉炒饭2 小时前
SpringBoot如何实现缓存预热?
java·spring boot·spring·缓存·程序员
工业甲酰苯胺2 小时前
分布式系统架构:服务容错
数据库·架构