b2科目四模拟试题多少题驾考考爆了怎么补救
b2科目四模拟试题多少题 驾考考爆了怎么补救

Redis开创了一种新的数据存储思路(图)

电脑杂谈  发布时间:2021-05-06 13:01:54  来源:网络整理

Redis创建了一个新的数据存储想法。使用Redis,当面对单调的时,我们不必专注于如何将大象放在冰箱中的问题,而是使用Redis可以更加灵活。可变的数据结构和数据操作可以为不同的大象建造不同的冰箱。

Redis常用数据类型

Redis最常用的数据类型:

1.字符串2.哈希3.列表4.集5.排序集

1、字符串

常用命令:set,get,decr,incr,mget等。

应用场景:字符串类型是最简单,最常用的redis数据结构。键/值格式可以完全取代Memcached作为缓存服务器。单机测试结果表明,redis的效果更好。

设置,获取:最简单的数据缓存

mset,mget:批处理操作,统一的数据传输回客户端,节省网络io时间

decr,incr:计数器

append命令:它可以用作时间序列,以对具有getrange和setrange的字符串进行操作。目前,redis还没有修剪操作。

setbit,getbit:用于节省内存的好命令,可以用作简单的布尔过滤器,以确定用户是否已执行某些操作

2、列表

常用命令:lpush,rpush,lpop,rpop,lrange等。

应用场景:List的应用场景很多,应用范围非常广泛。

lpush,lpop:自然的队列操作,易于完成队列任务,我们选择redis作为Celery的存储容器

lpush,ltrim:显示最新数据,非常易于使用!例如:游戏上方的字幕,您可以使用这两个命令来存储最新的50条记录

还有其他一些操作:阻止blpop,lrange(O(n)),lindex(O(n)),linsert(O(n)),llen(O(1)),lrem(O(n )),lset(O(n))

3、哈希

常用命令:hget,hset,hgetall等。

应用场景:过去,如果在memcached中保存大量数据,通常是在序列化后保存,然后在反序列化后取出并使用,这不经济且负担得起,并且在高并发下存在原子性问题。在redis中,使用哈希实现,非常容易!

hget,hset:实现一个键对应于一个数据集集合,该数据集集合包含多个单独的键/值键-值对,操作仍然是原子的

hmget,hmset,hgetall:批处理操作,节省网络IO时间

hincrby:在哈希中的字段值上自动添加1

其他操作:hdel(O(n)),hkeys(O(n)),hexits(O(1)),hvals(O(n)),hscan(O(n))

4、设置

常用命令:

添加,spop,smember,sunion等

应用场景:set与list相似,不同之处在于set是一个重复数据删除的集合。如果需要非重复的数据结构,请考虑设置。

添加:存储不重复数据的数据集合

