Redis(基础知识+ 店铺营业状态设置 )
一、Redis入门
(如何去下载,如何去安装,如何去启动Redis的服务?)
→Redis也属于一类数据库,也就是说,可以通过它也来存储数据。
(1)Redis简介
●Redis是一个基于内存的key-value结构数据库( Redis是将数据存到内存里[内存存储],Redis通过键值对来存储,Mysql是通过数据文件的方式将数据存储到磁盘上[磁盘存储],MySQL通过二维表来存储 )
●Redis,基于内存存储,读写性能高
(由于我们的内存是有限的,所以我们不可能把所有数据都存到Redis当中,所以一般只存储一些热点数据到redis当中)
●Redis,适合存储热点数据(热点商品,资讯,新闻)
[热点数据的特点:在某一个特定的时间点,会有大量的用户去访问,比如抢购,秒杀的时候,在相当短的时间内,会有大量的用户去访问,而这些数据呢,它就属于热点数据,而这些数据,它就比较适合放在Redis当中](绝大部分业务数据仍然存放在mysql当中,只有这些热点数据存在redis当中,来提高我们的读写性能,所以它们之间是一个相互补充的关系)
●企业应用广泛
官网:https://redis.io
(Redis)中文网:http://www.redis.net.cn/
(2)Redis下载与安装

●压缩包,直接解压就可以直接使用
●解压后的一些目录(重点目录)
redis.windows.conf 是Redis的配置文件:如果我们要修改redis服务的端口号,或者来设置一个新的密码
redis-cli.exe 是Redis的客户端,(通过这个客户端,可以连接到我们的redis命令)
redis-server.exe 是Redis服务端(通过这个命令可以启动我们的redis服务)
(3)Redis服务启动与停止
●启动服务:redis-server.exe redis.windows.conf然后按回车[ ●ctrl+c 结束当前进程(在控制台上) 停止redis服务]
●启动完之后,就需要用客户端来连接一下这个Redis服务(然后我们就需要用到这个命令redis-cli.exe,
exit结束当前命令,退出客户端)
●-h: 就是我们host也就是你要连接的那个redis服务,它的IP
-p: 端口号
-a:密码
●ctrl+F:搜索
→别改密码了,万一改了忘了怎么办?😀
二、Redis数据类型(五种常用数据类型)
(1)五种常用数据类型介绍
●Redis 存储的是key value结构的数据(键值对),其中key是字符串类型,value有五种常用的数据类型:
字符串:string 哈希:hash 列表:list 集合:set 有序集合:sorted set/zset
(2)各种数据类型的特点
●字符串(string):普通字符串redis中最简单的数据类型
●哈希(hash):也叫散列,类似于JAVA当中的Hash Map结构(比较适合存储一些对象,因为一般一些对象呢,他又会有对应的属性值)
●列表(list):可以按照插入顺序排序,可以有重复元素,类似于JAVA中的LinkedList(既可以从列表的左侧插入元素,也可以从列表的右侧插入元素)[比较适合存储一些有顺序的数据]
●集合(set):无序集合,没有重复元素,类似于JAVA当中的HashSet[通过集合可以做运算,可以计算两个集合的交集,并集,补集]
●有序集合(sorted set/zset):集合中每个元素关联一个分数(score),根据分数升序排序,没有重复元素(带有顺序的集合)[可存储的数据:eg.各种排行榜,例如,视频播放量的排行榜,或者投票的排名]

