黑马苍穹外卖学习Day5

文章目录

  • Redis学习
    • Redis简介
    • 准备工作
    • Redis常用数据类型介绍
    • 各数据类型的特点
    • Redis常用命令
      • 字符串操作命令
      • 哈希操作命令
      • 列表操作命令
      • 集合操作命令
      • 有序集合操作命令
      • 通用操作命令
    • 在Java中操作Redis
      • 导入Spring Data Redis坐标
      • 配置Redis数据源
      • 编写配置类,创建RedisTemplate对象
      • 通过RedisTemplate对象操作Redis
  • 店铺营业状态设置
    • 产品需求分析
    • 设置营业状态
    • 代码实现

Redis学习

Redis简介

Redis是一个基于内存的key-value 结构数据库。

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

准备工作

启动redis并与本地服务器连接
双击redis-server.exe文件,之后可以双击redis-cli.exe或redis-cli.exe -h localhost -p 6379与本地服务器连接

下载Another Redis作为图形化工具使用

Redis常用数据类型介绍

黑马苍穹外卖学习Day5_第1张图片

各数据类型的特点

黑马苍穹外卖学习Day5_第2张图片

Redis常用命令

字符串操作命令

黑马苍穹外卖学习Day5_第3张图片
在redis中设置一个指定的key值
黑马苍穹外卖学习Day5_第4张图片
黑马苍穹外卖学习Day5_第5张图片
黑马苍穹外卖学习Day5_第6张图片
设置一个key值以及过期时间
黑马苍穹外卖学习Day5_第7张图片
到时会自动删除key
黑马苍穹外卖学习Day5_第8张图片
只有在key不存在时才可以赋值
黑马苍穹外卖学习Day5_第9张图片
黑马苍穹外卖学习Day5_第10张图片

哈希操作命令

黑马苍穹外卖学习Day5_第11张图片
黑马苍穹外卖学习Day5_第12张图片
黑马苍穹外卖学习Day5_第13张图片
在这里插入图片描述黑马苍穹外卖学习Day5_第14张图片
在这里插入图片描述
黑马苍穹外卖学习Day5_第15张图片
在这里插入图片描述
在这里插入图片描述

列表操作命令

LPUSH可形象类比为头插法
黑马苍穹外卖学习Day5_第16张图片在这里插入图片描述
黑马苍穹外卖学习Day5_第17张图片
黑马苍穹外卖学习Day5_第18张图片
删除队尾的值
在这里插入图片描述
黑马苍穹外卖学习Day5_第19张图片

集合操作命令

黑马苍穹外卖学习Day5_第20张图片
黑马苍穹外卖学习Day5_第21张图片

黑马苍穹外卖学习Day5_第22张图片
黑马苍穹外卖学习Day5_第23张图片
在这里插入图片描述在这里插入图片描述
黑马苍穹外卖学习Day5_第24张图片
黑马苍穹外卖学习Day5_第25张图片
在这里插入图片描述

黑马苍穹外卖学习Day5_第26张图片

有序集合操作命令

黑马苍穹外卖学习Day5_第27张图片
黑马苍穹外卖学习Day5_第28张图片
黑马苍穹外卖学习Day5_第29张图片
黑马苍穹外卖学习Day5_第30张图片
黑马苍穹外卖学习Day5_第31张图片
在这里插入图片描述
黑马苍穹外卖学习Day5_第32张图片
黑马苍穹外卖学习Day5_第33张图片

通用操作命令

黑马苍穹外卖学习Day5_第34张图片
黑马苍穹外卖学习Day5_第35张图片
黑马苍穹外卖学习Day5_第36张图片
黑马苍穹外卖学习Day5_第37张图片
黑马苍穹外卖学习Day5_第38张图片
黑马苍穹外卖学习Day5_第39张图片

在Java中操作Redis

黑马苍穹外卖学习Day5_第40张图片

导入Spring Data Redis坐标

POM文件中导入

        <dependency>
            <groupId>org.springframework.bootgroupId>
            <artifactId>spring-boot-starter-data-redisartifactId>
        dependency>

配置Redis数据源

application.yml中配置,在spring下面添加。dev中填写真正的数据类

  redis:
    host: ${sky.redis.host}
    port: ${sky.redis.port}
    database: ${sky.redis.database}

编写配置类,创建RedisTemplate对象

在config类中新建对象

package com.sky.config;
@Configuration
@Slf4j

public class RedisConfiguration {
    @Bean
    public RedisTemplate redisTemplate(RedisConnectionFactory redisConnectionFactory){
        RedisTemplate redisTemplate = new RedisTemplate();
        //设置Redis的连接工厂对象
        redisTemplate.setConnectionFactory(redisConnectionFactory);
        //设置Redis中key的序列化器
        redisTemplate.setKeySerializer(new StringRedisSerializer());
        return redisTemplate;
    }
}

