day04:Redis和店铺营业状态设置


Redis入门

Redis简介

Redis是典型的NoSQL数据库,是一个基于内存的key-value结构数据库
优势

  • 基于内存存储,读写性能高
  • 适合存储热点数据(热点商品、资讯、新闻)
  • 企业应用广泛

官网https://redis.io
中文网https://www.redis.net.cn/

NoSQL

NoSQL( NoSQL = Not Only SQL ),意即不仅仅是 SQL,泛指⾮关系型的数据库 解释:** ** 非关系型数据库(NoSQL)是⼀类⽤于存储和管理⾮结构化数据的数据库系统。与传统的关系型数据库不同,非关系型数据库通常使⽤不同的数据模型和查询语⾔来存储和管理数据,如键值存储、⽂档存储、列族存储、图形存储等。
NoSQL不依赖业务逻辑方式存储,而以简单的key-value模式存储。因此大大的增强了数据库的扩展能力。
特点

  • 不遵循SQL标准
  • 不支持ACID
  • 远超于SQL的性能

常见的NoSQL数据库

  • Redis
  • MongoDB

Redis下载和安装

Redis安装包分为Windows版和Linux版:

Redis的Windows版属于绿色软件,直接解压即可使用。解压后目录结构如下:
image.png

Redis服务启动和停止

服务启动命令:redis-server.exe redis.windows.conf
image.png
Redis服务默认端口号为6379,通过快捷键 Ctrl+C 即可停止Redis服务
客户端连接命令:redis-cli.exe
image.png
通过redis-cli.exe命令默认连接的是本地的Redis服务,并且使用默认6379端口。也可以通过使用如下参数连接:
**-h ip地址 -p 端口号 ** -a 密码
设置Redis服务密码,修改redis.windows.conf
requirepass 123456
:设置完密码需要重启redis服务才能生效

Redis数据类型

5中常用数据类型介绍

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

  • 字符串 string
  • 哈希 hash
  • 列表 list
  • 集合 set
  • 有序集合 sorted set / zset

各种数据类型的特点

image.png

Redis常用命令

字符串操作命令

image.png
特点:最常用最简单,但是修改数据需要进行完整覆盖
数据结构: 内部结构实现上类似于** Java 的 ArrayList**,采⽤预分配冗余空间的⽅式来减少内存的频繁分配

哈希操作命令 Hash

Redis hash是一个string 类型的field 和value的映射表,hash特别适合用于存储对象
image.png
特点:修改数据非常灵活,可以做到只修改一个里面键值对的值
类似于Java中的HashMap

列表操作命令 List

Redis 列表是简单的字符串列表,按照插入顺序排序
image.png
类似java中的linkedList,链表结构,有序可重复,插入的顺序就是排序的顺序
应用场景:队列(先进先出)、栈(先进后出),过去时间的排行榜

集合操作命令 Set

Redis set 是string类型的无序集合。集合成员是唯一的,集合中不能出现重复的数据image.png
类似于Java中的HashSet,无序,不可重复
应用场景:去重,合并,取交集

有序集合操作命令 ZSet

Redis有序集合是string类型元素的集合,且不允许有重复成员。每个元素都会关联一个double类型的分数(权重)。
image.png
类似于Java中的LinkedHashSet,有序,不可重复
应用场景:实时排行榜,因为分数变了,排序就会变

通用命令

Redis的通用命令是不分数据类型的,都可以使用的命令
image.png

在Java中操作Redis

Redis的Java客户端

介绍:通过编写java代码操作redis服务器
原生客户端:Jedis、Redisson、Lettuce

Jedis

  1. 导入依赖
<dependency>
  <groupId>redis.clients</groupId>
  <artifactId>jedis</artifactId>
  <version>3.2.0</version>
 </dependency>
  1. 测试连接
  public class JedisDemo {
 public static void main(String[] args) {
 Jedis jedis = new Jedis("10.211.55.3", 6379);
 String pong = jedis.ping();
 System.out.println("连接成功:" + pong);
 jedis.close();
  }
 }
  1. 不同数据类型操作

key 和操作redis数据库的命令基本一致

jedis.set("k1", "v1");
 jedis.set("k2", "v2");
 jedis.set("k3", "v3");
 Set<String> keys = jedis.keys("*");
 System.out.println(keys.size());
 for (String key : keys) {
 System.out.println(key);
 }
 System.out.println(jedis.exists("k1"));
 System.out.println(jedis.ttl("k1"));                
System.out.println(jedis.get("k1"))

Spring Data Redis

介绍

对原生客户端进行封装提供简化开发操作redis服务器,默认底层封装lettuce

关于设计模式的说明(面试题)

