前言
本篇文章用于记录苍穹外卖Day05 Redis、店铺状态设置的学习。
Redis
概述
在介绍redis之前,我想先介绍一下NoSQL数据库的概念:
与我们之前认识的SQL数据库基于磁盘存储不同,NoSQL数据库是基于内存存储的。
Redis概念:
Redis:远程字典服务器,是一个基于内存存储的键值型NoSQL数据库。
特征:
-
键值型(key-value),value支持多种不同数据类型,功能丰富
-
单线程,每条命令具有原子性
-
低延迟、速度快(基于内存、IO多路复用、良好的编码)
-
支持数据持久化
-
支持主从集群、分布集群
-
支持多语言客户端
Redis命令
数据类型
Redis是一个key-value的数据库,key一般是String类型,value类型多种多样。
通用命令
通用命令是指所有数据类型都可以使用的指令,常见的有以下:
- KEYS:查看符合模板的所以key(不建议在生产环境设备中使用,效率低)
- DEL key:删除一个指定的key
- EXISTS key:判断key是否存在
- TYPE key:返回key存储的值的类型
- EXPIRE key second:给一个key设置有效期为second,到期自动删除
- TTL key:查看一个key的剩余有效期(失效了返回-2,永久有效返回-1)
可以通过help查看帮助文档,例如我要查看KEYS的具体用法,只需help KEYS
String类型
在本课程中我们只需要了解以下命令即可,更为详细的在专门讲Redis课程中会讲到。
- SET key value 设置key和value的值
- GET key 通过key获取value的值
- SETEX key second value 设置key和value的值同时设置国企时间
- SETNX key value 当key值不存在时设置key和value的值
Hash类型
Hash类型也叫散列,其value是一个无序字典,类似Java中HashMap结构。
Hash数据格式如下所示:
常见命令:
- HSET key field value 添加或修改哈希表中key的field的value
- HGET key field 获取哈希表中key的field的值
- HDEL key field 删除哈希表中key的field的值
- HKEYS key 获取哈希表中所有字段
- HVALS key 获取哈希表中所有值
List类型
List数据格式如下所示:
常见命令:
- LPUSH key value1 value2… 从左侧批量添加数据
- LRANGE key start stop 获取列表指定范围的元素
- RPOP key 从列表右侧删除数据
- LLEN key 返回列表长度
Set类型
Redis的Set结构是String类型的无序集合。集合成员是唯一的,集合中不能出现重复的数据。
其结构如下所示:
常见命令:
- SADD key member1 member2… 批量向集合中添加成员
- SMEMBERS key 返回集合中的所有成员
- SCARD key 获取集合的成员数
- SINTER key1 key2… 返回给定所有集合的交集
- SUINIO key1 key2… 返回给定所有集合的并集
- SREM key member1 member2… 删除给定集合的成员
SortedSet类型
SortedSet中的每个元素都带了一个double类型的score的属性,可以基于score的属性对元素排序,底层的实现是一个跳表(SkipList)加hash表。
其具有以下特性:
- 可排序
- 元素不可重复
- 查询速度快
SortedSet常用于实现排行榜这样的功能。
SortedSet的数据结构如下所示:
常用方法:
-
ZADD key score1 menber1 score2 member2… 向有序集合中添加元素
-
ZRANGE key start stop 通过索引区间返回有序集合指定区间的成员
-
ZINCRBY key increment member 对有序集合指定成员的分数加上增量increment
-
ZREM key member member… 删除有序集合成员
Redis在Java中的使用
在这主要讲解Spring Data Redis在Java中的使用
操作步骤:
- 导入Spring Data Redis的maven坐标
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
- 配置Redis数据源
application.yml
redis:
host: ${sky.redis.host}
port: ${sky.redis.port}
password: ${sky.redis.password}
database: ${sky.redis.database}
application-dev.yml
redis:
host: localhost
port: 6379
password: xxxxxx # 根据你自己redis的密码来填
database: 1 # 指定操作的数据库,一共有16个库,在这里我是操作的1数据库
注意:这里的host是根据你自己的来的,可能不是localhost
- 编写配置类(RedisConfiguration),创建RedisTemplate对象
@Bean
public RedisTemplate redisTemplate(RedisConnectionFactory redisConnectionFactory){
log.info("创建redis模板对象...");
RedisTemplate redisTemplate=new RedisTemplate();
//设置redis的连接工厂对象
redisTemplate.setConnectionFactory(redisConnectionFactory);
//设置redis key的序列化器
redisTemplate.setKeySerializer(new StringRedisSerializer());
//设置redis value的序列化器
redisTemplate.setValueSerializer(new StringRedisSerializer());
return redisTemplate;
}
设置序列化器的作用是将序列化为字节数组的数据以字符串形式显示
- 通过RedisTemplate对象操作Redis
//种数据类型的操作对象
ValueOperations valueOperations=redisTemplate.opsForValue();
valueOperations.set(key,value);
valueOperations.get(key);
HashOperations hashOperations= redisTemplate.opsForHash();
ListOperations listOperations=redisTemplate.opsForList();
SetOperations setOperations= redisTemplate.opsForSet();
ZSetOperations zSetOperations= redisTemplate.opsForZSet();
通常我是以下列方式来操作redis调用操作对象操作redis
private RedisTemplate redisTemplate;
//存数据
redisTemplate.opsForValue().set(KEY,value);
//取数据
redisTemplate.opsForValue().get(KEY);
店铺状态设置
要完成这个功能开发,我们需要存储一个SHOP_STATUS(1表示营业,0表示打烊)来表示店铺的营业状态,只存储一个值,单独创建一张表就显得非常多余,这里我们就可以使用Redis来存储SHOP_STATUS的值
这里涉及到两个接口的开发1.我们要查询当前的店铺状态展示到前端2.完成修改店铺状态的开发。
知道了使用Redis来存储SHOP_STATUS接下来的代码开发就非常简单了,这里就简单说一下过程。首先查询店铺状态我们只需要通过get方法获取到数据库中SHOP_STATUS的值;修改店铺状态只需通过set方法来重新提交SHOP_STATUS的值(1表示营业,0表示打烊)