课程内容

  • Redis入门
  • Redis数据类型
  • Redis常用命令
  • 在Java中操作Redis
  • 店铺营业状态设置

Redis入门

Redis简介

  • 基于内容的key - value结构数据库
  • 基于内存存储 读写性能高
  • 适合存储热点数据(热点商品 咨询 新闻)
  • 互联网技术领域使用最为广泛的存储中间件
  • 中文网站 www.redis.net.cn

下载与安装

如何启动

  • 在安装目录中启动cmd
  • 输入redis-server.exe redis.windows.conf
  • 默认端口号为6379
  • 通过ctrl+c快捷键停止服务
  • 通过residis-cli.exe连接服务
    • 可以通过指定如下参数连接
    • -h ip地址
    • -p 端口号
    • -a 密码
  • 执行keys * 判断服务启动是否成功

修改配置文件

  • 修改redis.windows.conf设置服务密码
  • 找到#requirepass foobared
  • 去掉注释符号 在后面加上自己设置的密码
  • requirepass 123456
  • 修改密码后要重启redis服务才生效
  • 可安装客户端图形工具Another-Redis-Desktop-Manager

Redis数据类型

五种常用数据类型介绍

  • Redis存储的是key-value结构的数据
  • 秋中key是字符串类型
  • value有五种常用的数据类型

字符串string

  • 普通字符串 Redis中最简单的数据类型

哈希hash

  • 也叫散列
  • 类似java中的HashMap结构
  • 每个哈希中包含多个filed和value

列表list

  • 按照插入顺序排序
  • 可以有重复元素
  • 类似java中的LinkedList

集合set

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

有序集合sorted set

  • 集合汇总每个元素关联一个分数score
  • 根据分数升序排序
  • 没有重复元素

Redis常用命令

  • 与mysql完全不同
  • 不同数据类型的操作命令也不同
  • 也存在部分通用命令

字符串操作命令

  • SET key value 设置指定key的值
  • GET key 获取指定key的值
  • SETEX key seconds value 设置指定key的值 并将key的过期时间设为seconds秒
  • SETNX key value 只有key不存在时设置key的值
  • 实际上不区分大小写

哈希操作命令

  • HSET key field value 将哈希表 key 中的字段 field 的值设为 value
  • HGET key field 获取存储在哈希表中指定字段的值
  • HDEL key field 删除存储在哈希表中的指定字段
  • HKEYS key 获取哈希表中所有字段
  • HVALS key 获取哈希表中所有值

列表操作命令

  • LPUSH key value1 [value2] 将一个或多个值插入到列表头部
  • LRANGE key start stop 获取列表指定范围内的元素
  • RPOP key 移除并获取列表最后一个元素
  • LLEN key 获取列表长度
  • BRPOP key1 [key2 ] timeout 移出并获取列表的最后一个元素, 如果列表没有元素会阻塞列表直到等待超 时或发现可弹出元素为止

集合操作命令

  • SADD key member1 [member2] 向集合添加一个或多个成员
  • SMEMBERS key 返回集合中的所有成员
  • SCARD key 获取集合的成员数
  • SINTER key1 [key2] 返回给定所有集合的交集
  • SUNION key1 [key2] 返回所有给定集合的并集
  • SREM key member1 [member2] 移除集合中一个或多个成员

有序集合操作命令

  • ZADD key score1 member1 [score2 member2] 向有序集合添加一个或多个成员
  • ZRANGE key start stop [WITHSCORES] 通过索引区间返回有序集合中指定区间内的成员
  • ZINCRBY key increment member 有序集合中对指定成员的分数加上增量 increment
  • ZREM key member [member …] 移除有序集合中的一个或多个成员

通用命令

  • KEYS pattern 查找所有符合给定模式( pattern)的 key
  • EXISTS key 检查给定 key 是否存在
  • TYPE key 返回 key 所储存的值的类型
  • DEL key 该命令用于在 key 存在是删除 key

在Java中操作Redis

  • Redis的Java客户端
    • 常用的包括
    • Jedis
    • Lettuce
    • Spring Data Redis
  • Spring Data Redis
    • 导入maven坐标
    • 配置Redis数据源
    • 编写配置类 创建RedisTemplate对象
    • 通过RedisTemplate对象操作Redis

配置Redis环境

  • 对应的maven坐标
<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

  • 在application文件中配置数据源
  • 在datasource中添加host port password等数据
redis:  
    host: ${sky.redis.host}  
    port: ${sky.redis.port}  
    password: ${sky.redis.password}  
    database: ${sky.redis.database}
  • 具体数值放在application-dev中
  • database: 指定使用Redis的哪个数据库
  • redis服务启动后默认有16个数据库

编写配置类

  • 创建RedisTemplate对象
  • 在config包里实现
  • 创建RedisConfiguration类
@Slf4j  
@Configuration  
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;  
          
          
    }  
}

店铺营业状态设置

需求分析

  • 点击营业状态按钮时 弹出更改营业状态
  • 选择营业 设置餐厅为营业中状态
  • 选择打烊 设置餐厅为打烊中状态
  • 设置营业状态
  • 管理端查询状态
  • 用户端查询状态
  • 管理端和营业端访问路径不一样 设计两个接口

代码开发

Controller

  • 在sky-sever中 创建ShopController.java
  • 创建setStatus设置营业状态方法
  • 以及查询状态方法
@Slf4j  
@RequestMapping("admin/shop")  
@Api(tags = "店铺相关接口")  
@RestController("adminShopController")  
public class ShopController {  
    public static final  String KEY = "SHOP_STATUS";  
  
    @Autowired  
    private RedisTemplate redisTemplate;  
    /**  
     * 设置店铺的营业状态  
     * @param status  
     * @return  
     */  
    @PutMapping("/{status}")  
    @ApiOperation("设置店铺的营业状态")  
    public Result setStatus(@PathVariable Integer status){  
        log.info("设置店铺的营业状态为:{}",status == 1 ? "营业中" : "打烊中");  
        redisTemplate.opsForValue().set(KEY,status);  
        return Result.success();  
    }  
  
    @GetMapping("/status")  
    @ApiOperation("获取店铺的营业状态")  
    public Result<Integer> getStatus(){  
        Integer shop_status = (Integer) redisTemplate.opsForValue().get(KEY);  
        return  Result.success(shop_status);  
    }  
}
  • 创建controller.user包用户端controller
  • 在该包下创建ShopController
  • 同样创建查询营业状态方法
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.*;

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

    public static final String KEY = "SHOP_STATUS";

    @Autowired
    private RedisTemplate redisTemplate;

    /**
     * 获取店铺的营业状态
     * @return
     */
    @GetMapping("/status")
    @ApiOperation("获取店铺的营业状态")
    public Result<Integer> getStatus(){
        Integer status = (Integer) redisTemplate.opsForValue().get(KEY);
        log.info("获取到店铺的营业状态为:{}",status == 1 ? "营业中" : "打烊中");
        return Result.success(status);
    }
}

想温柔的对待这个世界