[苍穹外卖]-05Redis快速入门

Redis入门

Redis是一个基于内存的key-value结构数据库

  1. 基于内存存储, 读写性能高
  2. 适合存储热点数据(热点商品,咨询,新闻)
  3. 企业应用广泛
  4. 中文官网: Redis中文网
  5. 英文网: https://rsdis.io

下载安装: Redis安装包分为Windows版本和Linux版本, Redis的windows版属于绿色软件, 解压后就能用

  1. 资料中已经提供了的安装包

  1. 解压后的核心文件

启动Redis服务: 进入到安装目录, 执行命令 redis-server.exe redis.windows.conf

  1. 命令格式: 启动命令 空格 配置文件
  2. 停止服务: ctrl + c
  3. redis默认执行在6379端口
  4. 双击 redis-server.exe 也可以快速启动redis服务

连接本地或者远程数据库

  1. 连接本地数据库, 执行 redis-cli.exe 命令,
  2. 验证连接执行 keys * 命令
  3. 退出连接执行 exit 命令
  4. 连接远程数据库, 执行 redis-cli.exe -h localhost -p 379 -a 12345 命令
  5. -h后边跟地址 -p后边跟端口 -a后边跟密码(默认无密码)

配置数据库的连接密码

  1. 关闭服务和连接
  2. 打开配置文件 redis.windows.conf
  3. 查找配置项

  1. 配置密码

Redis图形化操作工具

  1. 资料中有提供, 傻瓜式安装即可

  1. 使用图形化工具连接数据库

Redis数据类型

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

  1. 字符串string: 普通字符串, Redis中最简单的数据类型
  2. 哈希hash: 也叫散列, 类似于java中的HashMap结构, 类似于对象
  3. 列表list: 按照插入顺序排序, 可以有重复元素, 类似与java中的LinkedList, 类似于数组
  4. 集合set: 无序集合, 没有重复的元素, 类似于java中的HashSet, 类似于无需不重复的数组
  5. 有序集合sorted set / zset: 集合中每个元素关联一个分数(score), 根据分数升序排序, 没有重复元素

常用命令

在Redis中, 不同的数据类型, 操作数据的命令是不同的, 并且操作命令不区分大小写

字符串操作命令

set name jack 
ok // 创建一个key, 名称是name, 值是jackget name
jack // 获取name这个key的值get aaa
null // 获取不存在的key的值, 返回nullsetnx code 30 1234
ok //创建一个key,名称是code,值是1234, 有效期是30s, 到期自动删除setnx age 18
1 // 创建一个key, 名称是age, 值是18
setnx age 20
0 // 创建失败, 因为age已经存在

哈希操作命令: Redis hash 是一个string类型的 field 和 value的映射表, hash特别适合用于储存对象

HSET 100 name xiaoming
1 // 创建一个key,名称是100, 属性名是name, 属性值是xiaoming
HSET 100 age 22
1 // 往100这个key添加属性, 属性名是age, 属性值是11HGET 100 name
xiaoming //获取100这个key的name属性的值HDEL 100 name
1 // 删除100这个key的name属性HKEYS 100
age name // 获取100这个key中的所有属性名HVALS 100
22 xiaoming // 获取100这个key中的所有属性值

列表操作命令: Redis列表是简单的字符串列表, 按照插入顺序排序, 可以理解为数组

LPUSH mylist a b c
3 //创建mylist列表,将abc 3个值插入到列表头部
LPUSH mylist a b c
4 //将d插入到列表头部LRANGE mylist 0 -1
d c b a // 获取mylist列表指定范围内的元素RPOP mylist
a //移除并返回列表最后一个元素LLEN mulist
3 //获取列表长度

集合操作命令: Redis set 是string类型的无序集合, 集合成员是唯一的, 集合中不能出现重复数据

