广告
返回顶部
首页 > 资讯 > 数据库 >Redis真的那么好用吗?
  • 620
分享到

Redis真的那么好用吗?

2024-04-02 19:04:59 620人浏览 八月长安
摘要

不管你是从事python、Java、Go、PHP、Ruby等等... Redis都应该是一个比较熟悉的中间件。而大部分经常写业务代码的程序员,实际工作中或许只用到了set value、get value两个

不管你是从事python、Java、GoPHP、Ruby等等... Redis都应该是一个比较熟悉的中间件。而大部分经常写业务代码的程序员,实际工作中或许只用到了set value、get value两个操作。对Redis缺乏一个整体的认识。今天就来对Redis的常见问题做一个总结。希望能够帮助到大家

Redis是什么

Redis是一个开源的底层使用C语言编写的key-value存储数据库。可用于缓存、事件发布订阅、高速队列等场景。而且支持丰富的数据类型:string(字符串)、hash(哈希)、list(列表)、set(无序集合)、zset(sorted set:有序集合)

Redis在项目中的应用场景

1、缓存数据

    最常用,对经常需要查询且变动不是很频繁的数据 常称作热点数据。

2、消息队列

    相当于消息订阅系统,比如ActiveMQRocketMQ。如果对数据有较高一致性要求时,还是建议使用MQ)

3、计数器

    比如统计点击率、点赞率,redis具有原子性,可以避免并发问题

4、电商网站信息

    大型电商平台初始化页面数据的缓存。比如去哪儿网购买机票的时候首页的价格和你点进去的价格会有差异。

5、热点数据

   比如新闻网站实时热点、微博热搜等,需要频繁更新。总数据量比较大的时候直接从数据库查询会影响性能

给个爱的理由

在单节点服务器我们通常是这样的


Redis真的那么好用吗?

随着企业的发展、业务的扩展。面对海量的数据,直接使用Mysql会导致性能下降,数据的读写也会非常慢。于是我们就可以搭配缓存来处理海量数据。

于是现在我们是这样的:

Redis真的那么好用吗?

上图只是简述了缓存的作用,当数据继续增大我们需要利用主从复制技术来达到读写分离

数据库层直接与缓存进行交互,如果缓存中有数据直接返回客户端,如果没有才会从mysql中去查询。从而减小了数据库的压力,提升了效率。

平时发布了一款新手机,会有抢购活动。同一时间段,服务端会收到很多的下单请求。

我们需要使用redis的原子操作来实现这个“单线程”。首先我们把库存存在一个列表中,假设有10件库存,就往列表中push20个数,这个数没有实际意义,仅仅只是代表10件库存。抢购开始后,每到来一个用户,就从列表中pop一个数,表示用户抢购成功。当列表为空时,表示已经被抢光了。因为列表的pop操作是原子的,即使有很多用户同时到达,也是依次执行的

题外话:还有的抢购是直接在前端页面限制请求,这些请求直接被前端拦截,并没有到后端服务器

Redis为什么会这么快

1、Redis是纯内存操作,需要的时候需要我们手动持久化到硬盘中

2、Redis是单线程,从而避开了多线程中上下文频繁切换的操作。

3、Redis数据结构简单、对数据的操作也比较简单

4、使用底层模型不同,它们之间底层实现方式以及与客户端之间通信的应用协议不一样,Redis直接自己构建了VM 机制 ,因为一般的系统调用系统函数的话,会浪费一定的时间去移动和请求

5、使用多路I/O复用模型,非阻塞I/O

多路I/O复用

I/O 多路复用技术是为了解决进程或线程阻塞到某个 I/O 系统调用而出现的技术,可以监视多个描述符,一旦某个描述符就绪(一般是读就绪或者写就绪,就是这个文件描述符进行读写操作之前),能够通知程序进行相应的读写操作

Redis数据类型应用场景

前面提到了Redis支持五种丰富的数据类型,那么在不同场景下我们该怎么选择呢?

String

    字符串是最常用的数据类型,他能够存储任何类型的字符串,当然也包括二进制、JSON化的对象、甚至是base64编码之后的图片。在Redis中一个字符串最大的容量为512MB,可以说是无所不能了。