sunion,sdiff,sinter:例如在微博中执行收集处理,将所有跟随用户的人放入集合中,并通过并集,交集和差异运算实现“共同关注”和“共同偏好” `,`第二个朋友`和其他功能

其他操作:srem,spop,scard,sismember,smooth,srandmember

5、排序集

常用命令:

zadd,zrange,zrem,zcard等

应用场景:集合是无序的和排序的集合,顾名思义,集合是有序的,由键,成员和分数组成。它需要一个有序且非重复的数据结构,因此请考虑排序集

zadd:存储按分数排序的数据集,添加后自动排序,例如:优先级队列,普通消息的分数为1,重要消息的分数为2,然后工作线程可以选择获取按照得分任务的相反顺序进行工作。优先处理重要任务。

zrange,zrangebyscore等:按得分顺序获取数据集,例如:微博的时间流信息,并以释放时间作为得分。它也可以用于处理过期的数据。后台任务使用ZRANGE ... SCORES查询排序的集合并检索最新的10个项目。如果发现unix时间已过期,则会在中删除该条目。

zrank:排名功能,将得分作为投票结果

其他操作:zcard,zcount,zinnerby,zrem,zscore和集合收集操作

Redis的5种常见使用场景

1、会话缓存

使用Redis的最常用方案是会话缓存。使用Redis在其他存储(例如Memcached)上缓存会话的优点是Redis提供了持久性。当维护一个不严格要求一致性的缓存时,如果所有用户的购物车信息丢失,大多数人将不满意。现在,他们还会这样吗?

幸运的是,随着Redis多年来的改进,很容易找到如何正确使用Redis缓存会话文档的方法。甚至著名的商业平台Magento都为Redis提供了插件。

2、全页缓存(FPC)除了基本会话令牌外,Redis还提供了一个非常简单的FPC平台。回到一致性问题,即使重新启动Redis实例,由于磁盘持久性,用户也不会看到页面加载速度下降。与PHP本地FPC相似,这是一个很大的改进。再次以Magento为例,Magento提供了一个插件来使用Redis作为全页缓存后端。此外,对于WordPress用户,万神殿有一个非常不错的插件wp-redis,它可以帮助您尽快加载浏览过的页面。 3、队列Reids在内存存储引擎领域的主要优势是提供列表和设置操作,这使Redis成为一个很好的消息队列平台。 Redis作为队列的操作类似于列表上本地编程语言(例如Python)的push / pop操作。如果您在Google中快速搜索“ Redis队列”,您将立即发现大量的开源项目。这些项目的目的是使用Redis创建非常好的后端工具来满足各种队列需求。例如,Celery的后端使用Redis作为代理。您可以从这里检查。排行榜/计数器Redis很好地实现了增加或减少内存中数字的操作。 Set和Sorted Set也使我们执行这些操作非常简单。 Redis只是提供了这两个数据结构。因此,我们需要从排序后的集合中获取前10名用户,我们将其称为“ user_scores”,我们只需要执行以下操作:当然,这是假设您基于用户的得分升序进行排序。如果要返回用户和用户分数,则需要执行以下操作:ZRANGE user_scores 0 10 WITHSCORESAgora Games是一个很好的示例,在Ruby中实现,并且其排行榜使用Redis来存储数据,您可以在此处看到To。

Redis实际应用场景

Redis在许多方面与其他解决方案不同:它使用内存提供主存储支持,但仅使用硬盘进行持久性存储;它的数据模型非常独特,并且使用单个线程。另一个很大的不同是,您可以在开发环境中使用Redis功能,但无需切换到Redis。

也希望切换到Redis。从一开始,许多开发人员就选择Redis作为首选。但是可以想象,如果已经建立了开发环境并且应用程序已经在其上运行,那么更改框架显然不是那么容易。此外,在某些需要大容量数据集的应用程序中,Redis也不合适,因为它的数据集不会超过系统的可用内存。因此,如果您有大数据应用程序,并且主要是读取访问模式,那么Redis不是正确的选择。

但是,我对Redis的满意之处在于您可以将其集成到系统中,这可以解决许多问题,例如现有处理缓慢的任务。您可以通过Redis进行优化,也可以为应用程序创建一些新功能。在本文中,我想讨论如何将Redis添加到现有环境中,以及如何使用其原始命令和其他功能来解决传统环境中遇到的一些常见问题。在这些示例中,Redis不是首选。

Redis使用经验

一、 Redis部署

由于我们公司中的数据量很少,我们一直在使用三个Redis实例,一个主实例和两个从属实例,三个哨兵分别监视三个Redis实例,以确保高可用性。预计此事件的参与者数量以及请求并发非常大,因此为了确保高可用性,在部署过程中进行了以下更改:

更换SSD硬盘并将内存增加到128G(简单粗暴,效果显着)

双机房中有两组Redis实例,一组用于外部服务,另一组作为热备份。它不提供服务,并定期备份。如果服务中的实例失败,请立即将备份实例切换到服务实例。

操作系统参数:vm.over_commit_memory配置默认值为0,更改为1

Redis快照,AOF文件重写,主-备份同步和其他功能都依赖于fork系统调用。以快照(bgsave / save)为例,Redis将派生一个子进程,并且该子进程将存储当前数据。这是一个RDB文件。

vm.over_commit_memory将影响内存分配,其值可以为:

0:指示内核将检查是否有足够的可用内存用于应用程序进程;如果有足够的可用内存,则允许使用内存应用程序;否则,内存应用程序将失败,并且错误将返回到应用程序进程。

1:表示内核允许分配所有物理内存,而与当前内存状态无关。

2:表示内核允许分配的内存超过所有物理内存和交换空间的总和。

vm.over_commit_memory的默认值为0。在此配置下,当Redis执行派生时,服务器的可用内存必须大于Redis当前使用的内存的两倍,派生成功之前。

实际上,当Linux分叉时,它使用COW(写时复制)技术。子进程共享父进程的地址空间。仅当共享地址空间更改时,才需要复制更改后的内存部分;在大多数情况下,fork子进程不会使内存使用量增加一倍。完全没有必要为fork保留两倍的内存。 Redis启动时,还建议用户将vm.over_commit_memory设置为1。

操作系统参数:vm.swapiness设置为0

Redis是全内存KV。当服务器内存不足时,操作系统的交换机制可能会将部分Redis数据交换到磁盘上。在访问Redis时,如果访问的数据不在内存中,则会产生Page Fault中断,从磁盘读取数据,这种行为将极大地影响Redis服务的性能。

为了确保Redis服务的性能,应尽可能避免交换,并将vm.swapiness设置为0(此参数可以是0到100之间的值,默认值为60,使用交换空间的可能性更高)。

操作系统参数:透明的大页面

Linux- 2. 6. 38内核引入了对透明大内存页面的支持,此参数对Redis有利有弊。

优点是:大内存页意味着较小的页表,并且fork的开销将大大减少

缺点是:内存页面大,这意味着该页面更可能被修改,并且在COW中复制成本更高

二、压力测试过程中遇到的问题和解决方案

保证服务可靠性,在组合方案中对主要单个接口进行压力测试以及对多接口进行压力测试,观察接口的响应时间和服务的吞吐量,并在意外情况下对Redis机器进​​行故障转移,例如机房电源关闭,主Redis挂起,等等。

问题:

复杂的业务逻辑,频繁访问redis,界面响应时间有改进的空间

您需要清除的数据。执行flushdb之后,数据仍然存在(原因:中的数据量很大,清空操作超过3秒。Sentinel发现主服务器在3秒内未正确响应,因此它将从服务器拉为从服务器。主机,从同步进入循环...)

Redis当前的主从同步机制。断开主从连接后,如果滞后数据超过1M(可配置,内存开销越大,内存开销越大),则需要重新同步一次完整量,完全同步将导致极端大。内存,磁盘,CPU和网络开销。在主从完全同步过程中,如果有更多的写入,则主从同步缓冲区将继续累积写入的数据。当累积的数据超过限制时,主从连接将断开连接,从设备必须重新连接到主请求已完全同步,因此来回...同步未成功。

当数据量很大时,虽然redis的bgsave操作是子过程操作,但它也会阻塞redis并导致超时

项目:

mysql读写分离,以及子,子表

Redis数据碎片,将重要数据和不重要数据分离为两个Redis实例以分别存储

通过使用mget,hmget,pipeline等一次读取多个数据命令,减少了代码中的Redis网络IO请求

考虑在代码中使用更合适的redis数据结构和命令,以减少时间复杂度。 Instagram公司优化了Redis使用记忆盒

在设计数据结构时,请尝试减小单个键的值大小。如果单例redis中的数据量太大,则故障恢复或同步过程将非常缓慢。单例redis使用的最大内存必须小于计算机最大内存的一半。

在清除包含大量数据的之前,请先增加哨兵的自动故障转移时间,然后在清除后将其重新设置。

适当扩展client-output-buffer-limit slave的配置值256mb 64mb 60

必须设置当前限制,在操作和维护层设置一个限制,在代码层设置一个限制,以确保整个服务器不会出现故障。

替代方案:

对于复杂的redis操作,您可以考虑使用简短的lua脚本来执行,使用eval和evalsha命令(优点:充分利用CPU,减少网络IO时间。缺点:维护不便,以确保脚本不会阻止)

传统的一台主机和多台从机A–B&C。当B成为主机时,C仍将清除自己的数据以同步B。Psync的可恢复传输对此没有影响,因此请考虑更改为A。--B--C同步结构

redis集群(时间紧,请考虑但暂时不采用)

使用主服务器不打开持久性,从打开持久性开始,不会有由于大量数据和bgsave引起的连接超时(缺点:在A-B&C模式下,A发生故障并被自动拉高或前哨B是作为主机上拉的,中间的心跳检测过程中还会有一个间隔,导致从机同步主机,发现A没有数据,并且会清除自己的数据,这非常危险!)


本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/shoujiruanjian/article-373451-1.html

    相关阅读
      发表评论  请自觉遵守互联网相关的政策法规,严禁发布、暴力、反动的言论

      热点图片
      拼命载入中...