深入剖析 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协议芯片的支持,很大程度上提升了充电速度。 正常情况…...

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

SAP Business One 与无锡哲讯:携手共创企业数字化未来
在当今快速发展的商业世界中,企业的数字化转型已成为提升竞争力的关键。在众多的数字化解决方案中,SAP Business One 以其强大的功能和灵活性脱颖而出。与此同时,无锡哲讯智能科技有限公司作为专业的 SAP 系统服务提供商,为企业带…...

Unity Adressables 使用说明(五)在运行时使用 Addressables(Use Addressables at Runtime)
一旦你将 Addressable assets 组织到 groups 并构建到 AssetBundles 中,就需要在运行时加载、实例化和释放它们。 Addressables 使用引用计数系统来确保 assets 只在需要时保留在内存中。 Addressables 初始化 Addressables 系统在运行时第一次加载 Addressable …...

什么是死锁,如何解决?
什么是死锁? 在并发编程中,死锁是指两个或多个进程在竞争资源时,互相等待无法继续执行的状态。这种情况发生时,每个进程都在等待其他进程释放它们所需要的资源,但同时又不释放自己占有的资源,导致所有进程…...

借助ChatGPT三步,完成课题申报书中研究价值部分写作全攻略指南
大家好,感谢关注。我是七哥,一个在高校里不务正业,折腾学术科研AI实操的学术人。关于使用ChatGPT等AI学术科研的相关问题可以和作者七哥(yida985)交流,多多交流,相互成就,共同进步,为大家带来最酷最有效的智能AI学术科研写作攻略。 撰写申请书中的“本课题的学术价值…...

IDEA取消自动选择光标所在行
今天出现了一个怪事: 当我使用IDEA编写代码的时候,单击下一行或者上一行的时候,莫名其妙它会自己选中一行,导致我要么是回车代码直接没了,要么是代码直接给我搞错位了,还得按ctrlz返回,十分的恶…...

VUE2.0 elementUI el-input-number 数据更新,视图不更新——基础积累
今天遇到一个问题,是关于el-input-number组件的,发现数据明明已经更改了,但是页面上组件输入框中还是之前的值。 比如上方输入框中,我输入120.5,就会出现下面的诡异现象 回显此值是120.779,但是页面上输入…...

JS中this指向问题
首先,this的绑定和定义的位置无关,它的指向只和调用方式有关,this只有在运行时才知道指向谁。 一,默认绑定 默认绑定,也可以说是独立函数调用,这时this指向window。 function foo() {console.log(this) …...

大厂面试:小米嵌入式面试题大全及参考答案(130+道 12万长文)
Flink 架构介绍 Flink 是一个分布式流处理和批处理框架,具有高吞吐、低延迟、高可靠等特点。其架构主要由以下几个部分组成: 客户端(Client):负责将作业提交到集群,并与作业管理器进行交互,获取作业的状态信息。客户端可以是命令行工具、IDE 插件或者自定义的应用程序。…...

React 更新界面
文章目录 发现宝藏引入 useState声明和使用状态多个组件的状态管理解析代码 状态的局部性和性能优化结论 发现宝藏 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。【宝藏入口】。 在 React 中ÿ…...

JavaSE-易错题集-001
1. AccessViolationException异常触发后,下列程序的输出结果为( ) 1 2 3 4 5 6 7 8 9 10 11 12 13 static void Main(string[] args) { try { throw new AccessViolationException(); Console.Write…...