在上述的 Redis 配置代码中,redisTemplate.setKeySerializer(new StringRedisSerializer()); 设置了 Redis 中 key 的序列化器为 StringRedisSerializer。这是因为 Redis 的 key 通常是字符串,为了方便人类阅读和理解,使用字符串的序列化器将 key 转换为字符串形式存储在 Redis 中。

使用适当的序列化器对于在分布式系统中传输和存储对象是非常重要的。它确保了对象能够以可靠的方式被转换为字节流,并且在反序列化时能够正确还原。选择合适的序列化器也可以影响性能,因为不同的序列化方式有不同的效率和序列化大小。

通过RedisTemplate对象操作Redis

新建测试类进行测试

package com.sky.test;

import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.redis.core.*;

import java.util.List;
import java.util.Set;
import java.util.concurrent.TimeUnit;

@SpringBootTest
public class SpringDataRedisTest {
    @Autowired
    private RedisTemplate redisTemplate;
    @Test
    public void testRdisTemplate(){
        System.out.println(redisTemplate);
        //操作字符串
        ValueOperations valueOperations = redisTemplate.opsForValue();
        //操作哈希
        HashOperations hashOperations = redisTemplate.opsForHash();
        ListOperations listOperations = redisTemplate.opsForList();
        SetOperations setOperations = redisTemplate.opsForSet();
        ZSetOperations zSetOperations = redisTemplate.opsForZSet();
    }

    /**
     * 操作字符串数据
     */
    @Test
    public void testString(){
        //set get setex setnx
        redisTemplate.opsForValue().set("city", "boy");
        String city = (String)redisTemplate.opsForValue().get("city");
        System.out.println(city);
        redisTemplate.opsForValue().set("code", "123456", 3, TimeUnit.MINUTES);
        redisTemplate.opsForValue().setIfAbsent("lock", "1");
        redisTemplate.opsForValue().setIfAbsent("lock", "2");

    }

    /**
     * 操作哈希的数据
     */
    @Test
    public void testHash(){
        //Hset hget hdel hkeys hvals
        HashOperations hashOperations = redisTemplate.opsForHash();
        hashOperations.put("100", "name", "jimmy");
        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");
    }

    /**
     * 操作列表数据
     */
    @Test
    public void testList(){
        //lpush lrange rpop llen
        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);
    }
    /**
     * 集合类型操作
     */
    public void testSet(){
        //sadd smembers scard sinter srem
        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);
        Long size = setOperations.size("set1");
        System.out.println(size);
        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");

    }
}

店铺营业状态设置

产品需求分析

黑马苍穹外卖学习Day5_第41张图片
黑马苍穹外卖学习Day5_第42张图片

设置营业状态

黑马苍穹外卖学习Day5_第43张图片
黑马苍穹外卖学习Day5_第44张图片
黑马苍穹外卖学习Day5_第45张图片

代码实现

首先了解一下
@PutMapping、@PostMapping、@GetMapping 分别对应不同的 CRUD

@PutMapping: 对应于更新操作(Update)。通常用于修改已存在的资源。在 RESTful 风格的 API 中,对应于 HTTP PUT 请求。
@PostMapping: 对应于创建操作(Create)。通常用于新建资源。在 RESTful 风格的 API 中,对应于 HTTP POST 请求。
@GetMapping: 对应于读取操作(Read)。通常用于获取已存在的资源。在 RESTful 风格的 API 中,对应于 HTTP GET 请求。

新建两个Controller,通过@RestController后加的值做区分。

package com.sky.controller.admin;

import com.sky.result.Result;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.web.bind.annotation.*;

@RestController("adminShopController")
@RequestMapping("/admin/shop")
@Api(tags = "店铺相关接口")
@Slf4j
public class ShopController {
    @Autowired
    private RedisTemplate redisTemplate;
    public static final String KEY = "SHOP_STATUS";
    /**
     * 设置店铺营业状态
     * @param status
     * @return
     */
    @PutMapping("/{status}")
    @ApiOperation("设置店铺营业状态")
    public Result setStatus(@PathVariable Integer status){
        redisTemplate.opsForValue().set(KEY, status);
        return Result.success();
    }

    /**
     * 获取店铺营业状态
     * @return
     */
    @GetMapping("/{status}")
    @ApiOperation("获取店铺营业状态")
    public Result<Integer> getStatus(){
        Integer status = (Integer) redisTemplate.opsForValue().get(KEY);
        return Result.success(status);
    }
}

package com.sky.controller.user;

import com.sky.result.Result;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController("userShopController")
@RequestMapping("/user/shop")
@Api(tags = "店铺相关接口")
@Slf4j
public class ShopController {
    @Autowired
    private RedisTemplate redisTemplate;
    public static final String KEY = "SHOP_STATUS";
    /**
     * 获取店铺营业状态
     * @return
     */
    @GetMapping("/{status}")
    @ApiOperation("获取店铺营业状态")
    public Result<Integer> getStatus(){
        Integer status = (Integer) redisTemplate.opsForValue().get(KEY);
        return Result.success(status);
    }
}

你可能感兴趣的:(Java,bootstrap,java,spring,spring,boot,redis)