介绍

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

image-20251119111410201

启动

在解压后的文件中打开cmd,输入redis-server.exe redis.windows.conf,或者用bat脚本打开

image-20251119112716376

关闭的话按ctrl + c

连接redis

image-20251119113052595

注意不要把启动界面关闭

image-20251119113711073

密码在redis.windows.conf中搜索pass修改

数据类型

字符串string,哈希hash,列表list,集合set,有序集合zset

image-20251119133409582

常用命令

字符串操作命令

image-20251119134024360

setnx:如果key不存在就会创建,若存在就不会覆盖,而set就会覆盖

哈希操作命令

image-20251119135358597

列表操作命令

image-20251119140247915

集合操作命令

image-20251119140846227

有序集合操作命令

image-20251119143403766

通用命令

image-20251119143437312

Spring Data Redis

操作步骤

image-20251119154507642

application.yml

1
2
3
4
5
6
spring:
redis:
host: localhost
port: 6379
password: 123456
database: 0(自行选择数据库)

配置类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
@Configuration
@Slf4j
public class RedisConfiguration {
@Bean
public RedisTemplate redisTemplate( redisConnectionFactory) {
//RedisConnectionFactory是SpringBoot自动创建的,我们不需要创建
//是当SpringBoot启动时,查询到application.yml中
//有redis就会创建
log.info("开始创建Redis分布式锁的配置");

//RedisTemplate:Spring提供的Redis操作模板类
RedisTemplate redisTemplate = new RedisTemplate();
//设置redis的连接工厂对象
// 有这行代码后:
//template知道该从哪个连接工厂获取Redis连接
redisTemplate.setConnectionFactory(redisConnectionFactory);

//设置redis的key的序列化器
//把Java字符串转换为UTF-8字节数组
redisTemplate.setKeySerializer(new StringRedisSerializer());
return redisTemplate;
}
}

RedisConnectionFactory:

提供所需信息,如同电力公司(发电、输电)

RedisTemplate:

完成各种业务,如同家用电器(电灯、电视、冰箱)

业务层:

用Autowired获取并使用,如同住户(直接使用电器,不关心发电)

其中@Bean

Bean = 对象生命周期管理 + 依赖注入 + 复杂流程封装

配置类中复杂的流程→ @Bean方法打包 → 返回成品对象 → @Autowired获取使用

字符串

SET key value opsForValue().set(key, value) 基本设置
SETEX key seconds value opsForValue().set(key, value, Duration) 设置带过期时间
SETNX key value opsForValue().setIfAbsent(key, value) 键不存在时设置
GET key opsForValue().get(key) 获取值

哈希

HSET key field value opsForHash().put(key, field, value) 将哈希表key中的字段field的值设为value
HGET key field opsForHash().get(key, field) 获取存储在哈希表中指定字段的值
HDEL key field opsForHash().delete(key, field) 删除存储在哈希表中的指定字段
HKEYS key opsForHash().keys(key) 获取哈希表中所有字段
HVALS key opsForHash().values(key) 获取哈希表中所有值

列表

LPUSH key value1 [value2] opsForList().leftPush(key, value) 将一个或多个值插入到列表头部
LRANGE key start stop opsForList().range(key, start, end) 获取列表指定范围内的元素
RPOP key opsForList().rightPop(key) 移除并获取列表最后一个元素
LLEN key opsForList().size(key) 获取列表长度

集合

SADD key member1 [member2] opsForSet().add(key, member1, member2, ...) 向集合添加一个或多个成员
SMEMBERS key opsForSet().members(key) 返回集合中的所有成员
SCARD key opsForSet().size(key) 获取集合的成员数
SINTER key1 [key2] opsForSet().intersect(key1, key2) 返回给定所有集合的交集
SUNION key1 [key2] opsForSet().union(key1, key2) 返回所有给定集合的并集
SREM key member1 [member2] opsForSet().remove(key, member1, member2, ...) 删除集合中一个或多个成员

有序集合

ZADD key score1 member1 opsForZSet().add(key, member, score) 向有序集合添加成员,或更新已有成员分数
ZRANGE key start stop opsForZSet().range(key, start, end) 通过索引区间返回有序集合的成员
ZINCRBY key increment member opsForZSet().incrementScore(key, member, delta) 为有序集合成员的分数增加增量
ZREM key member opsForZSet().remove(key, member) 移除有序集合中的一个或多个成员

通用

KEYS pattern keys(pattern) 查找所有符合给定模式的key
EXISTS key hasKey(key) 检查给定key是否存在
TYPE key type(key) 返回key所储存的值的类型
DEL key delete(key) 在key存在时删除key

店铺营业状态

接口设计

  • 设置营业状态
  • 管理端查询营业状态
  • 用户端查询营业状态

之所以分开是因为刚开始有约定

管理端用/admin,用户端用/user

营业状态因为内容简单,就不多建一个数据库了,直接通过redis存储就行

用户端

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
@RestController
@Slf4j
@RequestMapping("/user/shop")
public class ShopUserController {

@Autowired
private RedisTemplate redisTemplate;

//设置店铺营业状态

//查询店铺营业状态
@RequestMapping("/status")
public Result<Integer> getStatus() {
Integer shopStatus = (Integer) redisTemplate.opsForValue().get("SHOP_STATUS");
log.info("查询营业状态:{}", shopStatus == 1 ? "营业中" : "打烊中");
return Result.success(shopStatus);
}

商家端

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
@RestController
@Slf4j
@RequestMapping("/admin/shop")
public class ShopController {

@Autowired
private RedisTemplate redisTemplate;

//设置店铺营业状态
@PutMapping("/{status}")
public Result setStatus(@PathVariable Integer status) {
log.info("设置营业状态:{}", status == 1 ? "营业中" : "打烊中");
redisTemplate.opsForValue().set("SHOP_STATUS", status);
return Result.success();
}
//查询店铺营业状态
@RequestMapping("/status")
public Result<Integer> getStatus() {
Integer shopStatus = (Integer) redisTemplate.opsForValue().get("SHOP_STATUS");
log.info("查询营业状态:{}", shopStatus == 1 ? "营业中" : "打烊中");
return Result.success(shopStatus);
}
}