三、Redis常用命令(通过命令来操作Redis当中的一些数据)
(1)字符串操作命令
●SET key value 设置指定key的值
set
●GET key 获取指定key的值
get
●SETEX key seconds value 设置指定key的值,并将key的过期时间设置为seconds秒[ TTL](比较常见的应用场景就是我们的短信验证码,一般验证码五分钟内有效,我们就可以把生成的验证码把它保存到redis当中,然后设置过期时间为五分钟,这样的话,五分钟之后这个key就会自动过期)
setex
●SETNX key value 只有在key不存在时设置key的值
setnx
⭐Redis当中的命令也是不区分大小写的(和mysql当中类似)
⭐TTL:用来展示当前数据还有多长时间就失效
(2)哈希操作命令
Redis hash 是一个string类型的field和value的映射表,hash 特别适合用于存储对象 ,常用命令:
●hset key field value 将哈希表key中的字段field的值设为value
●hget key filed 获取存储在哈希表中指定字段的值
●hdel key filed 删除存储在哈希表中的指定字段(filed和value都删)
●hkeys key 获取哈希表中的所有字段(只获取filed,不获取value)
●hvals key 获取哈希表中的所有值(只获取value)

(3)列表操作命令
Redis 列表是简单的字符串列表,按照插入顺序排序常用命令:
●lpush key value1 [value2] 将一个或多个值插入到列表头部(先插进去的背后,插入进来的给顶到列表后部,并且按照插入的顺序排好序了)
⭐l,指的是left,也就是说,从左侧插入数据,插入的时候要指定key和value
●lrange key start stop 获取列表指定范围内的元素
⭐start,队列头部
(0,-1)相当于把列表当中所有的元素都返回
●rpop key 移除并获取列表,最后一个元素
⭐r ,指的是right,把最右边的元素删除,删除的同时会给咱们的命令返回一个值(所移除的元素)
●llen key 获取列表长度(也就是元素的个数)

value 这一部分呢,是一个列表。而这个列表里面的每个元素,又是简单的字符串
(4)集合操作命令
Redis set是string类型的无序集合,集合成员是唯一的集合中不能出现重复的数据,常用命令:
●sadd key member1 [member2] 向集合添加一个或多个成员
⭐s代表的就是set,会返回插入元素的个数
⭐返回0插入失败
●smembers key 返回集合中的所有成员
●scard key 获取集合的成员数
⭐返回成员个数
●sinter key1 [key2] 返回给定所有集合的交集
●sunion key1 [key2] 返回所有给定集合的并集
●srem key member1 [member2] 删除集合中一个或多个成员

(5)有序集合操作命令
Redis 有序集合是string类型元素的集合,且不允许有重复元成员,每个元素都会关联一个double类型的分数。常用命令:
⭐有序集合主要通过分数来进行排序
●zadd key score1 member1 [score2 member2] 向有序集合添加一个或多个成员
⭐返回添加员工的个数
●zrange key start stop [withscores] 通过索引区间返回有序集合中指定区间内的成员
⭐0 -1 查看这个集合当中的所有成员,默认升序排列(命令行这里)。但在图形化界面那里,可以指定升序还是降序
⭐刚加上后边那个参数withscores的时候,在返回的时候也会给你返回对应的分数
●zincrby key increment member 有序集合中对指定成员的分数加上增量increment
⭐改变集合当中元素的分数(加上增量increment)
⭐返回加好后的分数
●zrem key member [member ...] 移除有序集合中的一个或多个成员
⭐返回删除的个数(命令行)

