前言

本篇文章是学习B站黑马程序员苍穹外卖的学习笔记📑。我的学习路线是Java基础语法-JavaWeb-做项目,登录功能结束后,就进入复杂功能的开发,虽然这些功能和我之前学习JavaWeb管理系统的差不多,但很多功能还是有增进,其中涉及到了Redis(这里我也是刚学,学的比较少,实现的功能也简单🤪)

📚Redis基本概念

Redis 是一个开源的、基于内存的数据结构存储系统,它可以用作数据库(这个和Mysql差不多,存储的信息少些)、缓存和消息中间件。(🙌可以把它理解成一个“超级快的临时记事本”。它把数据存在内存里,所以读写速度非常快,常用于做缓存、排行榜,验证码存储等需要快速访问的场景。)

🌟Redis的存储

Redis存储是Key-value结构的数据,其中key是字符串类型,value有5中常用的数据类型

  1. 字符串(String):就是普通字符串,(比如:用户登录后的 token、用户的昵称、访问次数(计数器)等)。
  2. 哈希(Hash):类似于对象,适合保存一个用户的多个信息(类似于Java中的HashMap结构,(比如:保存用户的信息(id、姓名、年龄等)在一个 key 里)。
  3. 列表(List):就是一个有序的字符串集合,可以在头尾添加/删除,(比如:消息队列、最近浏览记录)。
  4. 集合(Set):不重复的字符串集合,没有顺序,(抽奖活动中的唯一中奖用户、标签系统)。
  5. 有序集合(Sorted Set / ZSet):带分数排序的集合,可以按分数排名,(比如:游戏排行榜、热度榜单)。

我在黑马程序员讲义里截了张图,会更有助于理解这几种数据类型的存储结构

在这里插入图片描述

🔍Redis常用命令(注:不区分大小写)

Redis 字符串类型常用命令:

SET key value 设置指定key的值

Get Key 获取指定key的值

SETEX key seconds value 设置key的值,并把时间设置为seconds秒

SETNX key value key 不存在时设置key的值

Redis 哈希操作命令:

HASET key field value 将哈希表key 中的字段field的值设为value

HGET key field 获取存储在哈希表中指定字段的值

HGET key field 删除存储在哈希表中指定字段

HKEYS key 获取哈希表中所有字段

HVALS key 获取哈希表中所有值

Redis 列表操作命令:

LPUSH key value1 [value2] 将一个或多个值插入到列表头部

LRANGE key start stop 获取列表指定范围内的元素

RPOP key 移除并获取列表最后一个元素

LLEN key 获取列表长度

Redis集合操作命令

SADD key member1 [member2] 向集合添加一个或者多个成员

SMENMBER key 返回集合中的所有成员

SCARD key 获取集合的成员数

SINTER key1 [key2] 返回给定所有集合的交集

SUNION key1 [key2] 返回所有给定集合的并集

SREM key member1 [member2] 删除集合中一个或多个成员

Redis有序集合操作命令

ZADD key score1 member1 [score2 member2] 向有序集合添加一个或多个成员

ZRANGE key start stop [WITHSCORES] 通过索引区间返回有序集合中指定区间内的成员

ZINCRBY key increment member 有序集合中对指定成员分数加上增量 increment

ZREM key member [member …] 移除有序集合中的一个或多个成员

Redis的通用命令:

KEYS pattern 查找所有符合给定模式的key

EXISTS key 检查给定key 是否存在

TYPE key 返回key所储存的值的类型

DEL key 该命令用于在key存在时删除key

✨后面我们的项目都是用Java写的,通过一个Java测试类,来看这些语句转成Java中怎么配置使用的(功能都是一样的,都是将数据储存在Redis中):

@SpringBootTest
public class SpringDataRedisTest {

    @Autowired
    private RedisTemplate redisTemplate;

    @Test
    public void testRedisTemplate() {
        System.out.println(redisTemplate);
        ValueOperations valueOperations = redisTemplate.opsForValue();
        HashOperations hashOperations = redisTemplate.opsForHash();
        ListOperations listOperations =redisTemplate.opsForList();
        SetOperations setOperations = redisTemplate.opsForSet();
        ZSetOperations zSetOperations = redisTemplate.opsForZSet();

    }
    /**
     * 操作字符串类型的数据
     */

    @Test
    public void testString() {
        // set get setex setnx
        redisTemplate.opsForValue().set("city", "北京");
        String city = (String) redisTemplate.opsForValue().get("city");
        System.out.println(city);
        redisTemplate.opsForValue().set("code", "1234", 3, TimeUnit.MINUTES);
        redisTemplate.opsForValue().setIfAbsent("lock", "1");
        redisTemplate.opsForValue().setIfAbsent("lock", "2");

    }
}

将代码运行,通过Redis图形化界面,可以清楚的看到数据在Redis中的存储状态

在这里插入图片描述

🙌在Java中使用Spring Data Redistribution

操作步骤:

  1. 导入Spring Data Redis 的maven坐标
  2. 配置Redis数据源
  3. 编写配置类,创建RedisTemplate对象
  4. 通过Redis Template对象操作Redis

这里就不一点点列代码说了,直接看Redis在苍穹外卖项目中的使用🧐:
首先来根据前端来看看具体要实现的功能(营业状态只有两种(营业和打样)存储的内容较少因此不用数据库Mysql存储):
在这里插入图片描述
在这里插入图片描述

✅来看后端代码:

  1. 先来配置Redis数据源(application-dev.yml)
  redis:
    host: localhost
    port: 6379
    password: 123456
    database: 0

  1. 编写配置类,创建RedisTemplate对象
package com.sky.config;

....
@Configuration
@Slf4j
public class RedisConfiguration {

    @Bean
    public RedisTemplate redisTemplate(RedisConnectionFactory redisConnectionFactory){
        log.info("开始创建RedisTemplate对象...");


        RedisTemplate redisTemplate = new RedisTemplate();
        //设置Redis连接工厂对象
        redisTemplate.setConnectionFactory(redisConnectionFactory);
        //设置Redis key的序列化器
        redisTemplate.setKeySerializer(new StringRedisSerializer());
        return redisTemplate;


    }
}

  1. 最后配置好,就可以使用了
package com.sky.controller.admin;

...
@RestController("adminShopController")
@RequestMapping("/admin/shop")
@Api(tags = "店铺相关接口")
@Slf4j
public class ShopController {

    public static final String KEY = "SHOP_STATUS";

    @Autowired
    private RedisTemplate redisTemplate;
    /**
     * 设置营业状态
     * @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);
    }

}

小白啊!!!写的不好轻喷啊🤯如果觉得写的不好,点个赞吧🤪(批评是我写作的动力)

…。。。。。。。。。。。…请添加图片描述…。。。。。。。。。。。…

Logo

中国智能体开发者社区,聚焦智能体与大模型开发,提供前沿资讯、实用工具链、开源项目及行业案例。通过技术沙龙、开发者大赛等活动,促进经验交流与协作,助力开发者快速构建创新智能应用。

更多推荐