Redis常用的八种场景

作为一名 Java后端人员,对 Redis肯定并不陌生,Redis作为一种内存数据库,以其速度之快在编程的舞台上纵横多年,那么,Redis到底适合哪些业务场景?今天就来聊一聊。

1. 缓存/数据库

缓存(Cache)是 Redis使用最广泛的场景之一,也是很多小伙伴结识 Redis的重要原因,在 8种10倍提升API性能的方式 文章中我们也强调了Redis可以作为缓存的来加速 API性能。如下图,在 WebServer和数据库之间会增加一层 Redis缓存,这样 WebServer可以直接从Redis中快速拿到数据返回,加快了 WebServer的响应速度。

举例:

  • 电商领域,可以缓存一些热门商品的静态信息或用户数据,这样,在大流量访问时,不用查询数据库,加速访问速度。
  • 配置中心,业务开发中,经常会使用一些全局配置,而且配置更改的频率很低,因此,可以把配置都加载到 Redis内存中,加快查询数据。

需要说明的是:很多时候,我们都会把 Redis的持久化功能打开,因此,在把 Redis当作缓存的同时,同样把 Redis当作数据库在使用。

2. 分布式锁

分布式锁(Distributed Lock)也是 Redis使用最广泛的场景之一,分布式系统中,当我们在处理有并发的业务场景时,为了保证线程安全,通常通常会使用分布式锁,单机下,Redis通常使用 SET NX(if Not Exist)和 PX(过期时间)来创建锁,指令如下:

# 如果key不存,set key=value,
# 失效时间是 expiration毫秒
SET key value NX PX expiration

在 Java中,Redission是一个基于 Redis的分布式Java对象映射(Java Redis Client),它提供了丰富的特性和工具,示例代码展示了如何在 Redission框架中使用 Redis分布式锁:

