1 基本介绍
Redis是一个基于 内存 的 key-value 结构数据库
- 基于内存存储,读写性能高
 - 适合存储热点数据(热点商品、资讯、新闻)
 - 企业应用广泛
 

运行
在cmd下
redis-server.exe redis.windows.conf 

启动状态下,再
redis-cli.exe 

测试:
![]()
也可以
redis-cli.exe -h localhost -p 6379 
 
在配置文件设置密码

![]()
(4位密码不行)
改为6位
![]()
然后
![]()

发现已经需要密码
需要![]()
简化:安装管理客户端(但是需要先启动redis)

2 常用命令
2.1 数据类型
Redis 存储的是 key-value 结构的数据,其中 key 是 字符串类型,value 有 5 种常用的数据类型:
- 字符串 string
 - 哈希 hash
 - 列表 list
 - 集合 set
 - 有序集合 sorted set/zset
 
 2.1 字符串 操作命令
 
- SET key value 设置指定 key 的值
 
- GET key 获取指定 key 的值
 
- SETEX key seconds value 设置指定 key 的值,并将 key 的过期时间设为 seconds 秒,比 如存储验证码(存在 5 min)
 - SETNX key value 只有在 key 不存在时设置 key 的值
 
NX:No eXist

2.2 哈希 操作命令
Redis hash 是一个 string 类型的 field 和 value 的映射表
用来存储 对象
- HSET key field value 将哈希表 key 中的字段 field 的值设为 value
 
- HGET key field 获取存储在哈希表中指定字段的值
 
- HDEL key field 删除存储在哈希表中的指定字段
 
- HKEYS key 获取哈希表中所有字段
 
- HVALS key 获取哈希表中所有值
 

存储员工对象

2.3 列表 操作命令
Redis 列表是简单的字符串列表,按照插入顺序排序
- LPUSH key value1 [value2] 将一个或多个值插入到列表 头部
 
- LRANGE key start stop 获取列表指定范围内的元素
 
- RPOP key 移除并获取列表最后一个元素
 
- LLEN key 获取列表长度
 
2.4 集合 操作命令
Redis set 是 string 类型的无序集合。集合成员是唯一的,集合中不能出现重复的数据
- SADD key member1 [member2] 向集合添加一个或多个成员
 - SMEMBERS key 返回集合中的所有成员
 - SCARD key 获取集合的成员数
 
Cardinality 基数
- SINTER key1 [key2] 返回给定所有集合的 交集
 
Intersection 交接(点或线),相交;交汇点(尤指道路);(动作)交接,交叉
- SUNION key1 [key2] 返回给定所有集合的 并集
 - SREM key member1 [member2] 删除集合中一个或多个成员
 
2.5 有序集合 操作命令
Redis 有序集合是 string 类型元素的集合,且不允许有重复成员。每个元素都会关联一个 double 类型的 分数
- ZADD key score1 member1 [score2 member2] 向有序集合添加一个或多个成员
 - ZRANGE key start stop [WITHSCORES] 通过索引区间返回有序集合中指定区间内的成员
 - ZINCRBY key increment member 有序集合中对指定成员的分数加上增量 increment
 
increment 增量
- ZREM key member [member...] 移除有序集合中的一个或多个成员
 
2.6 通用命令
- KEYS pattern 查找所有符合给定模式(pattern)的 key
 
模式字符串可以包含以下特殊字符:
*:匹配任意数量的任意字符?:匹配任意单个字符[...]:匹配方括号内的任意单个字符(范围)例如,要查找所有以 "user:" 开头的键,可以使用以下命令:
KEYS user:*
- EXISTS key 检查给定 key 是否存在
 - TYPE key 返回 key 所储存的值的类型
 - DEL key 该命令用于在 key 存在时删除 key
 
3 在 Java 中操作 Redis
Redis 的 Java 客户端很多,常用的几种:
- Jedis
 - Lettuce
 - Spring Data Redis
 
Spring Data Redis 使用方式
第一步 引入 Maven 依赖
pom.xml
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency> 
第二步 配置 Redis 数据源
application.yml
当前在 0 号数据库(DB)
默认是 0,可以不配置

spring:
  redis:
    host: localhost
    port: 6379
    password: 123456
    database: 0 
 
第三步 编写配置类,创建 RedisTemplate 对象
Template 模板

序列化器(Serializer)是一个将对象转换为某种特定格式的过程,以便能够将对象存储或传输的工具。相应的,反序列化器(Deserializer)则是将这种特定格式的数据重新转换为对象的过程。序列化器和反序列化器在分布式系统、网络通信、持久化存储等领域非常常见,特别是在像 Redis 这样的内存数据库中
RedisConnectionFactory是用于创建 Redis 连接的工厂,它抽象了连接 Redis 服务器的细节
第四步 通过 RedisTemplate 对象操作 Redis
3.1 测试

3.2 字符串数据



3.3 哈希数据
在配置类设置一下序列化器


3.4 列表数据

3.5 集合数据

3.6 有序集合数据

3.7 通用命令

4 店铺营业状态设置
4.1 设计


设置营业状态 接口

管理端查询营业状态 接口

用户端查询营业状态 接口
Path:/user/shop/status
Method:GET
对于“营业状态”这个值,使用 redis 进行存储
| KEY | VALUE | 
| SHOP_STATUS | 1 | 
4.2 实现
直接使用 redis


用户端
为了防止Bean冲突,在注解 @RestController 后面加上别名
(在 客户端 和 用户端 都要加)

4.3 测试


这里,在配置类下,不要对value进行string的序列化,否则会报错
package com.sky.config;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;
@Configuration
@Slf4j
public class RedisConfiguration {
    @Bean
    public RedisTemplate redisTemplate(RedisConnectionFactory redisConnectionFactory) {
        log.info("开始创建redis模板类");
//        RedisTemplate redisTemplate = new RedisTemplate();
//        redisTemplate.setConnectionFactory(redisConnectionFactory);
//
        redisTemplate.setKeySerializer(new StringRedisSerializer());
//
//        return redisTemplate;
        RedisTemplate redisTemplate = new RedisTemplate<>();
        redisTemplate.setConnectionFactory(redisConnectionFactory);
        // 设置Key的序列化器为String
        redisTemplate.setKeySerializer(new StringRedisSerializer());
        // 设置Value的序列化器为String
        redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer());
//        // 设置Hash Key的序列化器为String
//        redisTemplate.setHashKeySerializer(new StringRedisSerializer());
//
//        // 设置Hash Value的序列化器为String
//        redisTemplate.setHashValueSerializer(new StringRedisSerializer());
        return redisTemplate;
    }
}
 
 
5 修改一下 knife4j 接口文档

改为:
注意包名
/**
     * 通过 knife4j 生成接口文档
     *
     * @return
     */
    @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;
    }
    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;
    } 





















