我的编程空间,编程开发者的网络收藏夹
学习永远不晚

深入解析Redis中常见的应用场景

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

深入解析Redis中常见的应用场景

前言

Redis是一个key-value存储系统,现在在各种系统中的使用越来越多,大部分情况下是因为其高性能的特性,被当做缓存使用,这里介绍下Redis经常遇到的使用场景。下面话不多说了,来一起看看详细的介绍吧。

Redis特性

一个产品的使用场景肯定是需要根据产品的特性,先列举一下Redis的特点:

读写性能优异 持久化 数据类型丰富 单线程 数据自动过期 发布订阅 分布式

这里我们通过几个场景,不同维度说下Redis的应用。

高性能适合当做缓存

缓存是Redis最常见的应用场景,之所有这么使用,主要是因为Redis读写性能优异。而且逐渐有取代memcached,成为首选服务端缓存的组件。而且,Redis内部是支持事务的,在使用时候能有效保证数据的一致性。
作为缓存使用时,一般有两种方式保存数据:

1、读取前,先去读Redis,如果没有数据,读取数据库,将数据拉入Redis。

2、插入数据时,同时写入Redis。

方案一:实施起来简单,但是有两个需要注意的地方:

1、避免缓存击穿。(数据库没有就需要命中的数据,导致Redis一直没有数据,而一直命中数据库。)

2、数据的实时性相对会差一点。

方案二:数据实时性强,但是开发时不便于统一处理。

当然,两种方式根据实际情况来适用。如:方案一适用于对于数据实时性要求不是特别高的场景。方案二适用于字典表、数据量不大的数据存储。

丰富的数据格式性能更高,应用场景丰富

Redis相比其他缓存,有一个非常大的优势,就是支持多种数据类型。

数据类型 说明 string 字符串,最简单的k-v存储 hash hash格式,value为field和value,适合ID-Detail这样的场景。 list 简单的list,顺序列表,支持首位或者末尾插入数据 set 无序list,查找速度快,适合交集、并集、差集处理 sorted set 有序的set

其实,通过上面的数据类型的特性,基本就能想到合适的应用场景了。

string——适合最简单的k-v存储,类似于memcached的存储结构,短信验证码,配置信息等,就用这种类型来存储。 hash——一般key为ID或者唯一标示,value对应的就是详情了。如商品详情,个人信息详情,新闻详情等。 list——因为list是有序的,比较适合存储一些有序且数据相对固定的数据。如省市区表、字典表等。因为list是有序的,适合根据写入的时间来排序,如:最新的***,消息队列等。 set——可以简单的理解为ID-List的模式,如微博中一个人有哪些好友,set最牛的地方在于,可以对两个set提供交集、并集、差集操作。例如:查找两个人共同的好友等。 Sorted Set——是set的增强版本,增加了一个score参数,自动会根据score的值进行排序。比较适合类似于top 10等不根据插入的时间来排序的数据。

如上所述,虽然Redis不像关系数据库那么复杂的数据结构,但是,也能适合很多场景,比一般的缓存数据结构要多。了解每种数据结构适合的业务场景,不仅有利于提升开发效率,也能有效利用Redis的性能。

单线程可以作为分布式锁

谈到Redis和Memcached 的区别,大家更多的是谈到数据结构和持久化这两个特性,其实还有一个比较大的区别就是:

Redis 是单线程,多路复用方式提高处理效率。 Memcached 是多线程的,通过CPU线程切换来提高处理效率。

所以Redis单线程的这个特性,其实也是很重要的应用场景,最常用的就是分布式锁。

应对高并发的系统,都是用多服务器部署,每个技术框架针对数据锁都有很好的处理方式,如 .net 的lock,java 的synchronized,都能通过锁住某个对象来应对线程导致的数据污染问题。但是毕竟,只能控制本服务器的线程,分布式部署

以后数据污染问题,就比较难处理了。Redis的单线程这个特性,就非常符合这个需求,伪代码如下:


//产生锁
while lock!=1
 //过期时间是为了避免死锁
 now = int(time.time())
 lock_timeout = now + LOCK_TIMEOUT + 1
 lock = redis_client.setnx(lock_key, lock_timeout)

//真正要处理的业务
doing()