SADD set1 a b c d
4 // 新建set1集合,添加abcd 4个成员SADD set1 a
0 // 向set1集合中添加a成员,失败,因为已存在SMEMBERS set1
c d b a //返回set1集合中所有的成员SCARD set1
4 // 获取set1集合的成员数SADD set2 a b x y
4 // 新建set2集合,添加abxy 4个成员SINTER set1 set2
b a //返回两个集合的交集SUNION set1 set2
c y d a x b // 返回两个集合的并集SREM set1 a
1 // 删除set1集合中的a成员 

有序集合操作命令: Redis有序集合是string类型元素的集合, 且不允许有重复成员, 每个元素都会关联一个double类型的分数

ZADD zset1 10.0 a 10.5 b
2 //新建zset1集合,并添加ab两个成员,并指定成员分数 ZADD zset1 10.2 c
1 //向zset1集合添加c成员,并指定成员分数 ZRANGE zset1 0 -1
a c b //通过索引区间查询zset1集合中的成员ZRANGE zset1 0 -1 withscore
a 10 c 10.2 b 10.5 //查询zset1集合中的成员和分数ZINCRBY zset1 5.0 a
15 //对zset1集合中的a成员,加上5.0分ZREM zset1 b
1 //移除zset1集合中的b成员

通用命令: 不分数据类型都可以使用的命令

KEYS *
mylist key1 name set1 set2 zset1 //查询所有keyKEYS set*
set1 set2 //查询所有以set开头的keyEXISTS name
1  //检查给定Key是否存在TYPE name
string //返回key所储存的值的类型DEL name set1 zset1
3 //在key存在时删除key

java操作Redis

Redis的java客户端很多, 根据项目情况按需选择

  1. Jedis: 对Redis命令进行封装, 语法与Redis命令保持一致
  2. Lettuce: 基于多线程的Redis封装,特点是性能好
  3. Spring Date Redis: 是Spring的一部分, 对Redis底层开发包进行了高度封装, 简化Redis操作

Spring Data Redis入门

1.导入mavn坐标

 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency>

2.配置Redis数据源

spring:redis:host: ${sky.redis.host}port: ${sky.redis.port}database: ${sky.redis.database}
sky:redis:host: localhostport: 6379password: 123456database: 0
  • 如果没有配置密码, 密码项可以省略
  • redis会默认创建16个独立的数据库, 默认使用0号数据库
  • 可以修改 datebase 属性切换数据库
  • 每个数据库的数据是隔离的

3.编写配置类,创建RedisTemplate对象

@Configuration //标明配置类
@Slf4j
public class RedisConfiguration {@Bean //项目启动时完成自动配置(按照类型自动注入对象)public RedisTemplate redisTemplate (RedisConnectionFactory redisConnectionFactory) {// 1.redisConnectionFactory是redis连接工厂对象// 2.这个对象不用我们创建, redis起步依赖中已经创建好了// 3.我们只需要通过@Bean注解, 让spring把这个对象注入进来就行log.info("开始创建redis模版对象...");RedisTemplate redisTemplate = new RedisTemplate<>();// 设置redis的连接工厂对象redisTemplate.setConnectionFactory(redisConnectionFactory);// 设置redis key的序列化器// StringRedisSerializer() -> 创建字符串类型的redis序列化器redisTemplate.setKeySerializer(new StringRedisSerializer());return redisTemplate;}
}

4.通过RedisTemplate对象操作Redis

新建单元测试类: test/java/右键/new/java class/com.sky.test.SpringDataRedisTest