Hash

    常用作存储结构化数据、比如论坛系统中可以用来存储用户的Id、昵称、头像、积分等信息。如果需要修改其中的信息,只需要通过Key取出Value进行反序列化修改某一项的值,再序列化存储到Redis中,Hash结构存储,由于Hash结构会在单个Hash元素在不足一定数量时进行压缩存储,所以可以大量节约内存。这一点在String结构里是不存在的。

List

    List的实现为一个双向链表,即可以支持反向查找和遍历,更方便操作,不过带来了部分额外的内存开销,Redis 内部的很多实现,包括发送缓冲队列等也都是用的这个数据结构。另外,可以利用 lrange 命令,做基于 Redis 的分页功能,性能极佳,用户体验好。

Set

    set 对外提供的功能与 list 类似是一个列表的功能,特殊之处在于 set 是可以自动排重的,当你需要存储一个列表数据,又不希望出现重复数据时,这个时候就可以选择使用set。

Sorted Set

    可以按照某个条件的权重进行排序,比如可以通过点击数做出排行榜的数据应用。

Redis缓存的数据一致性

    真正意义上来讲数据库的数据和缓存的数据是不可能一致的,数据分为最终一直和强一致两类。如果业务中对数据的要求必须强一直那么就不能使用缓存。缓存能做的只能保证数据的最终一致性。

    我们能做的只能是尽可能的保证数据的一致性。不管是先删库再删缓存 还是 先删缓存再删库,都可能出现数据不一致的情况,因为读和写操作是并发的,我们没办法保证他们的先后顺序。具体应对策略还是要根据业务需求来定,这里就不赘述了。

Redis的过期和内存淘汰

Redis存储数据时我们可以设置他的过期时间。但是这个key是怎么删除的呢?

一开始我认为是定时删除,后来发现并不是这样,因为如果定时删除,需要一个定时器来不断的负责监控这个key,虽然内存释放了,但是非常消耗cpu资源。

Redis过期删除采用的是定期删除,默认是每100ms检测一次,遇到过期的key则进行删除,这里的检测并不是顺序检测,而是随机检测。那这样会不会有漏网之鱼?显然Redis也考虑到了这一点,当我们去读/写一个已经过期的key时,会触发Redis的惰性删除策略,直接回干掉过期的key

内存淘汰是指用户存储的一部分key是可以被Redis自动的删除,从而会出现从缓存中查不到数据的情况。加入我们的服务器内存为2G、但是随着业务的发展缓存的数据已经超过2G了。但是这并不影响我们程序的运行,因为操作系统的可见内存并不受物理内存的限制。物理内存不够用没关系,计算机会从硬盘中划出一片空间来作为虚拟内存。这就是Redis设计两种应用场景的初衷:缓存、持久存储

缓存击穿

缓存只是为了缓解数据库压力而添加的一层保护层,当从缓存中查询不到我们需要的数据就要去数据库中查询了。如果被黑客利用,频繁去访问缓存中没有的数据,那么缓存就失去了存在的意义,瞬间所有请求的压力都落在了数据库上,这样会导致数据库连接异常。

解决方案:

1、后台设置定时任务,主动的去更新缓存数据。这种方案容易理解,但是当key比较分散的时候,操作起来还是比较复杂的

2、分级缓存。比如设置两层缓存保护层,1级缓存失效时间短,2级缓存失效时间长。有请求过来优先从1级缓存中去查找,如果在1级缓存中没有找到相应数据,则对该线程进行加,这个线程再从数据库中取到数据,更新至1级和2级缓存。其他线程则直接从2级线程中获取

3、提供一个拦截机制,内部维护一系列合法的key值。当请求的key不合法时,直接返回。

缓存雪崩

缓存雪崩就是指缓存由于某些原因(比如 宕机、cache服务挂了或者不响应)整体crash掉了,导致大量请求到达后端数据库,从而导致数据库崩溃,整个系统崩溃,发生灾难,也就是上面提到的缓存击穿


Redis真的那么好用吗?

图片来源自网络

如何避免雪崩:

1、给缓存加上一定区间内的随机生效时间,不同的key设置不同的失效时间,避免同一时间集体失效。

2、和缓存击穿解决方案类似,做二级缓存,原始缓存失效时从拷贝缓存中读取数据。