//释放锁
now = int(time.time())
if now < lock_timeout:
 redis_client.delete(lock_key)

以上是一个只说明流程的伪代码,其实整体的逻辑是很简单的,只要考虑到死锁时的情况,就比较好处理了。Redis作为分布式锁,因为其性能的优势,不会成为瓶颈,一般会产生瓶颈的是真正的业务处理内容,还是尽量缩小锁的范围来确保系统性能。

自动过期能有效提升开发效率

Redis针对数据都可以设置过期时间,这个特点也是大家应用比较多的,过期的数据清理无需使用方去关注,所以开发效率也比较高,当然,性能也比较高。最常见的就是:短信验证码、具有时间性的商品展示等。无需像数据库还要去查时间进行对比。因为使用比较简单,就不赘述了。

分布式和持久化有效应对海量数据和高并发

Redis初期的版本官方只是支持单机或者简单的主从,大多应用则都是自己去开发集群的中间件,但是随着应用越来越广泛,用户关于分布式的呼声越来越高,所以Redis 3.0版本时候官方加入了分布式的支持,主要是两个方面:

Redis服务器主从热备,确保系统稳定性 Redis分片应对海量数据和高并发

而且Redis虽然是一个内存缓存,数据存在内存,但是Redis支持多种方式将数据持久化,写入硬盘,所有,Redis数据的稳定性也是非常有保障的,结合Redis的集群方案,有的系统已经将Redis当做一种NoSql数据存储来适用。

示例:秒杀和Redis的结合

秒杀是现在互联网系统中常见的营销模式,作为开发者,其实最不愿意这样的活动,因为非技术人员无法理解到其中的技术难度,导致在资源协调上总是有些偏差。秒杀其实经常会出现的问题包括:

并发太高导致程序阻塞。 库存无法有效控制,出现超卖的情况。

其实解决这些问题基本就两个方案:

数据尽量缓存,阻断用户和数据库的直接交互。 通过锁来控制避免超卖现象。

现在说明一下,如果现在做一个秒杀,那么,Redis应该如何结合进行使用?

提前预热数据,放入Redis 商品列表放入Redis List 商品的详情数据 Redis hash保存,设置过期时间 商品的库存数据Redis sorted set保存 用户的地址信息Redis set保存 订单产生扣库存通过Redis制造分布式锁,库存同步扣除 订单产生后发货的数据,产生Redis list,通过消息队列处理 秒杀结束后,再把Redis数据和数据库进行同步

以上是一个简略的秒杀系统和Redis结合的方案,当然实际可能还会引入http缓存,或者将消息对接用MQ代替等方案,也会出现业务遗漏的情况,这个只是希望能抛砖引玉。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者使用工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对编程网的支持。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

深入解析Redis中常见的应用场景

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

深入解析Redis中常见的应用场景

前言 Redis是一个key-value存储系统,现在在各种系统中的使用越来越多,大部分情况下是因为其高性能的特性,被当做缓存使用,这里介绍下Redis经常遇到的使用场景。下面话不多说了,来一起看看详细的介绍吧。 Redis特性一个产品的使
2022-06-04

Redis 技术深度解析与应用场景

虽然 Redis 执行命令是单线程顺序执行的,但其多线程部分主要用于处理网络数据的读写和协议解析,以优化整体性能。这一设计既保证了数据处理的一致性,又提高了系统的吞吐量和响应速度。

常见position布局的应用场景与技巧解析

掌握常见position布局的使用场景与技巧,需要具体代码示例引言:在前端开发中,布局是至关重要的一环。而position布局在实现网页页面布局中起到了重要的作用。它可以帮助我们实现精确的页面元素定位和交互效果的实现。本文将介绍常见的pos
常见position布局的应用场景与技巧解析
2023-12-26

详解Golang中Context的三个常见应用场景

Golang context主要用于定义超时取消,取消后续操作,在不同操作中传递值。本文通过简单易懂的示例进行说明,感兴趣的可以了解一下
2022-12-29

深入解析MongoDB在大数据场景中的应用实践

深入解析MongoDB在大数据场景中的应用实践摘要:随着大数据时代的到来,数据规模不断增大,对数据库存储和处理的需求也愈发迫切。MongoDB作为一种非关系型数据库,以其高可扩展性和灵活的数据模型在大数据场景中得到了广泛应用。本文将深入分析
深入解析MongoDB在大数据场景中的应用实践
2023-11-03