@SpringBootTest // 声明单元测试类
public class SpringDataRedisTest {@Autowiredprivate RedisTemplate redisTemplate;@Test // 声明单元测试方法public void testRedisTemplate() {// 检查redis模版对象是否成功创建System.out.println(redisTemplate);// 1.redis中不同的数据类型有不同的操作命令// 2.要通过redis模版对象,拿到数据操作对象// 3.通过不同的数据操作对象操作数据ValueOperations valueOperations = redisTemplate.opsForValue();HashOperations hashOperations = redisTemplate.opsForHash();ListOperations listOperations = redisTemplate.opsForList();SetOperations setOperations = redisTemplate.opsForSet();ZSetOperations zSetOperations = redisTemplate.opsForZSet();}}

使用字符串操作对象操作字符串类型的数据

@SpringBootTest // 声明单元测试类
public class SpringDataRedisTest {@Autowiredprivate RedisTemplate redisTemplate;@Testpublic void testString(){//原始命令 set get setex setnx redisTemplate.opsForValue().set("city","北京");  // 添加数据String city = (String) redisTemplate.opsForValue().get("city");  //获取数据redisTemplate.opsForValue().set("code","1234",3, TimeUnit.MINUTES);  //添加数据(设置超时时间)redisTemplate.opsForValue().setIfAbsent("lock","1");  //只有在key不存在时添加数据}
}
  1. 设置redis的key的序列化器的作用

使用哈希操作对象操作哈希类型的数据

@SpringBootTest // 声明单元测试类
public class SpringDataRedisTest {@Autowiredprivate RedisTemplate redisTemplate;@Testpublic void textHash() {//原始命令 hset hget hdel hkeys hvals HashOperations hashOperations = redisTemplate.opsForHash();hashOperations.put("100", "name", "tom");  // 设置数据hashOperations.put("100", "age", "18");   // 设置数据String name = (String) hashOperations.get("100", "name");  // 获取指定数据Set keys = hashOperations.keys("100"); // 获取所有keyList values = hashOperations.values("100"); // 获取所有valuehashOperations.delete("100", "age"); // 删除指定数据}}

使用列表操作对象操作列表类型的数据

@SpringBootTest // 声明单元测试类
public class SpringDataRedisTest {@Autowiredprivate RedisTemplate redisTemplate;@Testpublic void testList() {// 原始命令 lpush lrange rpop llenListOperations listOperations = redisTemplate.opsForList();listOperations.leftPushAll("mylist", "a", "b", "c");  // 插入多条数据listOperations.leftPush("mylist", "d");  // 插入单条数据List mylist = listOperations.range("mylist", 0, -1);  // 查询全部数据listOperations.rightPop("mylist"); // 移除一条数据Long size = listOperations.size("mylist");//查看列表长度}}

使用集合操作对象操作集合类型的数据

@SpringBootTest // 声明单元测试类
public class SpringDataRedisTest {@Autowiredprivate RedisTemplate redisTemplate;@Testpublic void testSet() {// 原始命令 sadd smembers scard sinter sunion sremSetOperations setOperations = redisTemplate.opsForSet();setOperations.add("set1", "a", "b", "c", "d");  // 创建集合1setOperations.add("set2", "a", "b", "x", "y");  // 创建集合2Set members = setOperations.members("set1");  // 获取集合成员Long size = setOperations.size("set1");// 获取集合长度Set intersect = setOperations.intersect("set1", "set2");// 获取两个集合的交集setOperations.union("set1", "set2");  // 获取两个集合的并集setOperations.remove("set1", "a", "b");  //  删除集合成员}}

使用有序集合操作对象操作有序集合类型的数据

@SpringBootTest // 声明单元测试类
public class SpringDataRedisTest {@Autowiredprivate RedisTemplate redisTemplate;@Testpublic void testZset() {// 原始命令 zadd zrange zincrby zremZSetOperations zSetOperations = redisTemplate.opsForZSet();zSetOperations.add("zset1", "a", 10);  // 添加成员zSetOperations.add("zset1", "b", 12);  // 添加成员zSetOperations.add("zset1", "c", 9);  // 添加成员Set zset1 = zSetOperations.range("zset1", 0, -1);  // 获取zset所有成员zSetOperations.incrementScore("zset1", "c", 10);  // 修改成员的排序值zSetOperations.remove("zset1", "a", "b");  // 移除成员}}

使用redis模版对象执行通用操作命令

@SpringBootTest // 声明单元测试类
public class SpringDataRedisTest {@Autowiredprivate RedisTemplate redisTemplate;@Testpublic void testCommon() {// 原始命令 keys exists type delSet keys = redisTemplate.keys("*"); //获取所有的keySystem.out.println(keys);Boolean name = redisTemplate.hasKey("name"); //判断是否存在这个keyBoolean set1 = redisTemplate.hasKey("set1"); //判断是否存在这个key// 遍历所有keyfor (Object key: keys) {DataType type = redisTemplate.type(key); //获取key的类型System.out.println(type.name()); //输出类型的名称}redisTemplate.delete("mylist");  //删除key}}

店铺状态设置

查看原型, 分析需求, 在管理端可以设置店铺状态

接口设计: 要设计三个接口, 设计营业状态接口, 客户端查询店铺状态接口, 管理端查询店铺状态接口