3、利用加锁或者队列方式避免过多请求同时对服务器进行读写操作。

写在最后

Redis的性能极高,读的速度是110000次/s,写的速度是81000次/s,支持事务,支持备份,丰富的数据类型。

任何事情都是两面性,Redis也是有缺点的:

1、由于是内存数据库,所以单台机器存储的数据量是有限的,需要开发者提前预估,需要及时删除不需要的数据。

2、当修改Redis的数据之后需要将持久化到硬盘的数据重新加入到内容中,时间比较久,这个时候Redis是无法正常运行的。

您可能感兴趣的文档:

--结束END--

本文标题: Redis真的那么好用吗?

本文链接: https://www.lsjlt.com/news/46599.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

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

下载Word文档
猜你喜欢
  • Redis真的那么好用吗?
    不管你是从事Python、Java、Go、PHP、Ruby等等... Redis都应该是一个比较熟悉的中间件。而大部分经常写业务代码的程序员,实际工作中或许只用到了set value、get value两个...
    99+
    2022-10-18
  • golang真的好用吗
    作为一门开发语言,Golang 被称为“下一代语言”,其设计理念的简单性、高效性、可靠性让其成为了开发者们关注的重点。但它真的好用吗?本文将从Golang的语法特点、应用及社区等方面来进行探讨。Golang 语法特点Golang 语法特点简...
    99+
    2023-05-15
  • Python 打包 api 真的有那么神奇吗?
    Python 是一个高效、简洁的编程语言,因其易于学习和使用而受到广泛的欢迎。在 Python 中,有许多常用的第三方库和工具,例如 Flask、Django、Numpy 等等。这些库提供了许多有用的功能,但是在使用这些库时,我们需要解决...
    99+
    2023-07-23
    打包 api 关键字
  • 云服务器续费那么贵是真的吗
    云服务器续费贵不贵?这是一个备受争议的话题。实际上,不同的云服务器提供商的续费价格也不同。 如果你要购买一家云服务器提供商的云服务器,那么续费价格通常是非常重要的因素。一些云服务器提供商的价格可能很高,因为他们拥有广泛的存储容量和强大的计...
    99+
    2023-10-27
    续费 服务器 贵是真
  • 阿里云服务器那么贵是真的吗?
    随着云计算的普及和发展,越来越多的企业和个人选择使用阿里云服务器。然而,一些人质疑阿里云服务器的价格是否过高。本文将详细说明阿里云服务器的价格,并分析其高价格的原因。 阿里云服务器的价格是根据不同的配置和使用量来计算的。阿里云提供了一系列的...
    99+
    2023-11-11
    阿里 服务器 贵是真
  • 使用NPM在Java中集成NumPy,真的那么难吗?
    随着机器学习和数据科学的发展,NumPy成为了Python中最受欢迎的科学计算库之一。然而,Java作为一种广泛使用的编程语言,也需要能够与NumPy进行集成,以便在Java应用程序中使用NumPy的强大功能。在本文中,我们将讨论如何使用...
    99+
    2023-10-09
    numpy 日志 npm
  • 亚马逊那个免费的服务器是真的吗吗安全吗
    1. 亚马逊免费服务器的真实性 亚马逊提供的免费服务器服务是真实存在的,被称为亚马逊 AWS(Amazon Web Services)的免费套餐。这个套餐名为“AWS Free Tier”,为用户提供了一定的免费资源,包括 EC2(弹性云...
    99+
    2023-10-27
    亚马逊 服务器
  • 用vps注册亚马逊真的好吗
    使用 VPS 注册亚马逊账号是一种常见的方法,但并不是一种可靠的方法。虽然这种方法可以帮助你绕过亚马逊的 IP 地址限制,但它也存在一些风险和缺点。 首先,使用 VPS 注册亚马逊账号可能会违反亚马逊的服务条款。如果亚马逊发现你使用了 V...
    99+
    2023-10-26
    亚马逊 vps
  • ASP与Laravel的面试题:编程算法真的有那么难吗?
    在ASP和Laravel的面试中,编程算法是必不可少的一部分。但是,很多人会觉得编程算法非常难,甚至认为这是他们无法通过面试的主要原因。然而,编程算法真的有那么难吗? 其实,编程算法并不难,只要你掌握了一些基本的算法思想和技巧,就能够轻松...
    99+
    2023-07-06
    laravel 面试 编程算法
  • 阿里云服务器真的好吗?值得买吗?
    阿里云服务器作为一款全球领先的云计算产品,以其高效稳定、灵活可扩展、安全可靠等特点深受广大用户的喜爱。本文将详细说明阿里云服务器的优势,以及是否值得购买的问题。 阿里云服务器的优势: 1.高效稳定:阿里云服务器采用了自主研发的飞天操作系统,...
    99+
    2023-12-09
    阿里 服务器
  • LeetCode 算法训练营:PHP 异步编程和 Load 真的有那么难吗?
    近年来,随着互联网技术的迅速发展,异步编程和 Load 的重要性越来越受到关注。PHP 作为一种流行的编程语言,也逐渐加入了异步编程和 Load 的支持。然而,很多 PHP 开发者对于这两个概念并不是很熟悉,甚至感到有些困惑。那么,Lee...
    99+
    2023-09-11
    leetcode 异步编程 load
  • 二维码真的那么神奇吗?学Go语言的你也需要了解!
    二维码已经成为现代生活中不可或缺的一部分。它是一种矩阵条形码,可以存储大量信息,包括网址、电话号码、文本等等。它不仅具有便捷性,还可以增加用户体验。在本文中,我们将探讨二维码的实现以及如何用Go语言来生成它。 首先,让我们来了解一下二维码...
    99+
    2023-07-20
    教程 ide 二维码
  • 千元机难道真的不好吗?那是你没有入手合适的机型,比如说这几款
    千元机难道真的不好吗?那是你没有入手合适的机型,比如说这几款 在这个5G时代即将来临,4G网络即将退出的时候,很多人都为了享受5G网络而选择一些千元机当作过渡机型,但是上手后的体验都不怎么满意。 难道千元机...
    99+
    2022-10-18
  • mybatis那些约定的配置你真的都了解吗(经验总结)
    背景 在springboot中有很多约定大于配置的规则,如果我们准守了约定,可以零配置。mybatsi中Mapper和xml文件之间有很多约定俗称的规则,比如名称匹配,包扫描,别名等...
    99+
    2022-11-12
  • SEO真的没用了吗?
    现在有很多人都觉得做SEO已经没效果了,但是事实上只要有搜索引擎和用户在的一天,SEO优化就不会毫无价值可言。严格意义上来说,SEO是指在了解搜索引擎自然排名机制的基础之上,对网站进行内部及外部的调整优化,改进网站在搜索引擎中关键词的自然排...
    99+
    2023-06-03
  • ASP响应Spring Shell,真的能带来更好的用户体验吗?
    随着互联网技术的不断发展,越来越多的应用程序开始采用Web技术进行开发,而ASP(Active Server Pages)作为一种基于服务器端的Web应用程序开发技术,被广泛使用。同时,Spring Shell也是一种非常流行的命令行开发...
    99+
    2023-08-17
    响应 spring shell
  • 浅谈为什么单线程的redis那么快
    目录redis单机QPS为什么这么快内存型数据库简单的数据结构单线程IO多路复用总结redis单机QPS ./redis-benchmark -t set,lpush -n 1...
    99+
    2022-11-12
  • sql_slave_skip_counter,你真的用对了吗?
    写在前面:    最近一段时间都在做传统主从复制相关的测试,思考了很多上线主从复制架构后,可能会发生的问题,然后针对性设置了这些故障,再然后思考如何在保证业务可用,或者对业务冲击尽可能的小的前提下,进行故障...
    99+
    2022-10-18
  • 你真的会用Mysql的explain吗
    目录引言explain基础1、id2、select_type3、table4、partitions5、typeexplain分析实战总结引言 数据库性能优化是每个后端程序猿...
    99+
    2022-11-13
  • 如果你是真“米粉”,那么小米手机6种截屏方法,你都知道吗?
    身为一位"假"米粉,小编一直隐藏在众米粉之间,偷偷的学习一些新的知识,了解一些小米手机经常使用的功能,像小米手机截屏有几种方法?据小编统计,小米手机有6种截屏方法,你都知道吗?使用...
    99+
    2022-10-18
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作