import org.redisson.Redisson;
import org.redisson.api.RedissonClient;
import org.redisson.config.Config;public class RedissonExample {public static void main(String[] args) {Config config = new Config();config.useSingleServer().setAddress("redis://127.0.0.1:6379");RedissonClient redisson = Redisson.create(config);// 使用分布式锁String lockKey = "lockKey";boolean isLocked = redisson.getLock(lockKey).tryLock();if (isLocked) {// 获得锁,执行相关操作System.out.println("Lock acquired successfully");redisson.getLock(lockKey).unlock(); // 释放锁} else {System.out.println("Failed to acquire lock");}redisson.shutdown(); // 关闭连接}
}

需要说明的是:除了Redis,Zookeeper也是实现分布式锁比较常用的一种技术方案。

3. 限流

限流(Rate Limiter)也是 Redis使用比较多的一个场景,限流是保护系统免受过载的一种方法,它可以确保在指定时间内对系统的请求进行限制。在 Redis 中,可以使用 SET、EXPIRE 和 Lua 脚本来实现简单的限流功能。

示例代码展示了Java Jedis 库实现基于令牌桶算法的 Redis 限流:

import redis.clients.jedis.Jedis;
import redis.clients.jedis.Response;
import redis.clients.jedis.Transaction;public class RateLimiter {private final Jedis jedis;private final String key;private final int capacity;private final int tokensPerSecond;public RateLimiter(Jedis jedis, String key, int capacity, int tokensPerSecond) {this.jedis = jedis;this.key = key;this.capacity = capacity;this.tokensPerSecond = tokensPerSecond;}/*** 用于检查是否允许请求,根据当前令牌数量和容量进行判断*/ public boolean allowRequest() {long now = System.currentTimeMillis();Transaction transaction = jedis.multi();// Add current time with scoretransaction.zadd(key, now, String.valueOf(now)); // Remove tokens that are older than 1 secondtransaction.zremrangeByScore(key, 0, now - 1000); // Get current number of tokensResponse<Long> sizeResponse = transaction.zcard(key); transaction.exec();long size = sizeResponse.get();// Check if number of tokens is within capacityreturn size <= capacity; }public static void main(String[] args) {Jedis jedis = new Jedis("localhost"); // Connect to Redis// Create rate limiterRateLimiter rateLimiter = new RateLimiter(jedis, "RateLimiterKey", 10, 5); for (int i = 0; i < 15; i++) {boolean allowed = rateLimiter.allowRequest();if (allowed) {System.out.println("Request allowed");} else {System.out.println("Request denied");}}// Close Redis connectionjedis.close(); }
}
4. 会话存储

会话(Session)也是 Redis常见的一种功能,熟悉 Spring的小伙伴肯定知道它也有一个 Session功能,那么它和 Redis的 Session有什么区别呢?

Spring Session是一个抽象层,提供与存储后端衔接能力,至于后端采用内存、数据库还是Redis存储Spring Session不关注。而 Redis Session是 Spring Session的一种具体实现,将会话数据存储在Redis中。

举例:存储用户登录信息:

#将用户的登录信息存储在 Redis中,key:userId, value:user登录信息
SET user:userId {"username": "xxx", "password": "xxx",...}
5. 发布/订阅

发布/订阅(Sub/Pub)是 Redis中一个类似于消息中间件(MQ)的功能,当我们的业务中有需要通过事件触发的场景时可以使用该功能,不过 Redis的 Sub/Pub功能还是比较简陋,有复杂的业务场景时还是推荐MQ。

举例

群聊,在实时聊天应用中,利用 Redis的发布/订阅功能实现消息广播。

实现事件通知系统,如新订单通知、新邮件提醒等。

#订阅频道
SUBSCRIBE channel_xxx
# 向频道中发送消息
PUBLISH channel_xxx "Message content"
6. 排名/排行榜

排名/排行榜(Rank/LeaderBoard)是 Redis中一个比较实用的功能,在文章热榜、游戏竞技或社区平台中,排行榜(Leaderboard)和排名(Ranking)系统是常见的功能,用于展示用户在特定活动、比赛或指标上的排名情况,而 Redis的有序集合(Sorted Set)是实现排行榜功能的理想数据结构,因为它可以存储每个成员的分数,并根据分数进行排序。

举例:

(1) 记录网站访问次数或文章阅读次数

# 添加文章的点击量
#将 Article1 的值增加1。如果Article1 不存在于有序集合中,
# 该命令会将 Article1 添加到集合,并设置值为1
ZINCRBY leaderboard 1 "Article1"
ZINCRBY leaderboard 1 "Article2"
ZINCRBY leaderboard 1 "Article3"# 获取 Article2的排名(从高到低排名)
ZREVRANK leaderboard "Article2" # 获点击量 Top10 的文章和点击量
ZREVRANGE leaderboard 0 9 WITHSCORES

(2) 实现用户积分排行榜

7. 计数

在 Redis中,可以使用 INCR、DECR 等命令来进行简单的计数操作。这些命令用于对键的值进行递增或递减操作,常用于实现计数器等功能。

常用计数命令:

# 对 key进行 +1 操作
INCR key
# 对key 进行 -1 操作
DECR key# 对 key进行 +n 操作
INCRBY key n
# 对 key进行 -n 操作
DECRBY key n

另外,在排名/排行榜中,ZINCRBY 是对 Sort set的一种计数方式。

举例:

  • 网站访问量计数器,可以实时统计网站的访问次数;
  • 点赞/喜欢计数器,对文章或内容的点赞或喜欢次数进行计数;
  • 用户在线状态统计,统计在线用户数量;
8. 地理位置应用

Redis的地理位置应用功能使用的场景比较有针对性,如果你不是在特定的领域,可能并不会使用该功能,它是 通过 Geo数据类型支持地理位置存储和检索,可以用于构建位置服务和地理位置相关的应用。

举例:

(1) 点过外卖的小伙伴肯定不陌生,外卖平台上,附近商家搜索功能。

# 查找经度12.087269,纬度39.412669 附近5 km的距离范围
GEORADIUS locations 12.087269 39.412669 5 km

(2) 打车平台,比如一些网约车平台,就可以把司机,乘客的位置信息(经纬度)通过Redis的Geo来实现距离计算等功能。

# 添加经纬度信息,经纬度是编造的,不一定真实
GEOADD locations 12.322389 39.125356 "Driver"
GEOADD locations 12.087269 39.412669 "Passenger"
# 计算司机和乘客两地点间的距离
GEODIST locations Driver Passenger
总结

本文介绍了Redis常见的 8种实用场景:

  • 缓存/数据库
  • 分布式锁
  • 限流
  • 会话存储
  • 发布/订阅
  • 排名/排行榜
  • 计数
  • 地理位置应用

如果你在业务中不确定是否需要引入 Redis时,可以参考本文,如果场景刚好命中其中一种,那么可以选择使用 Redis。如果你的业务场景不在这 8种常见场景中,不代表不能使用 Redis,可能需要你更多的技术调研来确认合适的技术方案。

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

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

相关文章

JS:给数字添加千分位符(每3位数用逗号隔开)

背景 如果一串数字的长度太长&#xff0c;就不方便阅读&#xff0c;因此可以采用分隔符对数字进行分割本文的分割规则是&#xff1a; 如果数字的长度大于等于5则进行分割&#xff0c;每3位数用逗号分割开 解决 数字可以分为&#xff1a;number类型的数字和字符串类型的数字&…

ATTCK 十大免费 工具和资源

01 eBook: Getting Started with ATT&CK 这本免费电子书将有关威胁情报、检测和分析、对手模拟和红队以及评估和工程的博客文章中的内容汇集到一个方便的软件包中。 02 CALDERA CALDERA是一个网络安全平台&#xff0c;旨在轻松自动化对手仿真&#xff0c;协助手动红队并自…

作为电子信息工程的学生,学完stm32后,是应该学fpga还是Linux?

作为电子信息工程的学生&#xff0c;学完stm32后&#xff0c;是应该学fpga还是Linux? 我自己也是电子信息工程专业出身&#xff0c;FPGA和Linux都是我们大三的专业课&#xff0c;都学过基础也做了基础 的项目&#xff0c;我自己的选择是Linux。最近很多小伙伴找我&#xff0c…

C#中.NET 7.0 Windows窗体应用通过EF访问已有数据库并实现追加、删除、修改、插入记录

目录 一、前言 1.Database.ExecuteSqlCommand 方法不被EF7.0支持 2.SET IDENTITY_INSERT Blog {ON,OFF}不起作用 3.主键和标识列分离&#xff0c;成功实现插入与修改 二、新建本文涉及的项目 三、程序设计 1.Form1.cs源码 2.Form1.cs[设计] 四、生成和测试 1.原始表 …

外卖小程序系统:数字化时代餐饮业的技术奇迹

在当今数字化时代&#xff0c;外卖小程序系统正以其强大的技术背后支持&#xff0c;成为餐饮业务的一项奇迹。这个系统不仅提供了便捷的点餐体验&#xff0c;更通过先进的技术手段&#xff0c;实现了高效订单处理、智能推荐以及实时配送追踪。下面&#xff0c;我们将深入探讨外…

HarmonyOS ArkTS语言,运行Hello World(二)

一、认识DevEco Studio界面 进入IDE后&#xff0c;我们首先了解一下基础的界面。整个IDE的界面大致上可以分为四个部分&#xff0c;分别是代码编辑区、通知栏、工程目录区以及预览区。 代码编辑区 1、中间的是代码编辑区&#xff0c;你可以在这里修改你的代码&#xff0c;以…

22年+21年 计算机能力挑战赛初赛C语言程序题 题解

22年 第14题&#xff1a;答案&#xff1a;33 #include<stdio.h> int x1; int f(int a) { static int x2;int n0;if(a%2){ static int x3;nx; }else { static int x5;nx; }return nx;} void main() { int sumx,i;for(i0;i<4;i) sumf(i); printf(&qu…

数值的整数次方Pow(x,n)

求数组的整数次方 思想&#xff1a; 分而治之 首先判断正负数&#xff0c;然后判断奇偶性问题&#xff1a; 力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台备战技术面试&#xff1f;力扣提供海量技术面试资源&#xff0c;帮助你高效提升编程技能&a…

vue3父组件提交校验多个子组件

实现功能&#xff1a;在父组件提交事件中校验多个子组件中的form 父组件&#xff1a; <script setup lang"ts">import {ref, reactive} from vueimport childForm from ./childForm.vueimport childForm2 from ./childForm2.vuelet approvalRef ref()let ap…

华东理工李洪林课题组开发 Macformer,加速大环类药物发现

大环类化合物是指由 12 个以上原子组成的小分子或肽。相较于其他小分子化合物&#xff0c;大环类化合物在结构和性能上有着诸多优势&#xff0c;也因此被视为各类靶点的潜在治疗药物。 基于药物化学合成的大环类似物是大环类药物的一个主要来源。然而&#xff0c;由于合成方法…

数字引领,智慧赋能|袋鼠云与易知微共同亮相2023智慧港口大会

2023年10月19日&#xff0c;由中国港口协会、中国交通通信信息中心、天津港&#xff08;集团&#xff09;有限公司主办&#xff0c;中国港口协会智慧港口专业委员会、《港口科技》杂志社等单位承办的以“数字引领 智慧赋能”为主题的“2023智慧港口大会”在天津顺利召开。 袋鼠…

Linux:安装IDEA开发工具

1、下载 下载地址&#xff1a;https://www.jetbrains.com/idea/download/?sectionlinux 2、上传及解压 将安装包上传到虚拟机&#xff0c;我建的目录是/opt/idea 解压&#xff1a;tar -zxvf ideaIU-2023.2.5.tar.gz 3、启动 启动IDEA需要登陆桌面系统&#xff0c;不能在…