Redis:快速键值存储的入门指南

 一、什么是Redis?

Redis,全称为Remote Dictionary Server,是一种开源的、高性能的键值(Key-Value)存储系统。与传统的关系型数据库不同,Redis将数据主要存储在内存中,因此能够提供极低延迟的数据读写操作,这使其在需要高速数据访问的应用场景中表现卓越。Redis不仅仅是一个简单的键值存储,还具备丰富的数据结构和多样的功能,因而广泛应用于各种场景。

 1.1 Redis的设计理念

Redis的设计哲学集中在四个核心原则上:简单、高速、持久化和灵活性。它的简单性表现在易于使用的API和直观的命令,而高速则源于内存存储架构和优化的数据结构。持久化功能使得数据在系统崩溃或重启时依然可以被恢复。灵活性则通过支持多种数据结构和扩展机制得以体现。

 1.2 Redis的基本特性

- **内存存储**:数据主要存储在内存中,提供快速的读写速度。
- **持久化**:支持将数据定期保存到磁盘,防止数据丢失。
- **多种数据结构**:支持字符串、列表、集合、有序集合和哈希等多种数据类型。
- **高可用性**:通过主从复制和分片机制,支持高可用性和负载均衡。
- **高级特性**:支持事务、Lua脚本以及发布/订阅功能。

 1.3 Redis的发展历程

Redis由Salvatore Sanfilippo在2009年开始开发,最初是为了应对他在工作中遇到的性能瓶颈。随着时间的推移,Redis因其出色的性能和灵活性而迅速获得了社区的认可。以下是一些关键的时间点:

  • 2009年:第一个版本发布,主要作为一个简单的键值存储系统。
  • 2010年:开始支持更多的数据类型,如列表、集合和排序集合。
  • 2011年:引入了持久化功能,允许将内存中的数据定期或在断电时保存到磁盘上,以防止数据丢失。
  • 2013年:发布了2.6版本,引入了Lua脚本支持,增强了事务处理能力。
  • 2015年:发布了3.0版本,引入了集群支持,增强了系统的可扩展性和可用性。
  • 2019年:发布了6.0版本,增加了模块化支持,允许通过插件扩展Redis的功能。

Redis的不断发展使其成为了许多大型互联网公司(如Twitter、GitHub、Stack Overflow)和中小型企业中不可或缺的组成部分。它不仅在技术上持续创新,还在社区中积累了大量的用户和贡献者,形成了丰富的文档和工具生态。

 二、Redis的作用和用途

Redis不仅是键值存储,还可以作为多种应用程序构建的基础。以下是Redis的主要用途:

2.1 缓存

场景描述: 在高流量的Web应用中,频繁访问数据库以获取静态或变化不大的数据会导致性能瓶颈。Redis可以作为一个缓存层,存储这些数据,从而减少对数据库的直接请求,显著提升应用响应速度。