单例模式在PHP中的常见应用场景剖析

概述:单例模式(Singleton Pattern)是一种创建型设计模式,它确保一个类只有一个实例,并提供一个全局访问点来访问该实例。在PHP中,使用单例模式可以有效地限制类的实例化次数和资源占用,提高代码的性能和可维护性。本文将通过分析常
2023-10-21

分析常见的Python回调函数应用场景

Python中常见的回调函数应用场景分析,需要具体代码示例回调函数是指在编程中,将一个函数作为参数传递给另一个函数,并在某个特定的事件发生时执行这个参数函数。回调函数广泛应用于异步编程、事件处理、GUI编程等领域。本文将分析Python中
分析常见的Python回调函数应用场景
2024-02-02

Java 中 java.lang.Character 类的常见应用场景有哪些?(java.lang.Character类的应用场景 )

在Java编程中,java.lang.Character类是一个非常重要的工具类,它提供了许多用于处理字符的方法和常量。以下是java.lang.Character类的一些常见应用场景:一、字符判断
Java 中 java.lang.Character 类的常见应用场景有哪些?(java.lang.Character类的应用场景  )
Java2024-12-20

Golang中Context的常见应用场景有哪些

这篇文章主要讲解了“Golang中Context的常见应用场景有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Golang中Context的常见应用场景有哪些”吧!超时取消假设我们希望H
2023-07-04

详解Go语言中init的使用与常见应用场景

Go语言中的init函数在程序启动时自动执行,可用于包级初始化、资源管理、注册插件等。它不接受参数,也不返回值。通过init函数,开发者可在程序启动时执行必要的初始化,确保依赖关系正确初始化,并实现顺序或并行初始化。遵循最佳实践,如保持简洁、避免依赖、处理错误和使用defer,可有效使用init函数。
详解Go语言中init的使用与常见应用场景
2024-04-02

深入理解 PHP Session 跨域的应用场景

引言:在 Web 开发中,会经常遇到需要在不同域名下进行数据共享的场景。而 PHP Session 是一种常用的实现方式,用于在不同页面之间传递用户会话数据。然而,由于浏览器的同源策略,Session 数据在跨域情况下的传递会受到限制。本文
2023-10-21

深入探索Django中间件的应用场景

Django中间件是一种可插拔的应用程序组件,可在请求和响应处理过程中修改Django的行为。中间件可用于处理请求、响应、异常等,还可用于实现身份验证、缓存、性能监控等常用功能。通过深入探索中间件的应用场景,可以提高Django应用程序的可扩展性和灵活性
2023-05-18

深入解析PHP命令行脚本的优势与应用场景

PHP命令行脚本的优势PHP是一种广泛使用的服务器端脚本语言,它允许开发者在服务器上执行动态内容。PHP命令行脚本是PHP的一个子集,允许开发者通过命令行界面直接与PHP交互。本文将探讨PHP命令行脚本的优势,并为您提供一个示例来展示如何创建和使用PHP命令行脚本。
深入解析PHP命令行脚本的优势与应用场景
PHP2024-12-19

深入理解Java中Filter的作用种类及应用场景

Filter(过滤器)是JavaWeb中的一种重要组件,可以对请求和响应进行拦截处理,对数据进行过滤和处理。Filter可以实现许多功能,如:鉴权、日志记录、字符编码转换、数据压缩、请求重定向等等
2023-05-18

Golang上下文Context的常见应用场景

Golang context主要用于定义超时取消,取消后续操作,在不同操作中传递值。本文通过简单易懂的示例进行说明,感兴趣的可以了解一下
2023-05-16

Golang上下文Context的常见应用场景

Go语言Context的常见应用场景Context是Go语言中传递请求信息的重要机制。其常见应用场景包括:超时处理取消操作传递上下文数据错误处理并发控制跟踪和监控测试第一方库集成自定义中间件结构化并发最佳实践包括始终传递Context、明确设置截止时间、处理取消、避免泄漏以及利用第三方库支持。
Golang上下文Context的常见应用场景
2024-04-23

编程热搜

目录