苍穹外卖项目日记(day05)
苍穹外卖|项目日记(day05)
前言: 一口气把几天的代码都给完成了, 所以更新有点慢, 现在来补上.
今日收获:
1.redis的基本使用
2.在java和项目中使用
一. redis的基本使用
基本特性
- 内存存储:数据主要存储在内存中,提供极高的读写性能
- 持久化:支持 RDB(快照)和 AOF(追加日志)两种持久化方式
- 数据结构丰富:不仅仅是简单的键值存储,支持多种数据结构
- 单线程模型:采用单线程处理命令,避免锁竞争
- 高可用:通过 Redis Sentinel 和 Redis Cluster 支持高可用和分布式
支持的数据结构
- 字符串(Strings):最基本的数据类型,可以存储文本或二进制数据
- 哈希(Hashes):键值对的集合,适合存储对象
- 列表(Lists):有序的字符串集合,支持从两端插入/删除
- 集合(Sets):无序的唯一字符串集合
- 有序集合(Sorted Sets):带分数的集合,按分数排序
因使用方法大体相同, 就只展示字符串的基本使用
# Redis 字符串(String)基础命令速查## 1. 基本设置与获取
SET key value # 设置键值对
GET key # 获取键对应的值
GETSET key new_value # 设置新值并返回旧值
MSET key1 val1 key2 val2 # 批量设置多个键值
MGET key1 key2 # 批量获取多个键的值
二.在java和项目中使用
在项目中, 将店铺的状态(是否营业的值)缓存在redis中, 原因: 营业中: 1, 休息中: 0. 为这么一个数据单独设置一张表太浪费了.
1.导入Spring Data Redis的maven坐标
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
2.配置Redis数据源
// 生成环境中
sky:redis:host: localhostport: 6379password: 123456database: 10
// 基础环境中
spring:profiles:active: devredis:host: ${sky.redis.host}port: ${sky.redis.port}password: ${sky.redis.password}database: ${sky.redis.database}
3.编写配置类,创建RedisTemplate对象
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.StringRedisSerializer;@Configuration
@Slf4j
public class RedisConfiguration {@Beanpublic RedisTemplate redisTemplate(RedisConnectionFactory redisConnectionFactory){log.info("开始创建redis模板对象...");RedisTemplate redisTemplate = new RedisTemplate();//设置redis的连接工厂对象redisTemplate.setConnectionFactory(redisConnectionFactory);//设置redis key的序列化器redisTemplate.setKeySerializer(new StringRedisSerializer());return redisTemplate;}
}
4.通过RedisTemplate对象操作Redis
/*** 操作字符串类型的数据*/@Testpublic void testString(){// set get setex setnxredisTemplate.opsForValue().set("name","小明");String city = (String) redisTemplate.opsForValue().get("name");System.out.println(city);redisTemplate.opsForValue().set("code","1234",3, TimeUnit.MINUTES);redisTemplate.opsForValue().setIfAbsent("lock","1");redisTemplate.opsForValue().setIfAbsent("lock","2");}
5.店铺营业状态设置
/*** 设置店铺的营业状态* @param status* @return*/@PutMapping("/{status}")@ApiOperation("设置店铺的营业状态")public Result setStatus(@PathVariable Integer status){log.info("设置店铺的营业状态为:{}",status == 1 ? "营业中" : "打烊中");redisTemplate.opsForValue().set(KEY,status);return Result.success();}
/*** 获取店铺的营业状态* @return*/@GetMapping("/status")@ApiOperation("获取店铺的营业状态")public Result<Integer> getStatus(){Integer status = (Integer) redisTemplate.opsForValue().get(KEY);log.info("获取到店铺的营业状态为:{}",status == 1 ? "营业中" : "打烊中");return Result.success(status);}