深入剖析 Redis 基础及其在 Java 应用中的实战演练
引言
在现代分布式系统和高并发应用中,缓存系统是不可或缺的一环,而 Redis 作为一种高性能的内存数据存储以其丰富的数据结构和快速的读写性能,成为了众多开发者的首选。本篇博客将详细介绍 Redis 的基础知识,并通过 Java 代码演示其在实际项目中的应用。
目录
- 什么是 Redis?
- Redis 数据结构详解
- Redis 与其他 NoSQL 数据库的对比
- 在 Java 中使用 Redis
- 使用 Jedis 操作 Redis
- 使用 Lettuce 操作 Redis
- Redis 的应用场景
- 实战演练:构建一个简单的缓存系统
- 结论与最佳实践
1. 什么是 Redis?
Redis(Remote Dictionary Server)是一种开源的内存数据结构存储系统,支持多种数据结构如字符串、哈希、列表、集合、有序集合等。Redis 提供了持久化的特性,可以将数据存储在磁盘上,重启后可以重新加载。同时,Redis 还支持复制、Lua 脚本、LRU 驱逐、事务和不同级别的磁盘持久化,并通过 Redis Sentinel 和 Redis Cluster 提供自动分区和高可用性。
2. Redis 数据结构详解
- 字符串(String):Redis 的最基本的数据类型,可以存储任何类型的值。
- 哈希(Hash):用于存储对象的键值对集合,特别适合存储对象。
- 列表(List):一个简单的字符串列表,可以添加元素到列表的头部或尾部。
- 集合(Set):无序集合中的元素都是唯一的。
- 有序集合(Sorted Set):类似集合,但每个元素都会关联一个得分,元素按得分排序。
3. Redis 与其他 NoSQL 数据库的对比
特性 | Redis | MongoDB | Cassandra |
---|---|---|---|
数据模型 | 键值存储,多种数据结构 | 文档存储 | 宽列存储 |
持久化 | 内存存储 + 持久化 | 持久化存储 | 持久化存储 |
读写性能 | 高 | 中等 | 高 |
扩展性 | 垂直扩展,支持集群 | 水平扩展 | 水平扩展 |
使用场景 | 缓存,会话管理,计数器 | 文档存储,查询 | 大规模数据写入 |
4. 在 Java 中使用 Redis
使用 Jedis 操作 Redis
Jedis 是一个简单易用的 Java Redis 客户端。下面是使用 Jedis 的示例代码:
import redis.clients.jedis.Jedis;public class JedisExample {public static void main(String[] args) {// 连接本地的 Redis 服务Jedis jedis = new Jedis("localhost");System.out.println("连接成功");// 设置 redis 字符串数据jedis.set("name", "Redis");System.out.println("存储的字符串为: " + jedis.get("name"));// 操作哈希jedis.hset("user:1000", "name", "John Doe");jedis.hset("user:1000", "email", "john.doe@example.com");System.out.println("存储的哈希为: " + jedis.hgetAll("user:1000"));jedis.close();}
}
使用 Lettuce 操作 Redis
Lettuce 是另一个功能强大的 Java Redis 客户端,支持异步和响应式编程模型。下面是使用 Lettuce 的示例代码:
import io.lettuce.core.RedisClient;
import io.lettuce.core.api.sync.RedisCommands;
import io.lettuce.core.api.StatefulRedisConnection;public class LettuceExample {public static void main(String[] args) {// 连接本地的 Redis 服务RedisClient redisClient = RedisClient.create("redis://localhost:6379");StatefulRedisConnection<String, String> connection = redisClient.connect();RedisCommands<String, String> syncCommands = connection.sync();// 设置 redis 字符串数据syncCommands.set("name", "Redis");System.out.println("存储的字符串为: " + syncCommands.get("name"));// 操作哈希syncCommands.hset("user:1000", "name", "Jane Doe");syncCommands.hset("user:1000", "email", "jane.doe@example.com");System.out.println("存储的哈希为: " + syncCommands.hgetall("user:1000"));connection.close();redisClient.shutdown();}
}
5. Redis 的应用场景
- 缓存:提高数据访问速度,减轻数据库负载。
- 会话存储:在分布式系统中存储用户会话信息。
- 实时统计:如网站访问量统计、在线用户统计。
- 消息队列:利用 Redis 的列表、发布订阅等功能实现消息队列。
- 排行榜:使用有序集合来实现高效的排行榜功能。
6. 实战演练:构建一个简单的缓存系统
下面我们将构建一个简单的缓存系统,使用 Redis 来存储缓存数据,并在 Java 应用中进行操作。
import redis.clients.jedis.Jedis;import java.util.HashMap;
import java.util.Map;public class SimpleCacheSystem {private Jedis jedis;private final int CACHE_EXPIRATION = 60 * 5; // 缓存有效期为5分钟public SimpleCacheSystem() {this.jedis = new Jedis("localhost");}public void put(String key, String value) {jedis.setex(key, CACHE_EXPIRATION, value);}public String get(String key) {return jedis.get(key);}public void delete(String key) {jedis.del(key);}public Map<String, String> getAllKeys() {Map<String, String> allKeys = new HashMap<>();for (String key : jedis.keys("*")) {allKeys.put(key, jedis.get(key));}return allKeys;}public static void main(String[] args) {SimpleCacheSystem cache = new SimpleCacheSystem();// 添加缓存数据cache.put("user:1001", "Alice");cache.put("user:1002", "Bob");// 获取缓存数据System.out.println("user:1001 = " + cache.get("user:1001"));// 删除缓存数据cache.delete("user:1002");// 获取所有缓存数据System.out.println("所有缓存数据: " + cache.getAllKeys());}
}
7. 结论与最佳实践
Redis 作为一种高性能的内存数据存储,广泛应用于各类高并发、高性能的应用场景。在 Java 应用中使用 Redis,可以显著提升系统的响应速度和性能。以下是一些最佳实践:
- 合理设置过期时间:避免缓存雪崩和缓存穿透。
- 使用连接池:提高 Redis 连接的利用率。
- 监控性能:使用 Redis 的性能监控工具,及时发现和解决性能瓶颈。
相关文章:
深入剖析 Redis 基础及其在 Java 应用中的实战演练
引言 在现代分布式系统和高并发应用中,缓存系统是不可或缺的一环,而 Redis 作为一种高性能的内存数据存储以其丰富的数据结构和快速的读写性能,成为了众多开发者的首选。本篇博客将详细介绍 Redis 的基础知识,并通过 Java 代码演…...

Why I‘m getting 404 Resource Not Found to my newly Azure OpenAI deployment?
题意:为什么我新部署的Azure OpenAI服务会出现404资源未找到的错误? 问题背景: Ive gone through this quickstart and I created my Azure OpenAI resource created a model deployment which is in state succeedded. I also playaround …...

【word导出带图片】使用docxtemplater导出word,通知书形式的word
一、demo-导出的的 二、代码操作 1、页面呈现 项目要求,所以页面和导出来的word模版一致 2、js代码【直接展示点击导出的js代码】 使用插件【先下载这五个插件,然后页面引入插件】 import docxtemplater from docxtemplater import PizZip from pizzip …...
微信小程序路由跳转之间的区别
navigateTo: 功能描述: navigateTo用于保留当前页面,跳转到应用内的某个页面。但是不能跳到 tabbar 页面。 页面栈变化: 当使用navigateTo进行页面跳转时,当前页面会被推入页面栈中,但不会被销毁࿰…...

centos安装docker并配置加速器
docker安装与卸载: 1、检查当前是否安装docker yum list installed | grep docker2、卸载docker 根据yum list installed | grep docker查询出来的内容,逐个进行删除 yum remove docker.x86 64 -y3、启动与关闭docker 4、删除/etc/docker文件夹 如果…...

【软件测试】设计测试用例
目录 📕引言 🍀测试用例 🚩概念 🚩设计测试用例的万能公式 🏀常规思考逆向思维发散性思维 🏀万能公式 🎄设计测试用例的方法 🚩基于需求的设计方法 🏀明确需求中…...

Kafka【十三】消费者消费消息的偏移量
偏移量offset是消费者消费数据的一个非常重要的属性。默认情况下,消费者如果不指定消费主题数据的偏移量,那么消费者启动消费时,无论当前主题之前存储了多少历史数据,消费者只能从连接成功后当前主题最新的数据偏移位置读取&#…...
Python 的语法元素(容易忘记的)
文章目录 同步赋值同步赋值的相关操作同步赋值的原理 同步赋值 同步赋值是 Python 语言的一个强大功能,它让代码更加紧凑和高效,尤其是在处理多个变量时。 同步赋值的相关操作 简单同步赋值: 如果你想同时初始化多个变量到不同的值&#x…...

找到字符串中所有字母异位词问题
欢迎跳转我的主页:羑悻的小杀马特-CSDN博客 目录: 一题目简述: 二思路汇总: 三解答代码: 一题目简述: leetcode题目链接:. - 力扣(LeetCode) 二思路汇总: …...
QEMU用户模式测试AARCH64程序
QEMU的两种模式 QEMU(快速模拟器)是一个开源的机器模拟器和虚拟化器,它能够模拟多种处理器架构,并且可以在不同平台上运行。QEMU 支持两种模式:用户模式和系统模式。 用户模式(User Mode)&…...

机器学习(五) -- 监督学习(8) --神经网络2
机器学习系列文章目录及序言深度学习系列文章目录及序言 上篇:机器学习(五) -- 监督学习(8) --神经网络1 下篇: 前言 tips:标题前有“***”的内容为补充内容,是给好奇心重的宝宝看…...

物联网之PWM呼吸灯、脉冲、LEDC
MENU 前言原理硬件电路设计软件程序设计analogWrite()函数实现呼吸灯效果LEDC输出PWM信号 前言 学习制作呼吸灯,通过LED灯的亮度变化来验证PWM不同电压的输出。呼吸灯是指灯光在单片机的控制之下完成由亮到暗的逐渐变化,感觉好像是人在呼吸。 原理 脉冲宽…...

Python利用pyecharts实现数据可视化
小编会持续更新知识笔记,如果感兴趣可以三连支持。闲来无事,水文一篇,不过上手实践一下倒还是挺好玩的,这一块知识说不定以后真可以尝试拿来做数据库的报表显示。 有梦别怕苦,想赢别喊累。 目录 前言 JSON数据格式的…...

网恋照妖镜源码搭建教程
文章目录 前言创建网站1.打开网站设置 配置ssl2.要打开强制HTTPS,用宝塔免费的ssl证书即可,也可以使用其他证书,必须是与域名匹配的3.上传文件至根目录进行解压4.解压后,修改文件 sc.php 里面的内容5.其余探索 前言 前俩年很火的…...

STM32
(以下操作环境为Keil5和proteus8.9) 八种输入输出模式及他们的工作模式 分析如下 总线:总线提供了数据在不同组件(如处理器、内存、输入输出设备等)之间传输的路径,使数据能够快速、准确地在系统内流动。 …...

用手机做抢答器 低预算知识竞赛活动的选择
使用手机作为抢答器是低预算竞赛活动的一个理想选择。随着智能手机的普及,传统抢答器已经被手机抢答器所替代,这种转变不仅降低了成本,而且提供了更大的灵活性和便利性。通过手机扫码登录竞赛软件,参赛者可以直接在手机上进行抢答…...

ELK学习笔记(二)——使用K8S部署Kibana8.15.0
上篇文章我们完成了,ES的集群部署,如果还没有看过上篇文章的兄弟,可以去看看。 ELK学习笔记(一)——使用K8S部署ElasticSearch8.15.0集群 话不多说,接下来直接进入kibana的搭建 一、下载镜像 #1、下载官方…...
报错:CPU指令集的问题
bug描述 我在运行CMAQ中的icon时,遇到bug: Please verify that both the operating system and the processor support Intel(R) X87, CMOV, MMX, FXSAVE, SSE, SSE2, SSE3, SSSE3, SSE4_1, SSE4_2, POPCNT and AVX instructions.解决办法 经过查询&a…...

Type-C接口诱骗取电快充方案
Type-C XSP08Q 快充协议芯片是一种新型电源管理芯片,主要负责控制充电电流和电压等相关参数,从而实现快速充电功能。Type-C XSP08Q快充协议是在Type-C接口基础上,加入了XSP08Q协议芯片的支持,很大程度上提升了充电速度。 正常情况…...

图像白平衡
目录 效果 背景 什么是白平衡? 实现原理 将指定图色调调整为参考图色调主要流程 示例代码 效果 将图一效果转换为图二效果色调: 调整后,可实现色调对换 背景 现有两张图像,色调不一致,对于模型重建会有影响。因…...

Linux 文件类型,目录与路径,文件与目录管理
文件类型 后面的字符表示文件类型标志 普通文件:-(纯文本文件,二进制文件,数据格式文件) 如文本文件、图片、程序文件等。 目录文件:d(directory) 用来存放其他文件或子目录。 设备…...

【kafka】Golang实现分布式Masscan任务调度系统
要求: 输出两个程序,一个命令行程序(命令行参数用flag)和一个服务端程序。 命令行程序支持通过命令行参数配置下发IP或IP段、端口、扫描带宽,然后将消息推送到kafka里面。 服务端程序: 从kafka消费者接收…...

K8S认证|CKS题库+答案| 11. AppArmor
目录 11. AppArmor 免费获取并激活 CKA_v1.31_模拟系统 题目 开始操作: 1)、切换集群 2)、切换节点 3)、切换到 apparmor 的目录 4)、执行 apparmor 策略模块 5)、修改 pod 文件 6)、…...

