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;
}