  1. 管理端发出的请求, 统一使用/admin作为前缀
  2. 用户端发出的请求 ,统一使用/user作为前缀

数据库设计: 如果针对一个字段创建一张表其实并不合适, 所以使用redis数据库, 基于Redis的字符串进行储存

管理端接口

@RestController("adminShopController") // 指定bean的名字
@RequestMapping("/admin/shop")
@Api(tags = "店铺相关接口")
@Slf4j
public class ShopController {public static final String KEY = "SHOP_STATUS";@Autowiredprivate RedisTemplate redisTemplate;/*** 设置店铺的营业状态** @param status* @return*/@PutMapping("/{status}")@ApiOperation("设置店铺的营业状态")public Result setStatus(@PathVariable Integer status) {log.info("设置店铺营业状态为:{}", status);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);return Result.success(status);}
}

客户端接口

@RestController("userShopController") // 指定bean的名字
@RequestMapping("/user/shop")
@Api(tags = "店铺相关接口")
@Slf4j
public class ShopController {public static final String KEY = "SHOP_STATUS";@Autowiredprivate RedisTemplate redisTemplate;/*** 获取店铺的营业状态** @return*/@GetMapping("/status")@ApiOperation("获取店铺的营业状态")public Result<Integer> getStatus() {Integer status = (Integer) redisTemplate.opsForValue().get(KEY);log.info("获取到店铺营业状态:{}", status);return Result.success(status);}
}

前后端联调测试

分组扫描接口文档: 通过groupName("描述")方法设置接口文档分组扫描

/*** 配置类,注册web层相关组件*/
@Configuration
@Slf4j
public class WebMvcConfiguration extends WebMvcConfigurationSupport {/*** 通过knife4j生成接口文档** @return*/@Beanpublic Docket docket1() {ApiInfo apiInfo = new ApiInfoBuilder().title("苍穹外卖项目接口文档").version("2.0").description("苍穹外卖项目接口文档").build();Docket docket = new Docket(DocumentationType.SWAGGER_2).groupName("管理端接口").apiInfo(apiInfo).select().apis(RequestHandlerSelectors.basePackage("com.sky.controller.admin")).paths(PathSelectors.any()).build();return docket;}/*** 通过knife4j生成接口文档** @return*/@Beanpublic Docket docket2() {ApiInfo apiInfo = new ApiInfoBuilder().title("苍穹外卖项目接口文档").version("2.0").description("苍穹外卖项目接口文档").build();Docket docket = new Docket(DocumentationType.SWAGGER_2).groupName("客户端接口").apiInfo(apiInfo).select().apis(RequestHandlerSelectors.basePackage("com.sky.controller.user")).paths(PathSelectors.any()).build();return docket;}}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/53585.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

OCR技术视角:智能文档管理中的票据自动化识别与处理

在数字化转型的浪潮中&#xff0c;企业对于高效、自动化的文档管理需求日益增长。票据作为企业运营中不可或缺的部分&#xff0c;其识别与管理的智能化成为了提升工作效率的关键。本文将深入探讨智能文档系统中票据识别功能的原理、技术优势以及在不同行业中的应用实践&#xf…

观察者模式observer

允许一个对象将其状态的改变通知其他对象 当Editor调用openFile()和saveFile()时&#xff0c;它会通过EventManager的notify方法&#xff0c;通知所有订阅了这些事件的监听器。

828华为云征文|华为云Flexus X实例部署k3s与kuboard图形化管理工具

828华为云征文&#xff5c;华为云Flexus X实例部署k3s与kuboard图形化管理工具 华为云最近正在举办828 B2B企业节&#xff0c;Flexus X实例的促销力度非常大&#xff0c;特别适合那些对算力性能有高要求的小伙伴。如果你有自建MySQL、Redis、Nginx等服务的需求&#xff0c;一定…

算法分享——《双指针》

文章目录 ✅[《移动零》](https://leetcode.cn/problems/move-zeroes/)&#x1f339;题目描述&#xff1a;&#x1f697;代码实现&#xff1a;&#x1f634;代码解析&#xff1a; ✅[《复写零》](https://leetcode.cn/problems/duplicate-zeros/)&#x1f339;题目描述&#xf…

[数据集][目标检测]石油泄漏检测数据集VOC+YOLO格式6633张1类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;6633 标注数量(xml文件个数)&#xff1a;6633 标注数量(txt文件个数)&#xff1a;6633 标注…

吐血整理 ChatGPT 3.5/4.0 新手使用手册~ 【2024.09.04 更新】

以前我也是通过官网使用&#xff0c;但是经常被封号&#xff0c;就非常不方便&#xff0c;后来有朋友推荐国内工具&#xff0c;用了一阵之后&#xff0c;发现&#xff1a;稳定方便&#xff0c;用着也挺好的。 最新的 GPT-4o、4o mini&#xff0c;可搭配使用~ 1、 最新模型科普&…

【Qt】qt发布Release版本,打包.exe可执行文件

前言&#xff1a;Qt编译的可执行程序&#xff0c;如果直接运行&#xff0c;会出现0xc000007b报错&#xff0c;或者“由于占不到Qt5Network.dll,无法继续执行代码。重新安装程序可能会解决此问题”的报错&#xff0c;因为缺少相关的依赖包和动态库。 1、第一步&#xff1a;找到…

从电商行业的变化引出未来技术趋势

时间&#xff1a;2024年09月08日 作者&#xff1a;小蒋聊技术 邮箱&#xff1a;wei_wei10163.com 微信&#xff1a;wei_wei10 音频地址&#xff1a;喜马拉雅 希望大家帮个忙&#xff01;如果大家有工作机会&#xff0c;希望帮小蒋推荐一下&#xff0c;小蒋希望遇到一个认真…

Android 系统源码项目加载预编好的so库

Android 系统源码项目加载预编好的so库 文章目录 Android 系统源码项目加载预编好的so库一、前言二、源码中加载so1、Android.mk加载so加载so的主要相关代码&#xff1a; 2、Android.bp加载so&#xff08;1&#xff09;Android.mk使用源码命令编译成Android.bp&#xff08;2&am…

【C++】STL容器详解【下】

目录 一、list容器 1.1 list基本概念 1.2 lsit构造函数 1.3 list数据元素插入和删除操作 1.4 list大小操作 1.5 list赋值操作 1.6 list数据的存取 1.7 list反转排序 二、set/multiset容器 2.1 set/multiset基本概念 2.2 set构造函数 2.3 set赋值操作 2.4 set大小操…

Hash Table、HashMap、HashSet学习

文章目录 前言Hash Table&#xff08;散列表&#xff09;基本概念散列函数散列冲突&#xff08;哈希碰撞&#xff09;拉链法红黑树时间复杂度分析 HashMap基础方法使用基本的增删改查其他的方法 实现原理 HashSet基础操作去重原理 前言 本文用于介绍关于Hash Table、HashMap、…

【qt】多线程实现倒计时

1.界面设计 设置右边的intvalue从10开始倒计时 2.新建Thread类 新建Thread类&#xff0c;使其继承QThread类&#xff0c;多态重写run函数&#xff0c;相当于线程执行函数 3.重写run函数 重写run函数&#xff0c;让另一个进程每隔1s发出一个信号&#xff0c;主线程使用conne…

uniapp 全屏日历,动态无限加载

不好用请移至评论区揍我 原创代码,请勿转载,谢谢! 注:本人仅在微信小程序测试过,未在其他app/h5尝试过,按理说应该是可以的,代码没有引用任何第三方组件 日历中每个日期下方的空白部分均可自定义,写在代码中的<view class="item">我是内容</view>…

Prometheus 服务监控

目录 Prometheus 是什么 Prometheus 的特点 Prometheus 的组件 Prometheus 的指标 Prometheus 的使用场景 Prometheus 的安装 方式一&#xff1a;压缩包方式安装 方式二&#xff1a;Docker 方式安装 Prometheus 的 Web UI 面板介绍 Prometheus 目录结构介绍 Prometh…

简单的Linux Ftp服务搭建

简单的Linux FTP服务搭建 1.需求 公司有一个esb文件传输代理&#xff0c;其中我们程序有文件传输功能&#xff0c;需要将本地文件传输到esb文件代理服务器上&#xff0c;传输成功之后发送http请求&#xff0c;告知esb将固定文件进行传输到对应外围其他服务的文件目录中&#…

unity GridLayoutGroup真正的居中

GridLayoutGroup默认的居中效果: 不是真正的居中 加上代码: namespace UnityEngine.UI {/// <summary>/// GridLayoutGroup拓展&#xff0c;使支持自定义内容/// </summary>internal class GridLayoutGroupEx : GridLayoutGroup{/// <summary>/// 启用居中/…

香橙派转换模型以及在开发板上部署

新手小白记录一下自己使用香橙派模型转换以及在开发板上运行的过程&#xff0c;防止后面忘记。 使用的开发板&#xff1a;Orange Pi 5 Plus&#xff08;rk3588&#xff09; 官方的一些资料在&#xff08;主要参考用户手册&#xff09;&#xff1a;Orange Pi - Orangepihttp:/…

【视频讲解】Python贝叶斯卷积神经网络分类胸部X光图像数据集实例

全文链接&#xff1a;https://tecdat.cn/?p37604 分析师&#xff1a;Yuanchun Niu 在人工智能的诸多领域中&#xff0c;分类技术扮演着核心角色&#xff0c;其应用广泛而深远。无论是在金融风险评估、医疗诊断、安全监控还是日常的交互式服务中&#xff0c;有效的分类算法都是…

科研绘图系列:R语言富集散点图(enrichment scatter plot)

介绍 富集通路散点图(Enrichment Pathway Scatter Plot)是一种数据可视化工具,用于展示基因集富集分析(Gene Set Enrichment Analysis, GSEA)的结果。 横坐标是对应基因名称,纵坐标是通路名称,图中的点表示该基因在某个通路下的qvalue,可以简单理解为不同环境下的贡献…

【全网最全】2024年数学建模国赛A题30页完整建模文档+17页成品论文+保奖matla代码+可视化图表等(后续会更新)

您的点赞收藏是我继续更新的最大动力&#xff01; 一定要点击如下的卡片那是获取资料的入口&#xff01; 【全网最全】2024年数学建模国赛A题30页完整建模文档17页成品论文保奖matla代码可视化图表等&#xff08;后续会更新&#xff09;「首先来看看目前已有的资料&#xff0…