SpringBoot集成Redis
Redis 的介绍
Redis(Remote Dictionary Server)是一个开源的内存数据结构存储系统,它被广泛地应用于缓存、计数器、限速器、消息队列、分布式锁等多种场景中。Redis 支持多种数据结构,包括字符串、散列、列表、集合和有序集合等,并且具有高性能、高可用性、持久化以及丰富的特性,在企业级应用中逐渐成为关键的一环。
Redis 的应用场景
Redis 在企业应用中的应用场景十分广泛:
- 缓存:Redis 可以作为一种高速缓存,将一些经常访问但不经常变化的数据缓存到内存中,加快数据读取速度。
- 计数器:Redis 可以处理计数器功能,可以方便地实现有序集合的排名、粉丝量统计等功能。
- 限速器:利用 Redis 的计数器功能,可以对请求进行限速,避免过多的请求造成系统崩溃。
- 分布式锁:通过 Redis 的原子操作和持久化特性,可以实现分布式锁,避免多个进程同时修改同一数据带来的问题。
- 消息队列:Redis 提供了 Pub/Sub 机制,可以实现分布式环境下的消息传递机制,例如个推、金融交易等。
- 数据库:Redis 可以作为数据库使用,具有快速响应、持久化数据等特点。
- 负载均衡:利用 Redis 的 Cluster 特性,可以实现负载均衡,避免服务器出现过快或过慢的现象。
Redis 的数据类型
Redis 支持的数据类型具有丰富的特性和严格的限制,可以满足各种不同数据场景的需求。
- String:字符串类型是 Redis 最基本的数据类型,可以存储任意类型的字符串,包括二进制数据。
- List:列表类型是一种有序的元素集合,支持从头部或尾部添加或删除元素,支持获取某个元素的值。
- Hash:散列类型是 Redis 中用来表示对象的数据结构,每个键值对存储一个子对象,适合存储较为复杂的数据结构。
- Set:集合类型是 Redis 中提供了无序元素的集合,一个键值对可以包含多个元素且元素不能重复,适合存储无序相关元素的数据结构。
- Sorted Set:有序集合类型是 Redis 中提供了具有排序功能的集合类型,一个键值对可以包含多个元素且元素不能重复,适合存储有关联属性或有序相关元素的数据结构。
SpringBoot 整合 Redis
下面我们结合一个简单的项目,通过 StringRedisTemplate 来演示各个数据类型的例子。
在 pom.xml 文件中加入如下依赖:
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId>
</dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
在 application.properties 文件中加入如下设置:
# Redis 数据库
spring.redis.database=0
# Redis 服务器的地址和端口号
spring.redis.host=localhost
spring.redis.port=6379
# Redis 访问密码,如果没有设置密码可不填
spring.redis.password=
在 src/main/java/com/example/demo 目录下新建一个 RedisController 类,并添加如下注解:
@RestController
public class RedisController {...
}
存储 String 类型数据
在 RedisController 类中添加以下依赖注入:
@Autowired
private StringRedisTemplate stringRedisTemplate;
在 RedisController 中添加一个简单的 String 类型接口,用于存储和获取字符串类型数据:
@GetMapping("/redis/setString")
public String setString() {String key = "name";String value = "Redis";stringRedisTemplate.opsForValue().set(key, value);return "set success";
}@GetMapping("/redis/getString")
public String getString() {String key = "name";String value = stringRedisTemplate.opsForValue().get(key);return "get value:" + value;
}
存储 List 类型数据
在 RedisController 类中添加以下依赖注入:
@Autowired
private RedisTemplate<String, Object> redisTemplate;
在 RedisController 中添加一个 List 类型的接口,用于存储和获取 List 类型数据:
@GetMapping("/redis/setList")
public String setList() {String key = "list";List<String> values = Arrays.asList("Redis", "Java", "Python");redisTemplate.opsForList().rightPushAll(key, values);return "set success";
}@GetMapping("/redis/getList")
public List<String> getList() {String key = "list";List<String> values = redisTemplate.opsForList().range(key, 0, -1);return values;
}
存储 Hash 类型数据
在 RedisController 类中添加以下依赖注入:
@Autowired
private StringRedisTemplate stringRedisTemplate;
在 RedisController 中添加一个 Hash 类型的接口,用于存储和获取 Hash 类型数据:
@GetMapping("/redis/setHash")
public String setHash() {String key = "user";stringRedisTemplate.opsForHash().put(key, "name", "Redis");stringRedisTemplate.opsForHash().put(key, "age", "18");return "set success";
}@GetMapping("/redis/getHash")
public Map<String, String> getHash() {String key = "user";Map<String, String> result = stringRedisTemplate.opsForHash().entries(key);return result;
}
存储 Set 类型数据
在 RedisController 类中添加以下依赖注入:
@Autowired
private StringRedisTemplate stringRedisTemplate;
在 RedisController 中添加一个 Set 类型的接口,用于存储和获取 Set 类型数据:
@GetMapping("/redis/setSet")
public String setSet() {String key = "set";stringRedisTemplate.opsForSet().add(key, "Redis", "Java", "Python");return "set success";
}@GetMapping("/redis/getSet")
public Set<String> getSet() {String key = "set";Set<String> result = stringRedisTemplate.opsForSet().members(key);return result;
}
存储 Sorted Set 类型数据
在 RedisController 类中添加以下依赖注入:
@Autowired
private StringRedisTemplate stringRedisTemplate;
在 RedisController 中添加一个 Sorted Set 类型的接口,用于存储和获取 Sorted Set 类型数据:
@GetMapping("/redis/setSortedSet")
public String setSortedSet() {String key = "sortedSet";Set<ZSetOperations.TypedTuple<String>> values = new HashSet<>();values.add(new DefaultTypedTuple<>("Redis", 1D));values.add(new DefaultTypedTuple<>("Java", 2D));values.add(new DefaultTypedTuple<>("Python", 3D));stringRedisTemplate.opsForZSet().add(key, values);return "set success";
}@GetMapping("/redis/getSortedSet")
public Set<String> getSortedSet() {String key = "sortedSet";Set<String> result = stringRedisTemplate.opsForZSet().range(key, 0, -1);return result;
}
运行 SpringBoot 项目,在浏览器中访问以上接口,可以看到相应的数据类型存储和获取效果。
总结
Redis 是一个非常优秀的内存数据结构存储系统,具有高可用性、高性能、持久化和支持多种数据结构等特点,在大数据领域得到了广泛应用。同时,使用 SpringBoot 也可以快速地实现 Redis 的使用,并且 StringRedisTemplate 提供了丰富的 API,可以方便地操作 Redis 中的数据。各个数据类型的实现需要根据具体业务场景而定,可以根据需要自由地选择数据结构和使用方式。
关注微信公众号:“小虎哥的技术博客”。我们会定期发布关于Java技术的详尽文章,让您能够深入了解该领域的各种技巧和方法,让我们一起成为更优秀的程序员👩💻👨💻!
相关文章源码放在:gitee仓库、github仓库上。
相关文章:
SpringBoot集成Redis
Redis 的介绍 Redis(Remote Dictionary Server)是一个开源的内存数据结构存储系统,它被广泛地应用于缓存、计数器、限速器、消息队列、分布式锁等多种场景中。Redis 支持多种数据结构,包括字符串、散列、列表、集合和有序集合等&…...
qt 的基础学习计划列表
1 第一天 (qt 的基础) 什么是qt hello程序,空窗口 添加按钮(对象树、父子关系) 按钮的功能(信号和槽) 信号和槽的拓展2 第二天 各个控件 最简单的记事本界面(菜单栏、状态栏、工具…...
CSS中如何改变鼠标指针样式(cursor)?
聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ CSS中改变鼠标指针样式(cursor)⭐ 示例:⭐ 写在最后 ⭐ 专栏简介 前端入门之旅:探索Web开发的奇妙世界 记得点击上方或者右侧链接订阅本专栏哦 几何带你启航前端之旅 欢迎来到前端入门之旅…...
SpringMVC-2-Spring MVC拦截器详解:从入门到精通
SpringMVC-2-Spring MVC拦截器详解:从入门到精通 今日目标 能够编写拦截器并配置拦截器 1.拦截器【理解】 1 拦截器介绍 1.1 拦截器概念和作用 拦截器(Interceptor)是一种动态拦截方法调用的机制,在SpringMVC中动态拦截控制器方…...
探索AIGC人工智能(Midjourney篇)(一)
文章目录 案例图片 Midjourney注册 创建Discord账号 下载客户端 添加Midjourney到自己的服务器 用Midjourney画一只会飞的鸭子 Midjourney绘画指令 Midjourney绘画指令_激发Midjourney的创造力 Midjourney绘画指令_Seed指令 Midjourney光线关键词,打造震撼…...
【IMX6ULL驱动开发学习】11.Linux之SPI驱动
参考:驱动程序开发:SPI设备驱动_spi驱动_邓家文007的博客-CSDN博客 目录 一、SPI驱动简介 1.1 SPI架构概述 1.2 SPI适配器(控制器)数据结构 1.2 SPI设备数据结构 1.3 SIP设备驱动 1.4 接口函数 二、SPI驱动模板 一、SPI驱动…...
什么是网络中的服务质量 (QoS),其相关技术和关键指标有哪些?
QoS(Quality of Service,服务质量)指一个网络能够利用各种基础技术,为指定的网络通信提供更好的服务能力,是网络的一种安全机制,是用来解决网络延迟和阻塞等问题的一种技术。QoS的保证对于容量有限的网络来…...
Django(4)-Django 管理页面
创建一个管理员账号 python manage.py createsuperuser运行项目,访问http://127.0.0.1:8080/admin,可以看到管理员界面 管理页面加上投票应用 polls/admin.py from django.contrib import admin# Register your models here. from .models import …...
js的使用之时间如何定义,窗口加载事件
1.时间如何定义 1.1 date的其他的属性 带出星期几的写法 var arr [星期日,星期一,星期二,星期三,星期四,星期五,星期六,星期天] var day date.getDay(); console.log(arr[day]); 1.2 日期的格式化 1.3 时分秒的写法 固定写法:如果想要写成00:00:00这种形式&am…...
会声会影2023全新中文专业版下载安装教程
熟练使用会声会影视频编辑工具,对视频创作过程的帮助是极大的。大家可以放心大胆地去研究会声会影的视频编辑技巧,会声会影2023与以往版本会声会影版本最大的区别是:账户制管理。可以通过账户添加或移除设备,非常便捷。该软件一直…...
excel处理公式获得最终值--------------gxl
/*** 读取单元格内容 包括计算公式的结果,引用公式的结果* param cell* return*/public static String getCellValue(Cell cell){System.out.println(cell);String value null;if(cell ! null){System.out.println(cell.getCellType());switch (cell.getCellType()…...
变量函数及销毁函数中的变量-PHP8知识详解
今天分享php8知识详解中的变量函数及销毁函数中的变量,以及相应的示例代码。 1、变量函数 变量函数,是指通过变量来访问的函数。当变量后有圆括号时,PHP将自动寻找与变量的值同名的函数,然后执行该函数。 变量函数引用…...
Unity Alembic闪烁问题
最近在做项目时,发现Clo3D导出的服装abc动画,导入到Unity中后(已提前导入Alembic插件),运行时屏幕会闪烁(变黑)。 经过几轮测试,发现是切线的问题。解决办法很简单。将abc文件上的Tangents属性值改为None即可。...
结构型模式-适配器模式
适配器模式* 定义:适配器模式(Adapter Pattern)是作为两个不兼容的接口之间的桥梁。这种类型的设计模式属于结构型模式,它结合了两个独立接口的功能。 这种模式涉及到一个单一的类,该类负责加入独立的或不兼容的接口…...
数据结构:线性表之-顺序表
目录 1.线性表概念 1.1 什么是顺序列表 1.2 线性表 2.顺序表实现 将有以下功能: 详细过程 顺序表的动态存储 顺序表初始化 尾插 扩容 头插 更改后的尾插 尾删 头删 打印 释放内存 优化顺序表 (任意位置插入删除) 优化后的头插尾插 优化后的头删尾…...
请你说说json 序列化功能
JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,易于人阅读和编写,同时也易于机器解析和生成。JSON基于JavaScript编程语言,是一种文本格式,完全独立于语言。 JSON序列化是将复杂的对象结构…...
Wireshark流量分析
目录 1.基本介绍 2.基本使用 1)数据包筛选: 2)筛选ip: 3)数据包还原 4)数据提取 3.wireshark实例 1.基本介绍 在CTF比赛中,对于流量包的分析取证是一种十分重要的题型。通常这类题目都是会提供一个包含…...
spring cloud整合spring boot,整合nacos、gateway、open-feign等组件
补充: 想看具体详情的可以看我的github链接:codeking01/platform-parent: spring cloud整合spring boot、nacos、gateway、open feign等组件 (github.com) 由于我升级了jdk17,所以用上了spring boot 3.0.2了。 踩坑无数,一堆无用文…...
大数据和人工智能之间如何的相互促进
文章目录 大数据为人工智能提供支持人工智能加速大数据的分析和应用紧密联系和合作方式综合效应:智能化决策和创新结论 🎈个人主页:程序员 小侯 🎐CSDN新晋作者 🎉欢迎 👍点赞✍评论⭐收藏 ✨收录专栏&…...
基于互联网会计信息系统的内部控制
内部控制是指企业为保护资产安全、保证会计记录的正确性和可靠性、提高经 营管理效率、保障经营管理政策的执行而采取的全部方法和措施。内部控制可分为 一般控制和应用控制两类。一般控制是对会计信息系统环境的控制,应用控制则是 对系统运行过程的控制。显然&a…...
MFC内存泄露
1、泄露代码示例 void X::SetApplicationBtn() {CMFCRibbonApplicationButton* pBtn GetApplicationButton();// 获取 Ribbon Bar 指针// 创建自定义按钮CCustomRibbonAppButton* pCustomButton new CCustomRibbonAppButton();pCustomButton->SetImage(IDB_BITMAP_Jdp26)…...
【JVM】- 内存结构
引言 JVM:Java Virtual Machine 定义:Java虚拟机,Java二进制字节码的运行环境好处: 一次编写,到处运行自动内存管理,垃圾回收的功能数组下标越界检查(会抛异常,不会覆盖到其他代码…...
【SQL学习笔记1】增删改查+多表连接全解析(内附SQL免费在线练习工具)
可以使用Sqliteviz这个网站免费编写sql语句,它能够让用户直接在浏览器内练习SQL的语法,不需要安装任何软件。 链接如下: sqliteviz 注意: 在转写SQL语法时,关键字之间有一个特定的顺序,这个顺序会影响到…...
MySQL用户和授权
开放MySQL白名单 可以通过iptables-save命令确认对应客户端ip是否可以访问MySQL服务: test: # iptables-save | grep 3306 -A mp_srv_whitelist -s 172.16.14.102/32 -p tcp -m tcp --dport 3306 -j ACCEPT -A mp_srv_whitelist -s 172.16.4.16/32 -p tcp -m tcp -…...
解析奥地利 XARION激光超声检测系统:无膜光学麦克风 + 无耦合剂的技术协同优势及多元应用
在工业制造领域,无损检测(NDT)的精度与效率直接影响产品质量与生产安全。奥地利 XARION开发的激光超声精密检测系统,以非接触式光学麦克风技术为核心,打破传统检测瓶颈,为半导体、航空航天、汽车制造等行业提供了高灵敏…...
GraphQL 实战篇:Apollo Client 配置与缓存
GraphQL 实战篇:Apollo Client 配置与缓存 上一篇:GraphQL 入门篇:基础查询语法 依旧和上一篇的笔记一样,主实操,没啥过多的细节讲解,代码具体在: https://github.com/GoldenaArcher/graphql…...
用递归算法解锁「子集」问题 —— LeetCode 78题解析
文章目录 一、题目介绍二、递归思路详解:从决策树开始理解三、解法一:二叉决策树 DFS四、解法二:组合式回溯写法(推荐)五、解法对比 递归算法是编程中一种非常强大且常见的思想,它能够优雅地解决很多复杂的…...
李沐--动手学深度学习--GRU
1.GRU从零开始实现 #9.1.2GRU从零开始实现 import torch from torch import nn from d2l import torch as d2l#首先读取 8.5节中使用的时间机器数据集 batch_size,num_steps 32,35 train_iter,vocab d2l.load_data_time_machine(batch_size,num_steps) #初始化模型参数 def …...
[QMT量化交易小白入门]-六十二、ETF轮动中简单的评分算法如何获取历史年化收益32.7%
本专栏主要是介绍QMT的基础用法,常见函数,写策略的方法,也会分享一些量化交易的思路,大概会写100篇左右。 QMT的相关资料较少,在使用过程中不断的摸索,遇到了一些问题,记录下来和大家一起沟通,共同进步。 文章目录 相关阅读1. 策略概述2. 趋势评分模块3 代码解析4 木头…...
MySQL基本操作(续)
第3章:MySQL基本操作(续) 3.3 表操作 表是关系型数据库中存储数据的基本结构,由行和列组成。在MySQL中,表操作包括创建表、查看表结构、修改表和删除表等。本节将详细介绍这些操作。 3.3.1 创建表 在MySQL中&#…...
