P49 课程介绍
Redis入门
P50 redis
一个基于内存的key-value结构数据库。(mysql基于磁盘存储,二维表存储)redis是键值对形式。
基于内存存储,读写性能高。一般适合存储热点数据,热点商品、资讯、新闻等。
我的安装在D盘,版本为Redis_x64_5.0.14.1。
启动redis的操作:
-
进入redis的安装目录,
-
redis-server.exe redis.windows.conf
,默认端口号6379
-
连接redis服务,
redis-cli.exe
,默认连接本地的redis。连接其他的redisredis-cli.exe -h ip地址 -p 端口号 -a 有密码就输入密码
-
redis配置文件中默认没有配置密码,修改配置文件redis.window.conf
- 在文件中找到requirepass foobared,设置密码配置,取消注释,foobared就是自己需要修改的密码,保存重启redis就可以了
可以使用redis的图形界面,例如Another-Redis-Desktop-Manager
P51 Redis常用数据类型
Redis中存储的是key-value的数据,其中key是字符串类型,value有5种常用类型:
-
字符串string
-
哈希hash,类似java中的hashmap结构,适合存储对象
-
列表list,带有顺序,按照插入顺序排序,可以有重复元素,类似java的LinkedList,适合存储有顺序有关的
-
集合set,无序的,没有重复元素,类似java中的hashset
-
有序集合sorted set/ zset,集合中每个元素会关联一个分数,根据分数升序排序,没有重复元素
P52 redis常用命令-Redis字符串类型常用命令
不同数据类型有独特的命令,也有通用命令
Redis字符串类型常用命令:
-
SET key value
设置键值 -
GET key
获取指定key的值 -
SETEX key seconds value
,seconds为秒数,应用场景短信验证码 -
SETNX key value
,只有在key不存在时设置key的值,存在则不进行设置。典型应用场景分布式锁
P53 redis常用命令-哈希操作命令
-
HSET key field value
-
HGET key field
-
HDEL key field
,删除 -
HKEYS key
-
HVALS key
P54 redis常用命令-列表操作命令
Redis列表是简单的字符串列表,按照插入顺序排序,常用命令:
-
LPUSH key value1 [value2]
,插入数据,从左侧插入,右侧移除 -
LRANGE key start stop
-
RPOP key
移除并获取列表最后一个元素 -
LLEN key
P55 redis常用命令-集合操作命令
无序,无重复,
-
SADD key member1[member2]
-
SMEMBERS key
,返回集合中所有成员 -
SCARD key
获取集合中的成员数 -
SINTER key1 [key2]
返回给定集合的交集 -
SUNION key1 [key2]
返回并集 -
SREM key member1 [member2]
P56 redis常用命令-有序集合操作命令
有序,不重复,每个元素会关联一个double类型的分数
-
ZADD key score1 member1 [score2 member2]
-
ZRANGE key start stop [WITHSCORES]
-
ZINCRBY key increment member
对分数加上增量 -
ZREM key member [member]
移除
P57 redis通用命令
不分数据类型
-
KEYS patter
-
EXISTS key
检查key是否存在 -
TYPE key
-
DEL key
在java中操作Redis
P58 Redis的java客户端
常见的:
-
Jedis
-
Lettuce
-
Spring data Redis,spring的一部分,对redis底层开发包进行了高度封装,建议使用
spring data redis使用方式:
- 导入坐标
在sky server模块的pom中引入坐标,
Java
<!-- 使用spring data redis-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
- 配置redis数据源
在sky server模块下配置文件中配置,
Java
spring:
redis:
host: localhost
port: 6379
# 如果有密码可以加上密码
# database: 默认创建了16个库,DB0-15,默认就是DB0
可以修改,在yml.dev中使用,然后在yml中引用,
- 编写配置类,RedisTemplate,redis模板对象
Java
@Configuration
@Slf4j
public class RedisConfiguration {
// 引入了spring data redis,会自动将连接工厂放到spring容器中,只需要在下面的方法中声明
@Bean // 注入redis连接工厂
public RedisTemplate redisTemplate(RedisConnectionFactory redistConnectionFactory) {
// 日志
log.info("开始创建redis模板对象");
RedisTemplate redisTemplate = new RedisTemplate();
// 设置redis连接工厂对象
redisTemplate.setConnectionFactory(redistConnectionFactory);
// 设置redis key的序列化器(指定string类型的序列化器,便于图形界面展示)
redisTemplate.setKeySerializer(new StringRedisSerializer());
// 返回对象
return redisTemplate;
}
}
- 通过RedisTemplate对象操作redis
创建对象,示例:
Java
// 操作字符串数据类型
ValueOperations valueOperations = redisTemplate.opsForValue();
// 操作hash类型
HashOperations hashOperations = redisTemplate.opsForHash();
// 操作列表
ListOperations listOperations = redisTemplate.opsForList();
// 操作集合
SetOperations setOperations = redisTemplate.opsForSet();
// 操作有序集合
ZSetOperations zSetOperations = redisTemplate.opsForZSet();
P60 在java中操作Redis-操作字符串类型的数据
示例:
Java
redisTemplate.opsForValue().set("city", "北京");
String city = (String) redisTemplate.opsForValue().get("city");
System.out.println(city);
// setex 对应java操作还是 set,
redisTemplate.opsForValue().set("city", "湖南", 3, TimeUnit.MINUTES); // 表示期限为3分钟
// 设置setnx 对应
// setnx
redisTemplate.opsForValue().setIfAbsent("locked", "1");
java中设置时间期限为:
P61 在java中操作Redis-操作哈希类型的数据
P62 其他类型数据的操作
店铺营业状态设置
P63 需求分析
有查询状态的接口,然后修改状态的接口
营业状态数据存储方式,建议使用基于redis的字符串进行存储。
P64 代码开发
示例:设置和查询操作
Java
@PutMapping("/{status}")
@ApiOperation("管理端设置店铺营业状态")
public Result setStatus(@PathVariable Integer status){
log.info("设置店铺营业状态为:{}", status ==1 ? "1营业中" : "0打烊中");
// 创建redis的string类型
redisTemplate.opsForValue().set("SHOP_STATUS", status);
return Result.success();
}
@GetMapping("/status")
@ApiOperation("获取店铺的营业状态")
public Result getStatus(){
Integer shop_staatus = (Integer) redisTemplate.opsForValue().get("SHOP_STAATUS");
return Result.success(shop_staatus);
}
注意用户端和客户端如果都有查询店铺营业状态的,但是controller都是shopcontroller则会报错,两者冲突,可以在注解@Restcontroller中进行设置,例如:
Java
@RestController("adminShopController")
P65 功能测试
先登录账户,使用管理端设置redis数据库中店铺状态,注意本地运行要启动本地的redis数据库。
如果希望接口文档按照管理端和用户端进行显示,则需要在接口文档的配置中重新编写,例如下述代码,分别扫描用户端和客户端的包,然后设置分组group。
重新启动则可以按照不同类别进行显示了。
Java
@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;
}
@Bean
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;
}