spring框架利用模板设计模式,提供RedisTemplate模板类默认封装lettuce操作redis
模板设计模式,提供了公共的方法操作目标数据,底层可以更换原生客户端技术
spring编程式事务提供了TransactionTemplate,操作关系型数据库JDBCTemplate

使用步骤

  1. 导入依赖

image.png

  1. 配置Redis数据源

image.png

  1. 编写配置类,创建RedisTemplate对象

image.png

  1. 通过RedisTemplate对象操作Redis

看使用方式
:第三步创建RedisTemplate对象加入Spring容器的方法名必须为redisTemplate
原因:springDataRedis提供自动配置类,里面已经将一个RedisTemplate加入了spring容器,它的默认名也是redisTemplate,并且使用了@ConditionalOnMissingBean由于我们自己的项目也创建了这个对象,优先级高,所以我们先创建加入spring容器,这样后面容器自动配置就会检测到不会再创建RedisTemplate对象

使用方式

RedisTemplate针对大量api进行了归类封装,将同一数据类型的操作封装为对应的Operation接口,具体分类如下:
image.png
image.png

店铺营业状态设置

接口设计

image.png

代码书写

管理端

@RestController
@Slf4j
@Api(tags = "管理端店铺相关类接口")
@RequestMapping("/admin/shop")
public class ShopController {

    @Resource
    private RedisTemplate redisTemplate;

    /**
     * 设置营业状态接口
     * @param status
     * @return
     */
    @ApiOperation("设置营业状态接口")
    @PutMapping("/{status}")
    public Result setStatus(@PathVariable Integer status){
        log.info("设置营业状态接口:{}",status);
        redisTemplate.opsForValue().set("SHOP_STATUS",status);

        return Result.success();
    }


    /**
     * 管理端查询营业状态接口
     * @return
     */
    @ApiOperation("管理端查询营业状态接口")
    @GetMapping("/status")
    public Result<Integer> getStatus(){
        log.info("管理端查询营业状态接口");
        Integer status = (Integer) redisTemplate.opsForValue().get("SHOP_STATUS");

        if (status == null){
           status = 0;
        }

        return Result.success(status);
    }
}

用户端

@RestController("userShopController")
@RequestMapping("/user/shop")
@Slf4j
@Api(tags = "用户端店铺相关类接口")
public class ShopController {


    @Resource
    private RedisTemplate redisTemplate;


    /**
     * 用户端查询营业状态接口
     * @return
     */
    @ApiOperation("用户端查询营业状态接口")
    @GetMapping("/status")
    public Result<Integer> getStatus(){
        log.info("用户端查询营业状态接口");
        Integer status = (Integer) redisTemplate.opsForValue().get("SHOP_STATUS");

        if (status == null){
            status = 0;
        }

        return Result.success(status);
    }
}

Swagger分开两个端口

image.png

相关推荐

  1. Day05 Redis 面试题 下

    2024-07-16 02:18:04       21 阅读
  2. Redis-04

    2024-07-16 02:18:04       26 阅读
  3. ubuntu 22.04 安装redis设置远程连接

    2024-07-16 02:18:04       60 阅读
  4. flutter学习-day13-功能型组件状态共享

    2024-07-16 02:18:04       53 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-16 02:18:04       66 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-16 02:18:04       70 阅读
  3. 在Django里面运行非项目文件

    2024-07-16 02:18:04       57 阅读
  4. Python语言-面向对象

    2024-07-16 02:18:04       68 阅读

热门阅读

  1. 实习随笔【前端技术实现全局添加水印】

    2024-07-16 02:18:04       21 阅读
  2. (day17)其他分组不明确的题

    2024-07-16 02:18:04       21 阅读
  3. no-fee服务器玩转LLM

    2024-07-16 02:18:04       18 阅读
  4. lvs是什么

    2024-07-16 02:18:04       17 阅读
  5. UDP传输文件和FTP传输文件

    2024-07-16 02:18:04       20 阅读
  6. flutter Android端权限

    2024-07-16 02:18:04       19 阅读
  7. .NET在工控上位机开发中有哪些成功的案例?

    2024-07-16 02:18:04       22 阅读
  8. 最短路之朴素版的dij板子

    2024-07-16 02:18:04       18 阅读
  9. c++ 生成随机字符串

    2024-07-16 02:18:04       21 阅读
  10. 顺序表(C语言)

    2024-07-16 02:18:04       18 阅读
  11. 堆、栈和队列(数据结构)

    2024-07-16 02:18:04       21 阅读
  12. 跨越空间的编码:在PyCharm中高效使用远程解释器

    2024-07-16 02:18:04       18 阅读