作者文章

fwq

FWQ
服务器教程
Redis有哪些持久化方式?一文带你了解技术存储的魅力!
Redis有哪些持久化方式?一文带你了解技术存储的魅力! 收藏 积累知识,胜过积蓄金银!毕竟在数据库开发的过程中,会遇到各种各样的问题,往往都是一些细节知识点还没有掌握好而导致的,因此基础知识点的积累是很重要的。下面本文《Redis有哪些持久化方式?一文带你了解技术存储的魅力!》,就带大家讲解一下Redis、方式、持久化知识点,若是你对本文感兴趣,或者是想搞懂其中某个知识点,就请你继续往下看吧~ 大家好,我是你们的好朋友小米!今天我们来聊一聊Redis这个热门的技术话题:持久化方式。作为一款开源的高性能键值存储系统,Redis以其快速、可扩展和灵活的特点,在众多应用场景中大放异彩。而持久化机制是Redis的重要组成部分,它能够确保数据在Redis重启或崩溃后的可靠性。那么,Redis有哪些持久化方式呢?让我们一起来探索吧! RDB持久化 RDB(Redis Database)是Redis的默认持久化方式,它通过将当前内存中的数据快照保存到硬盘上的二进制文件中,实现数据的持久化存储。 RDB持久化的优势在于快速和紧凑,适合用于备份和灾难恢复。我们可以通过设置定期保存或触发保存的方式来实现RDB持久化。定期保存会在指定时间间隔内执行数据快照保存,而触发保存则会在满足一定条件时自动触发数据快照保存。 RDB持久化的缺点是在Redis重启时,需要将整个RDB文件加载到内存中,这可能会导致较长的恢复时间和一定的数据丢失。 AOF持久化 AOF(Append-Only File)持久化是另一种Redis的持久化方式。它通过将Redis执行的每个写命令追加到文件的末尾,将所有的写操作以日志的形式保存下来,实现数据的持久化存储。 AOF持久化的优势在于可靠性和灵活性,可以提供更高的数据安全性,并支持精确的数据恢复。 AOF持久化有两种策略可供选择:重写和追加。重写策略通过重写AOF文件来减小文件的体积,避免文件不断增长而导致性能下降。追加策略则直接将写命令追加到现有的AOF文件中。 混合持久化 Redis 4.0版本引入了混合持久化方式(混合RDB与AOF持久化),结合了RDB和AOF的优势。在混合持久化中,Redis首先通过RDB方式创建一个快照,然后将所有的写操作追加到AOF文件中。当Redis重启时,可以通过载入RDB文件进行快速恢复,再通过重放AOF文件中的写操作来达到最终一致性。 混合持久化的优点是既能够保证快速的恢复,又能够提供更高的数据安全性。然而,相应地,它也会带来额外的磁盘空间和写入延迟。 无持久化 除了以上介绍的持久化方式,Redis还提供了无持久化的选项。通过关闭持久化,Redis仅依赖于操作系统的页缓存来保证数据的持久性。这种方式适用于对数据安全性要求较低的场景,或者临时使用Redis进行缓存的情况。 需要注意的是,关闭持久化会使得Redis重启后数据完全丢失,因此在选择这种方式时,务必慎重考虑数据的重要性和可恢复性。 总结 通过以上对Redis持久化方式的介绍,我们可以看到每种方式都有其独特的优势和适用场景。RDB持久化适合用于备份和灾难恢复,AOF持久化提供更高的数据安全性,混合持久化则兼具快速恢复和数据安全性的优势。而关闭持久化则适用于对数据安全性要求较低的临时场景。 在实际应用中,我们可以根据具体需求选择适合的持久化方式,甚至可以结合不同的方式来实现更高级别的数据保护和恢复策略。同时,我们也要注意合理配置持久化的参数,确保在数据安全和性能之间取得平衡。 END Redis作为一款功能强大的内存数据库,其持久化机制为我们提供了强大的数据保障。希望通过本文的介绍,能够让大家对Redis持久化方式有更深入的了解。如果你有其他关于Redis或者持久化的问题,欢迎在评论区留言,小米会尽力为大家解答!
2025-05-10 阅读全文 →
FWQ
服务器教程
redis秒杀系统的实现
redis秒杀系统的实现 收藏 知识点掌握了,还需要不断练习才能熟练运用。下面golang学习网给大家带来一个数据库开发实战,手把手教大家学习《redis秒杀系统的实现》,在实现功能的过程中也带大家重新温习相关知识点,温故而知新,回头看看说不定又有不一样的感悟! 1.如何设计一个秒杀系统 在设计任何系统之前,我们首先都需要先理解秒杀系统的业务背景 下面我简单的举一个例子: 在某个时间点,某某电商网站要低价卖某件商品,而且限量1千件,抢购人数超过数十万人。所以我们面临的第一个秒杀的问题就是:时间极短,然后瞬间流量非常大我们的系统必须保证秒杀抢购的结果不出错,达到抢购的预期目的。而且秒杀库存的实现也需要保障秒杀结果的准确性。总结几个特点就是: 高性能:秒杀中有大量的并发读写,所以需要使系统能支撑起高并发访问,这是一个关键点。 高可用:藐视瞬间流量非常大,很有可能会导致系统宕机,所以需要从各方面保证系统的可用性。 一致性:由于秒杀请求量非常大,此时就需要我们的秒杀结果要准确。因为一旦出错,那么波及面会非常广,损失非常大。 2.秒杀流程 我们先从秒杀的入口开始说起在秒杀入口的地方会有这些问题需要解决: 2.1 前端处理 静态资源处理 秒杀商品一般都会包含很多静态资源,所以这些图片什么的静态资源一定要放到CDN(Content Delivery Network,即内容分发网络),能放的尽量放进去。让秒杀时后端服务器的压力尽可能小。说到此处,我重点描述讲解CDN 为了能在传统IP网上发布丰富的宽带媒体内容,提出在现有互联网基础上建立一个内容分发平台专门为网站提供服务。由于CDN是为加快网络访问速度而被优化的网络覆盖层,因此被形象地称为“网络加速器”。首先要说的是应用服务器和资源服务器应该解耦,也就是应用服务器只处理逻辑,而资源服务器存放内容或者叫资源。 CDN专注于「内容」,也就是CDN的C所代表的Content,专注于静态资源的分发和访问,比如一张图片,一个文本文件,一个视频,一个CSS,一个JS等等,任何以文件形式存储的,为了提高在互联网上的访问速度和质量,都可以将这个资源部署在CDN这个网络上。 CDN动作是「分发」,也就是如何让刚才提到的那些「内容」快速的部署在这个网络中,从而快速为用户服务,其实还有一层更重要的含义是用户的快速访问与就近接入,分发的目的是为了用户更好的体验。 CDN落定于「网络」,是部署于全国或者全世界的一大堆服务器,这些服务器基于当前互联网的基础架构在其上层再构成一个网络,这个网络专为资源分发而生。 那CDN的原理是什么呢?为什么用户可以接入离他最近的服务器呢?主要是利用了DNS来判断用户位置,再返回给用户最近的机房的服务器的资源地址。下面我再通俗的解释一下:肯德基的总部在美国,可是你家楼下也有一家肯德基,并且汉堡包是一模一样的,这就是CDN(这个比喻来自知乎,觉得非常的恰当)。肯德基部署了很多个CDN在世界各地提供服务,用户都是找到最近的店,这个计算过程就是刚才讲的「就近接入」。 什么是CDN的调度呢? (1)DNS调度是最常用和最通用的调度方案,缺点是存在DNS劫持的风险,调度的精确度也会差一些;(2)302调度非常适合用在大文件下载和视频点播这两个应用场景,优点是可以提高调度的精确度,缺点是将会增加首包的时延(在大文件下载和视频点播场景下对首包时延不太敏感,而对调度精确度要求更高)(3)HTTPDNS调度的优点是有较高的安全性(可以规避DNS劫持风险)和调度精确度,但是有个很大的缺点,需要客户端提供支持(例如在手机APP上嵌入SDK),通用性较差。 通俗来讲: 在一个商圈有两家肯德基,有一家组织活动,鸡腿随便吃,所以顾客全部涌到这家店,已经水泄不通,另一家店则门可罗雀。这个时候CDN的调度功能就要发挥作用了,另一家店也发布了一个消息说,买一个汉堡,打五折。这个时候,在第一家店抢不上鸡腿的顾客,马上跑去了第二家店,这个时候两个店的流量处于均衡状态。这就是CDN的调度。 恶意访问行为的处理…
2025-05-10 阅读全文 →
FWQ
服务器教程
【经验帖】为什么分布式一定要有Redis?
【经验帖】为什么分布式一定要有Redis? 收藏 知识点掌握了,还需要不断练习才能熟练运用。下面golang学习网给大家带来一个数据库开发实战,手把手教大家学习《【经验帖】为什么分布式一定要有Redis?》,在实现功能的过程中也带大家重新温习相关知识点,温故而知新,回头看看说不定又有不一样的感悟! 考虑到绝大部分写业务的程序员,在实际开发中使用 Redis 的时候,只会 Set Value 和 Get Value 两个操作,对 Redis 整体缺乏一个认知。 所以我斗胆以 Redis 为题材,对 Redis 常见问题做一个总结,希望能够弥补大家的知识盲点。 本文围绕以下几点进行阐述: 为什么使用 Redis 使用 Redis 有什么缺点 单线程的 Redis 为什么这么快…
2025-05-10 阅读全文 →
FWQ
服务器教程
Redis为什么默认16个数据库?
Redis为什么默认16个数据库? 收藏 对于一个数据库开发者来说,牢固扎实的基础是十分重要的,golang学习网就来带大家一点点的掌握基础知识点。今天本篇文章带大家了解《Redis为什么默认16个数据库?》,主要介绍了Redis、数据库、集群,希望对大家的知识积累有所帮助,快点收藏起来吧,否则需要时就找不到了! 在实际项目中Redis常被应用于做缓存,分布式锁、消息队列等。但是在搭建配置好Redis服务器后很多朋友应该会发现和有这样的疑问,为什么Redis默认建立了16个数据库,如下图所示。 一、16个数据库的由来 Redis是一个字典结构的存储服务器,一个Redis实例提供了多个用来存储数据的字典,客户端可以指定将数据存储在哪个字典中。这与在一个关系数据库实例中可以创建多个数据库类似(如下图所示),所以可以将其中的每个字典都理解成一个独立的数据库。 以MySQL实例为例 Redis默认支持16个数据库,可以通过调整Redis的配置文件redis/redis.conf中的databases来修改这一个值,设置完毕后重启Redis便完成配置。 客户端与Redis建立连接后会默认选择0号数据库,不过可以随时使用SELECT命令更换数据库。 # 切库  redis> SELECT 1 # 默认0号db,切换为1号db  OK  redis [1] > GET username # 从1号库中获取 username   (nil)  在实际项目中则可以通过以Redis配置文件的形式指定数据库,如下图所示 二、正确理解Redis的“数据库”概念 由于Redis不支持自定义数据库的名字,所以每个数据库都以编号命名。开发者则需要自己记录存储的数据与数据库的对应关系。另外Redis也不支持为每个数据库设置不同的访问密码,所以一个客户端要么可以访问全部数据库,要么全部数据库都没有权限访问。但是,要正确地理解Redis的“数据库”概念这里不得不提到一个命令: # 清空一个Redis实例中所有数据库中的数据  redis 127.0.0.1:6379> FLUSHALL  该命令可以清空实例下的所有数据库数据,这与我们所熟知的关系型数据库所不同。关系型数据库多个库常用于存储不同应用程序的数据 ,且没有方式可以同时清空实例下的所有库数据。所以对于Redis来说这些db更像是一种命名空间,且不适宜存储不同应用程序的数据。比如可以使用0号数据库存储某个应用生产环境中的数据,使用1号数据库存储测试环境中的数据,但不适宜使用0号数据库存储A应用的数据而使用1号数据库B应用的数据,不同的应用应该使用不同的Redis实例存储数据。Redis非常轻量级,一个空Redis实例占用的内在只有1M左右,所以不用担心多个Redis实例会额外占用很多内存。 三、集群情况下是否支持一个实例多个db? 要注意以上所说的都是基于单体Redis的情况。而在集群的情况下不支持使用select命令来切换db,因为Redis集群模式下只有一个db0。再扩展一些集群与单机Reids的区别,感兴趣的朋友可以去查阅相关的资料深入理解,这里就不做讨论了。 key批量操作支持有限:例如mget、mset必须在一个slot Key事务和Lua支持有限:操作的key必须在一个节点 key是数据分区的最小粒度:不支持bigkey分区 不支持多个数据库:集群模式下只有一个db0 复制只支持一层:不支持树形复制结构…
2025-05-10 阅读全文 →
FWQ
服务器教程
Redis为什么要避免big key
Redis为什么要避免big key 收藏 怎么入门数据库编程?需要学习哪些知识点?这是新手们刚接触编程时常见的问题;下面golang学习网就来给大家整理分享一些知识点,希望能够给初学者一些帮助。本篇文章就来介绍《Redis为什么要避免big key》,涉及到,有需要的可以收藏一下 避免 big key Redis 执行命令是单线程的,这意味着 Redis 操作「big key」有阻塞的风险。 big key 通常指的是 Redis 存储的 value 过大。包括: 单个 value 过大。如 200M 大小的 String。 集合元素过多。如 List、Hash、Set、ZSet…
2025-05-10 阅读全文 →
FWQ
服务器教程
Redis几乎所有命令都在这了,还说你不会?
Redis几乎所有命令都在这了,还说你不会? 收藏 来到golang学习网的大家,相信都是编程学习爱好者,希望在这里学习数据库相关编程知识。下面本篇文章就来带大家聊聊《Redis几乎所有命令都在这了,还说你不会?》,介绍一下字符串、Redis、数据库,希望对大家的知识积累有所帮助,助力实战开发!   密码登录: 1. redis-cli -h 127.0.0.1 -p 6379 -a flyvar 字符串类型: 1. set name ericzhao // set key value [EX seconds] [PX milliseconds] [NX|XX] 2.…
2025-05-10 阅读全文 →
FWQ
服务器教程
Redis参考指南:从数据类型到操作指令
Redis参考指南:从数据类型到操作指令 数据库小白一枚,正在不断学习积累知识,现将学习到的知识记录一下,也是将我的所得分享给大家!而今天这篇文章《Redis参考指南:从数据类型到操作指令》带大家来了解一下##content_title##,希望对大家的知识积累有所帮助,从而弥补自己的不足,助力实战开发! Redis是一个开源的内存键值存储数据库,它提供了多种数据类型以及相应的操作指令,可以用于多种场景的应用程序中。这篇文章将介绍Redis的数据类型和操作指令。 数据类型 1.1 字符串类型 字符串类型是Redis中最基本的数据类型之一,它是以字节数组的形式存储的。字符串类型的值可以是任何字符串,包括二进制数据。Redis提供了许多的操作指令,例如SET、GET、INCR等等。 1.2 列表类型 列表类型是由一个序列的元素组成的有序集合。元素可以是任何字符串。Redis提供了一系列的操作指令来操作列表,例如LPUSH、RPUSH、LPOP、RPOP、LLEN和LINDEX等等。 1.3 集合类型 集合类型是由一组元素组成的无序集合。元素可以是任何字符串。集合类型的特点是元素不可重复,Redis提供了一系列的操作指令来操作集合,例如SADD、SMEMBERS、SPOP、SCARD和SISMEMBER等等。 1.4 有序集合类型 有序集合类型是由一组元素组成的有序集合。元素可以是任何字符串。每个元素都有一个对应的分数,这个分数可以是任意浮点数。有序集合类型的特点是元素不可重复,同时元素可以基于分数进行排序。Redis提供了一系列的操作指令来操作有序集合,例如ZADD、ZRANGE、ZREMRANGEBYSCORE、ZRANK和ZCOUNT等等。 1.5 哈希类型 哈希类型是一种以键值对的形式储存的数据类型。哈希类型可以理解为是一个嵌套的字典,其中每个键值对都是一个字段。Redis提供了一系列的操作指令来操作哈希类型,例如HMSET、HGETALL、HINCRBY、HDEL和HEXISTS等等。 操作指令 2.1 SET和GET SET指令用于设置键的值,GET指令用于获取键的值。例如: SET key value GET key…
2025-05-10 阅读全文 →
FWQ
服务器教程
Redis在大规模并发下的应用实战
Redis在大规模并发下的应用实战 数据库小白一枚,正在不断学习积累知识,现将学习到的知识记录一下,也是将我的所得分享给大家!而今天这篇文章《Redis在大规模并发下的应用实战》带大家来了解一下##content_title##,希望对大家的知识积累有所帮助,从而弥补自己的不足,助力实战开发! Redis在大规模并发下的应用实战 随着互联网技术的不断发展,大规模并发的应用场景越来越多。在这些应用场景中,缓存技术是不可或缺的一部分。Redis作为一种高性能的开源缓存系统,被越来越多的企业所使用。 然而,Redis在面对大规模并发的情况下,也会面临一些挑战。本文将介绍一些Redis在大规模并发下的应用实战经验,希望能够为读者提供一些有用的参考。 配置优化 Redis的默认配置并不一定适合所有的应用场景,因此在实际使用中需要进行一些配置优化。以下几点是需要特别注意的: maxmemory-policy选项的选择:这个选项用来指定在内存超出限制时,应该使用什么策略来对缓存进行清理。不同的应用场景可能需要使用不同的策略,比如说最近最少使用(LRU)、最少访问(LFU)、随机(random)等。需要根据实际情况进行调整。 TCP参数的设置:在高并发情况下,TCP的参数也需要进行调整,以便更好地支持并发连接。需要特别关注的参数包括syncookies、tcp_tw_recycle、tcp_tw_reuse等。 Redis持久化:在Redis中,数据可以通过RDB(快照)或AOF(追加)方式进行持久化。需要根据实际情况选择合适的方式,并进行相应的配置。 主从复制 在高并发场景下,单个Redis实例的性能可能无法满足需求。这时可以考虑使用主从复制,将负载分配到多个实例上,并实现故障转移。以下是一些主从复制的实战经验: 不同Redis实例之间的时间误差可能会导致数据同步的延迟。需要通过配置NTP服务器等方式来确保不同实例之间的时间一致性。 主从复制还需要考虑网络带宽、复制延迟等因素。建议在实际生产环境中进行充分测试,并根据实际情况调整复制间隔等参数。 当主Redis宕机时,需要快速将从Redis切换为主Redis。在实际实现中,可以使用Redis Sentinel等工具来实现自动切换和故障恢复。 数据结构的选择 Redis支持多种不同的数据结构,不同的数据结构具有不同的优点和缺点。在使用Redis进行缓存时,需要基于实际需求选择合适的数据结构,并进行相应的优化。 字符串(string):适合存储较小的数据和短期缓存。 列表(list):适合存储一些较大的数据集合,比如说队列等。 集合(set):适合存储不重复的数据集合,支持快速的交集、并集等操作。 有序集合(sorted set):和集合类似,但是可以为每个元素指定一个分数,支持按照分数排序等操作。 哈希表(hash):适合存储一些结构化的数据,比如说大量的key-value数据。 限流策略 在高并发场景下,大量请求同时访问缓存系统可能会导致系统崩溃或性能下降。因此,需要采取一些限流策略,以遏制请求并发。 以下是一些常用的限流策略: 限速:在缓存层面采用限速策略,比如说通过设置请求频率、流量限制等方式。…
2025-05-10 阅读全文 →
FWQ
服务器教程
最新Redis未授权访问漏洞,该如何守护Redis安全?
最新Redis未授权访问漏洞,该如何守护Redis安全? 收藏 来到golang学习网的大家,相信都是编程学习爱好者,希望在这里学习数据库相关编程知识。下面本篇文章就来带大家聊聊《最新Redis未授权访问漏洞,该如何守护Redis安全?》,介绍一下Redis、设计、数据库,希望对大家的知识积累有所帮助,助力实战开发!  Redis是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。近期,Redis被爆出存在通过主从复制从而Getshell的漏洞。 在Redis4.x以及以上版本中,因为新增了模块功能,攻击者可以通过构造恶意代码,使被攻击的服务器加载恶意.so文件,如果redis-server以root权限启动,使得恶意代码能够被执行,攻击者就可以在服务器上创建他想创建的任意文件,危害非常的大。 Redis作者的理念是“简洁为美”,所以并没有为Redis设计复杂的安全配置,那么要如何保证Redis的安全呢? 配置防火墙保护redis ​通过配置防火墙防止外部用户访问它的redis端口。 不使用redis的默认端口 防止外部用户访问Redis,指定信任的Redis的IP,防止外部访问,仅有可信的用户IP才能访问Redis端口。如果不禁止的话,当受到来自外部攻击时很有可能所有的数据都将被删除。 设置访问redis时需要密码授权 Redis对于经典网络的实例强制开启密码鉴权,用户可以通过设置复杂的密码避免密码被攻破。需要注意的是,密码的强度要设置足够高,例如32位以上。redis的性能非常好,暴力破解密码的话,每秒钟可以达到15万次。 使用禁用命令 在 Redis 中可以禁用命令或者将它们重命名成难以推测的名称,这样只有内部用户能够这些重命名的名称,而一般的用户只能够使用一部分命令。 对一些危险命令进行重命名,能够防止恶意操作,相当于把命令名称变为密码,只有内部人员知道。 Redis 在优化高性能以及易用性上下功夫,对于安全方面并没有极力去优化。因此redis需要运行在安全的环境下,就要要做好redis外部的安全工作。
2025-05-10 阅读全文 →
FWQ
服务器教程
如何使用Redis和Node.js开发实时聊天功能
如何使用Redis和Node.js开发实时聊天功能 知识点掌握了,还需要不断练习才能熟练运用。下面golang学习网给大家带来一个数据库开发实战,手把手教大家学习《如何使用Redis和Node.js开发实时聊天功能》,在实现功能的过程中也带大家重新温习相关知识点,温故而知新,回头看看说不定又有不一样的感悟! 如何使用Redis和Node.js开发实时聊天功能 随着互联网的发展,实时通信已成为许多网站和应用程序必不可少的功能之一。在众多实时通信的技术中,Redis和Node.js的结合是一种非常强大和流行的选择。Redis是一种高性能的键值存储数据库,而Node.js是一个基于事件驱动的JavaScript运行时环境,两者的结合可以轻松实现实时聊天功能。本文将指导您使用Redis和Node.js来开发一个简单的实时聊天功能,并提供具体的代码示例。 安装Redis和Node.js首先,您需要在您的开发环境中安装Redis和Node.js。您可以从Redis的官方网站(https://redis.io/)下载并安装Redis,在命令行中运行redis-server启动Redis服务器。而Node.js的官方网站(https://nodejs.org/)提供了Node.js的二进制安装包和源代码,您可以根据自己的需求选择合适的安装方式。 创建一个Node.js项目使用您喜欢的代码编辑器创建一个新的文件夹,并在命令行中进入该文件夹。然后,运行以下命令来初始化您的Node.js项目: npm init 按照提示输入项目的名称、版本等信息,完成项目初始化。 安装所需的Node.js模块在项目的根目录中,运行以下命令来安装所需的Node.js模块: npm install express socket.io redis 这将安装Express、Socket.IO和Redis这三个模块,它们将用于实现实时聊天功能。 创建服务器端代码在您的项目中创建一个名为server.js的文件,并将以下代码复制到其中: const express = require('express'); const redis = require('redis'); const app =…
2025-05-10 阅读全文 →