(6)通用命令
Redis 的通用命令是不分数据类型的,都可以使用的命令:
⭐主要是操作key
●keys pattern 查找所有符合给定模式(pattern)的key。
⭐如果给定模式是* 则就是返回所有的key
⭐如果给定模式是set* 则返回的就是以set开头的key
●exists key 检查给定key是否存在
⭐存在:返回1
不存在:返回0
●type key 返回key所存储的值的类型
⭐无序集合返回的是set 类型
⭐列表返回类型是list类型
●del key 该命令用于在key存在时删除key
⭐也可以一次性删除多个key( eg.del set1 set2 zset1)
四、在JAVA中操作Redis
(1)Redis 的JAVA客户端
Redis 的JAVA客户端很多,常用的几种:
●Jedis
●Lettuce(性能比较高效)
●Spring Data Redis
⭐Spring Data Redis 是spring的一部分,对Redis底层开发包进行了高度封装,在Spring项目中,可以使用 Spring Data Redis 来简化操作。
(2)Spring Data Redis 使用方式
⭐使用Spring Data Redis,这个框架来操作Redis
●操作步骤:
① 导入 Spring Data Redis的 maven坐标(pom.xml)
② 配置Redis数据源(application.yml)
⭐通过这个Redis数据源就可以连接到这个Redis数据库
⭐application.yml文件在resources包下
⭐host: 要连接的那个redis服务的ip地址
(eg.host: locallhost(别忘了中间要空格))
port:端口号(redis默认6379)
database:指定哪个数据库(DB0-DB15)[这个配置不是必须的,默认为0号数据库:0]
(eg.database:0
database:10)
⭐不同的数据库之间的数据是完全隔离的
⭐⭐不建议把配置项的值直接配置到当前文件(application.yml)里面[所以咱们把那些具体的值给配置到dev.yml文件当中,然后在主配置文件当中去引用它就可以(使用${})]

③ 编写配置类,创建Redis Template对象
⭐配置类放在config这个包下面
⭐1.设置redis的连接工厂对象2.设置redis key的序列化器(为了让string类型数据正常显示)

④ 通过Redis Template对象操作Redis
⭐通过redisTemplate.opsForValue()可以获得ValueOperations
⭐通过ValueOperations可以操作字符串string类型的数据
⭐如果想操作哈希类型的数据:redisTemplate.opsForHash(),然后我们就可以得到HashOperations这个对象

●可得到5个对象:
①ValueOperation(setex在这里面没有了,直接在set(在这里面写,插入数据的同时设置有效期),setnx变成setIfAbsent()方法)。 ②HashOperation(hset()方法变成put()方法,hget()变成get()方法。hdel()方法变成delete()方法。hkeys()方法变成keys()方法。hvals()方法变成values()方法),
③ListOperation(lpush()变成leftPushAll()和leftPush()方法。lrange()变成range()方法。rpop()变成rightPop()方法。llen()变成size()方法)。④SetOperation(sadd()变成add()方法。smembers()方法变成members()。scard()变成size()方法。sinter()变成intersect()方法。sunion()变成union()方法。srem()变成remove()方法),
⑤ZSetOperation(zadd()变成add()方法。zrang()变成range()方法。zincrby()变成incrementScore()。zrem()变成remove() ),
●通用命令操作(keys()不变。exists()变成hasKey()方法。type() 不变。 del()变成delete()方法 )
⭐redis里面的string和java里面的string不是完全一样
五、店铺营业状态设置
一、需求分析和设计
●根据产品经理设计的产品原型进行分析
修改营业状态:营业or打烊
状态:营业(客户在小程序下单点餐),打烊(客户无法下单点餐)
●接口设计:
修改这个营业状态,肯定需要一个接口。查询当前营业状态的一个接口(最后用来显示是否在营业中)[授信需要在商家管理端这一端查询]
①设置营业状态(修改类操作,请求方式:put,请求路径/admin/shop/{status} 路径参数: 如果传过来的值是1就表示营业,如果是0表示打烊,返回参数:成功:code,失败:code+msg)
②管理端查询营业状态(请求方式:get 请求路径:/admin/shop/status,无请求参数,返回数据:code,data[店铺营业状态,1营业0打烊],msg)
③用户端查询营业状态(请求路径:/user/shop/status ,请求方式:get,无请求参数,返回数据:code,data[店铺营业状态,1营业0打烊],msg)
⭐营业状态数据存储方式:基于redis的字符串来进行存储

⭐之所以这里查询营业状态,用了两个接口,是因为在本项目当中约定:管理端发出的请求统一用/admin 作为前缀。用户端发出的请求统一使用/user作为前缀。
二、代码开发
三、功能测试
接口测试+前后端联调测试
测试完之后就提交并推送









