JavaWeb(苍穹外卖)--学习笔记09(Redis)
前言
本篇文章是学习B站黑马程序员苍穹外卖的学习笔记📑。我的学习路线是Java基础语法-JavaWeb-做项目,登录功能结束后,就进入复杂功能的开发,虽然这些功能和我之前学习JavaWeb管理系统的差不多,但很多功能还是有增进,其中涉及到了Redis(这里我也是刚学,学的比较少,实现的功能也简单🤪)
📚Redis基本概念
Redis 是一个开源的、基于内存的数据结构存储系统,它可以用作数据库(这个和Mysql差不多,存储的信息少些)、缓存和消息中间件。(🙌可以把它理解成一个“超级快的临时记事本”。它把数据存在内存里,所以读写速度非常快,常用于做缓存、排行榜,验证码存储等需要快速访问的场景。)
🌟Redis的存储
Redis存储是Key-value结构的数据,其中key是字符串类型,value有5中常用的数据类型:
- 字符串(String):就是普通字符串,(比如:用户登录后的 token、用户的昵称、访问次数(计数器)等)。
- 哈希(Hash):类似于对象,适合保存一个用户的多个信息(类似于Java中的HashMap结构,(比如:保存用户的信息(id、姓名、年龄等)在一个 key 里)。
- 列表(List):就是一个有序的字符串集合,可以在头尾添加/删除,(比如:消息队列、最近浏览记录)。
- 集合(Set):不重复的字符串集合,没有顺序,(抽奖活动中的唯一中奖用户、标签系统)。
- 有序集合(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
操作步骤:
- 导入Spring Data Redis 的maven坐标
- 配置Redis数据源
- 编写配置类,创建RedisTemplate对象
- 通过Redis Template对象操作Redis
这里就不一点点列代码说了,直接看Redis在苍穹外卖项目中的使用🧐:
首先来根据前端来看看具体要实现的功能(营业状态只有两种(营业和打样)存储的内容较少因此不用数据库Mysql存储):

✅来看后端代码:
- 先来配置Redis数据源(application-dev.yml)
redis:
host: localhost
port: 6379
password: 123456
database: 0
- 编写配置类,创建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;
}
}
- 最后配置好,就可以使用了
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);
}
}
小白啊!!!写的不好轻喷啊🤯如果觉得写的不好,点个赞吧🤪(批评是我写作的动力)
…。。。。。。。。。。。…
…。。。。。。。。。。。…
更多推荐
所有评论(0)