import redis.clients.jedis.Jedis;public class CacheExample {public static void main(String[] args) {Jedis jedis = new Jedis("localhost", 6379);// 将数据缓存到Redis中jedis.set("lastVisited", "2023-07-23");// 从Redis中获取缓存数据String lastVisited = jedis.get("lastVisited");System.out.println("Last visited on: " + lastVisited);jedis.close();}
}

具体案例: 假设你正在开发一个新闻网站,首页上显示的是最新的头条新闻。由于新闻列表不会频繁更新,但访问量却非常高,因此可以将这些头条新闻的信息存储在Redis中。当用户访问首页时,首先尝试从Redis中获取数据,如果数据存在,则直接返回,无需访问数据库。只有当Redis中没有数据或者数据过期时,才会查询数据库并更新Redis中的缓存。

2.2 消息队列

场景描述: 在异步处理或分布式任务调度中,使用Redis的列表或发布/订阅功能可以构建高效的消息队列。

import redis.clients.jedis.Jedis;public class MessageQueueExample {public static void main(String[] args) {Jedis jedis = new Jedis("localhost", 6379);// 生产者:向队列添加消息jedis.rpush("message_queue", "Hello from producer!");// 消费者:从队列读取消息String message = jedis.blpop(0, "message_queue");System.out.println("Message received: " + message);jedis.close();}
}

具体案例: 假设有一个后台任务需要处理大量用户上传的照片,并将它们转换为不同的尺寸以适应不同设备。可以使用Redis的列表数据结构作为消息队列,每当有新照片上传时,就将其ID推入队列。后台处理服务器可以从队列中取出任务(即照片ID),然后执行相应的图像处理工作。

2.3 实时数据处理

场景描述: 对于需要实时分析大量数据流的应用,如监控系统、广告平台等,Redis可以提供低延迟的数据处理和统计。

import redis.clients.jedis.Jedis;public class RealtimeAnalyticsExample {public static void main(String[] args) {Jedis jedis = new Jedis("localhost", 6379);// 增加页面访问计数long pageViews = jedis.incr("page_views");System.out.println("Total page views: " + pageViews);// 保存用户行为jedis.zadd("user_activity", System.currentTimeMillis(), "User1 viewed productX");jedis.close();}
}

具体案例: 设想一个广告平台需要实时跟踪用户行为并进行广告投放决策。可以使用Redis的有序集合来存储每个广告的展示次数和点击次数,利用其范围查询功能,实时计算出哪些广告最有效,以便调整广告投放策略。

2.4 会话存储

场景描述: 在分布式Web应用中,用户会话数据需要在多个服务器间共享。使用Redis存储会话信息可以确保会话数据的集中管理,同时提供高可用性和一致性。

import redis.clients.jedis.Jedis;public class SessionStoreExample {public static void main(String[] args) {Jedis jedis = new Jedis("localhost", 6379);// 存储用户会话jedis.hset("session:123", "username", "JohnDoe");jedis.hset("session:123", "loginTime", "2023-07-23T12:00Z");// 读取用户会话String username = jedis.hget("session:123", "username");String loginTime = jedis.hget("session:123", "loginTime");System.out.println("Username: " + username + ", Login time: " + loginTime);jedis.close();}
}

具体案例: 考虑一个在线购物平台,用户登录后,其会话信息(如登录状态、购物车内容等)需要在集群中的任何服务器上都可以访问。通过将这些会话数据存储在Redis中,可以实现跨服务器的会话共享,确保用户在切换服务器时仍然保持登录状态和购物车数据的连续性。

2.5 排行榜

场景描述: 在游戏、社交媒体或电商网站中,实时更新的排行榜可以激发用户的参与度。Redis的有序集合非常适合此类应用,可以轻松地实现基于分数的排序和排名。

import redis.clients.jedis.Jedis;public class LeaderboardExample {public static void main(String[] args) {Jedis jedis = new Jedis("localhost", 6379);// 更新用户分数jedis.zadd("leaderboard", 1000, "Player1");jedis.zadd("leaderboard", 800, "Player2");// 获取前10名玩家Set<String> topPlayers = jedis.zrevrange("leaderboard", 0, 9);System.out.println("Top players: " + topPlayers);jedis.close();}
}

具体案例: 以一个在线游戏为例,玩家的得分需要实时更新并显示在排行榜上。可以使用Redis的有序集合,将玩家ID作为成员,得分作为分数,这样就可以快速地添加新的得分、更新现有得分,并获取得分最高的玩家列表。

2.6 分布式锁

场景描述: 在分布式系统中,为了保证资源的一致性,需要在多个节点间协调对共享资源的访问。Redis可以用来实现分布式锁机制。

import redis.clients.jedis.Jedis;
import java.util.concurrent.TimeUnit;public class DistributedLockExample {private static final String LOCK_NAME = "distributed_lock";public static void main(String[] args) {Jedis jedis = new Jedis("localhost", 6379);// 尝试获取锁,设置超时时间if (jedis.setnx(LOCK_NAME, "lock_acquired") == 1) {jedis.expire(LOCK_NAME, 30); // 锁的有效期为30秒try {// 在持有锁的情况下执行关键操作System.out.println("Critical section executed.");} finally {// 释放锁if (jedis.get(LOCK_NAME).equals("lock_acquired")) {jedis.del(LOCK_NAME);}}} else {System.out.println("Lock is already held by another process.");}jedis.close();}
}

具体案例: 在一个分布式支付系统中,当处理退款或转账时,同一笔交易不能同时被多个节点处理,否则会导致账户余额错误。使用Redis的SETNX命令(现已被SET命令的NX选项替代)可以实现一个简单的分布式锁,确保同一时刻只有一个节点能够处理这笔交易。

三、Redis的数据结构

Redis支持多种数据结构,每种结构都适合不同应用场景。以下是Redis主要的数据结构及其应用:

3.1 字符串(Strings)

作为Redis最基本的数据类型,字符串可以存储任何类型的数据,包括照片、视频等二进制数据。每个字符串的最大大小限制为512MB。字符串支持常见的操作,如设置、获取、追加和修改。它们适用于缓存简单的数据,如用户信息、配置信息等。

3.2 列表(Lists)

列表是由有序字符串组成的集合,支持从两端推入和弹出元素。列表可用于实现消息队列、任务队列以及其他需要维护顺序的数据结构。通过`LRANGE`命令,开发者可以高效获取列表中的子集,适用于显示最近活动、评论等场景。

3.3 集合(Sets)

集合是由唯一字符串组成的无序集合,支持高效的添加、删除和查找操作。它可以被用于实现标签的集合、社交媒体的好友列表等。集合支持多种集合操作,如并集、交集和差集,使得开发者可以轻松处理复杂的集合运算。

3.4 有序集合(Sorted Sets)

有序集合在集合的基础上增加了每个元素一个分数,用于排序。Sorted Sets可用于实现排名系统,支持高效的范围查询和获取排名最高的元素,非常适合实时排行榜、竞赛排名等应用。

3.5 哈希表(Hashes)

哈希表是键值对的集合,适合存储对象类型的数据。它特别适用于存储用户信息、商品信息等结构化数据。哈希表支持对某个字段的增删改查操作,非常灵活,方便开发者管理复杂的数据结构。

四、Redis的持久化机制

Redis的持久化机制是确保数据安全的重要保障。通过持久化,Redis能够在系统崩溃或重启后恢复数据。Redis支持两种主要的持久化方式:RDB(Redis Database)和AOF(Append Only File)。

4.1 RDB持久化

RDB持久化通过定期将内存中的数据快照保存到磁盘中来实现。开发者可以通过配置持久化的频率和条件来控制RDB的行为。此方式适合对性能要求高的场景,但如果在快照之间发生崩溃,将可能会丢失那些未保存的写入数据。

4.2 AOF持久化

AOF持久化通过将每个写操作附加到日志文件中来保存数据。这种方式更加精细,能够保障更高的持久化准确性。开发者可以设置AOF文件的同步策略,如每次写操作后同步、每秒同步或从不同步。在该文件中,Redis可使用`rewrite`来进行日志压缩,避免文件过于庞大。

4.3 持久化的选择

开发者可以根据具体的应用需求选择合适的持久化方式。既可以选择仅使用RDB,也可以组合使用AOF。在大多数场景下,AOF文件的持久化方式更为可靠,而RDB文件在需要快速恢复和减少数据丢失时更加有效。

五、Redis的高级特性

5.1 事务

Redis支持事务处理,允许将多个命令聚合在一起,以确保其原子性。通过`MULTI`、`EXEC`、`WATCH`等命令,开发者可以控制命令的执行流程,实现复杂的业务逻辑。

5.2 Lua脚本

Redis内置的Lua脚本支持允许开发者在Redis端执行多行命令,减少了客户端和服务端之间的网络往返,提高了性能。通过使用Lua脚本,开发者可以实现复杂的批处理操作和业务逻辑,增强了Redis的灵活性。

5.3 发布/订阅

Redis的发布/订阅功能支持消息的广播机制。通过`PUBLISH`、`SUBSCRIBE`和`UNSUBSCRIBE`命令,应用程序可以轻松实现消息的实时发布与接收,适用于聊天系统、实时通知等场景。

5.4 地理空间(Geospatial)

Redis提供了地理空间功能,可以存储和查询地理位置信息,支持一系列的地理计算。开发者能够使用`GEOADD`、`GEORADIUS`和`GEODIST`等命令,轻松处理与位置相关的任务,在社交应用、外卖服务等
 

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

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

相关文章

【Unity2D 2022:UI】TextMeshPro组件无法显示中文

在Unity中创建了一个预制体Card&#xff0c;上面挂载了一些Text Mesh Pro组件用来显示卡牌信息。但是在输入文字后&#xff0c;发现无法显示中文&#xff1a; 解决方法如下&#xff1a; 一、导入字体文件&#xff08;ttf格式&#xff09;和常用字字集&#xff08;txt格式&…

Linux--Socket编程UDP

前文&#xff1a;Socket套接字编程 UDP协议特点 无连接&#xff1a;UDP在发送数据之前不需要建立连接&#xff0c;减少了开销和发送数据之前的时延。尽最大努力交付&#xff1a;UDP不保证可靠交付&#xff0c;主机不需要维持复杂的连接状态表。面向报文&#xff1a;UDP对应用层…

算法:[递归/搜索/回溯]二叉树的深搜

目录 题目一&#xff1a;计算布尔二叉树的值 题目二&#xff1a;求根节点到叶节点数字之和 题目三&#xff1a;二叉树剪枝 题目四&#xff1a;验证二叉搜索树 题目五&#xff1a;二叉搜索树中第k小的元素 题目六&#xff1a;二叉树的所有路径 题目一&#xff1a;计算布尔…

【C语言】宏定义常量加 ; 的错误

我在使用宏定义常量定义二维数组的时候&#xff0c;编译器报错&#xff1a;应输入“]”&#xff0c;如下&#xff1a; 原因是宏定义不是C语言规定的语句&#xff0c;它的结尾不加 ; 。在上图的 int mine[EASY_ROWS][EASY_COLS]; 中&#xff0c;把 EASY_ROWS 替换为了 9;2; &…

【秋招笔试题】小明的美食

解析&#xff1a;思维题。由于需要互不相同&#xff0c;每次操作取重复的值与最大值相加即可&#xff0c;这样即可保证相加后不会新增重复的值。因此统计重复值即可。 #include <iostream> #include <algorithm>using namespace std; const int maxn 1e5 5; int…

大模型算法面试题(十一)

本系列收纳各种大模型面试题及答案。 1、说一下目前主流或前沿的预训练模型&#xff0c;包括nlp&#xff08;百度ERNIE3.0&#xff0c;华为NEZHA&#xff0c;openAI gpt-3&#xff0c;nvidia MegatronLM&#xff0c;macrosoft T5&#xff09;和cv&#xff08;我只知道CLIP&…

wordpress主题Typecho仿百度响应式主题Xaink

wordpress主题Typecho仿百度响应式主题Xaink 新闻类型博客主题&#xff0c;简洁好看&#xff0c;适合资讯类、快讯类、新闻类博客建站&#xff0c;响应式设计&#xff0c;支持明亮和黑暗模式 直接下载 zip 源码->解压后移动到 Typecho 主题目录->改名为xaink->启用

内衣洗衣机和手洗哪个干净?推荐五款品质优良精品

在日常生活中&#xff0c;内衣洗衣机已成为现代家庭必备的重要家电之一。选择一款耐用、质量优秀的内衣洗衣机&#xff0c;不仅可以减少洗衣负担&#xff0c;还能提供高效的洗涤效果。然而&#xff0c;市场上众多内衣洗衣机品牌琳琅满目&#xff0c;让我们往往难以选择。那么&a…

实时捕获数据库变更

1.CDC概述 CDC 的全称是 Change Data Capture &#xff0c;在广义的概念上&#xff0c;只要能捕获数据变更的技术&#xff0c;我们都可以称为 CDC 。我们目前通常描述的CDC 技术主要面向数据库的变更&#xff0c;是一种用于捕获数据库中数据变更的技术&#xff0c;CDC 技术应用…

Linux嵌入式学习——数据结构——队列

一、概念 1&#xff09;定义 是只允许在一端进行插入操作&#xff0c;而在另一端进行删除操作的线性表 队列 是一种 先进先出&#xff08;First In First Out&#xff09; 的线性表 线性表有顺序存储和链式存储&#xff0c;栈是线性表&#xff0c;所以有这两种存储方式 同样…

【在开发小程序的时候如何排查问题】

在开发小程序的时候如何排查问题 在最近开发小程序的时候&#xff0c;经常出现本地在浏览器中调试没有问题&#xff0c;但是一发布到预发环境就出现各种个样的问题 手机兼用性问题 有时候会出现苹果&#x1f34e;手机键盘弹出&#xff0c;导致ui界面高度出现异常边界问题&#…

Arduino IDE界面和设置(基础知识)

Arduino IDE界面和设置&#xff08;基础知识&#xff09; 1-2 Arduino IDE界面和设置如何来正确选择Arduino开发板型号如何正确选择Arduino这个端口如何来保存一个Arduino程序Arduino ide 的界面功能按钮验证编译上传新建打开保存工作状态 1-2 Arduino IDE界面和设置 大家好这…

如何穿透模糊,还原图片真实面貌

目录 图像清晰化的魔法棒&#xff1a;AI如何穿透模糊&#xff0c;还原图片真实面貌 前言 论文背景 论文思路 模型介绍 复现过程 演示视频 使用方式 本文所涉及所有资源均在传知代码平台可获取。 图像清晰化的魔法棒&#xff1a;AI如何穿透模糊&#xff0c;还原图片真实面貌 在我…

全网最最实用--模型高效推理:量化基础

文章目录 一、量化基础--计算机中数的表示1. 原码&#xff08;Sign-Magnitude&#xff09;2. 反码&#xff08;Ones Complement&#xff09;3. 补码&#xff08;Twos Complement&#xff09;4. 浮点数&#xff08;Floating Point&#xff09;a.常用的浮点数标准--IEEE 754(FP32…

状态机 XState 使用

状态机 一般指的是有限状态机&#xff08;Finite State Machine&#xff0c;FSM&#xff09;&#xff0c;又可以称为有限状态自动机&#xff08;Finite State Automation&#xff0c;FSA&#xff09;&#xff0c;简称状态机&#xff0c;它是一个数学模型&#xff0c;表示有限个…

【计算机网络】数据链路层实验

一&#xff1a;实验目的 1&#xff1a;学习WireShark软件的抓包操作&#xff0c;分析捕获的以太网的MAC帧结构。 2&#xff1a;学习网络中交换机互相连接、交换机连接计算机的拓扑结构&#xff0c;理解虚拟局域网&#xff08;WLAN&#xff09;的通信机制。 3&#xff1a;学习…

cas 和 synchronized 优化过程

cas 什么是CAS CAS:全称Compareandswap&#xff0c;字⾯意思:”⽐较并交换“&#xff0c;⼀个CAS涉及到以下操作&#xff1a; 我们假设内存中的原数据V&#xff0c;旧的预期值A&#xff0c;需要修改的新值B。 1. ⽐较A与V是否相等。&#xff08;⽐较&#xff09; 2. 如果⽐较…

ubuntu22.04单个网口两个IP

其中 4网段IP可用来上网&#xff0c;3 网段用来内网 界面显示: 配置文件&#xff1a; 01-network-manager-all.yaml 放在 /etc/netplan/ # Let NetworkManager manage all devices on this systemnetwork:version: 2renderer: networkdethernets:eth0:dhcp4: falsedhcp6: …

开放式耳机哪个牌子好?五大超值机型整理,速速收藏!!

大家都知道现在的开放式耳机是越来越火了&#xff0c;后台也有非常多的小伙伴来私信&#xff0c;作为一个耳机测评师&#xff0c;当然是为了你们服务啦&#xff0c;所以这一期文章&#xff0c;就是为了个大家答疑解惑&#xff0c;告诉大家如何才能选购出一款比较好用的开放式耳…

万字长文详解Java反射技术 | JavaSE | Java进阶知识 | 源码

&#x1f64b;大家好&#xff01;我是毛毛张! &#x1f308;个人首页&#xff1a; 神马都会亿点点的毛毛张 &#x1f4cc;今天分享的是JavaSE中的进阶知识&#x1f6d1;&#xff1a;反射技术。内容有点长&#xff0c;非常全面&#xff0c;记得点赞&#x1f44d;、收藏✅加关…