Python:操作 Excel 折叠
💖亲爱的技术爱好者们,热烈欢迎来到 Kant2048 的博客!我是 Thomas Kant,很开心能在CSDN上与你们相遇~💖 本博客的精华专栏: 【自动化测试】 【测试经验】 【人工智能】 【Python】 Python 操作 Excel 系列 读取单元格数据按行写入设置行高和列宽自动调整行高和列宽水平…...

为什么需要建设工程项目管理?工程项目管理有哪些亮点功能?
在建筑行业,项目管理的重要性不言而喻。随着工程规模的扩大、技术复杂度的提升,传统的管理模式已经难以满足现代工程的需求。过去,许多企业依赖手工记录、口头沟通和分散的信息管理,导致效率低下、成本失控、风险频发。例如&#…...

CentOS下的分布式内存计算Spark环境部署
一、Spark 核心架构与应用场景 1.1 分布式计算引擎的核心优势 Spark 是基于内存的分布式计算框架,相比 MapReduce 具有以下核心优势: 内存计算:数据可常驻内存,迭代计算性能提升 10-100 倍(文档段落:3-79…...
基础测试工具使用经验
背景 vtune,perf, nsight system等基础测试工具,都是用过的,但是没有记录,都逐渐忘了。所以写这篇博客总结记录一下,只要以后发现新的用法,就记得来编辑补充一下 perf 比较基础的用法: 先改这…...
Swagger和OpenApi的前世今生
Swagger与OpenAPI的关系演进是API标准化进程中的重要篇章,二者共同塑造了现代RESTful API的开发范式。 本期就扒一扒其技术演进的关键节点与核心逻辑: 🔄 一、起源与初创期:Swagger的诞生(2010-2014) 核心…...

OPENCV形态学基础之二腐蚀
一.腐蚀的原理 (图1) 数学表达式:dst(x,y) erode(src(x,y)) min(x,y)src(xx,yy) 腐蚀也是图像形态学的基本功能之一,腐蚀跟膨胀属于反向操作,膨胀是把图像图像变大,而腐蚀就是把图像变小。腐蚀后的图像变小变暗淡。 腐蚀…...

使用LangGraph和LangSmith构建多智能体人工智能系统
现在,通过组合几个较小的子智能体来创建一个强大的人工智能智能体正成为一种趋势。但这也带来了一些挑战,比如减少幻觉、管理对话流程、在测试期间留意智能体的工作方式、允许人工介入以及评估其性能。你需要进行大量的反复试验。 在这篇博客〔原作者&a…...