redis和ray没有关系。Redis和Ray是两个不同的技术,Redis是一种开源的高性能内存数据库,主要用于缓存、消息队列、会话管理等场景。而Ray则是一种分布式计算框架,可以用于构建分布式应用程序,包括机器学习、强化学习、数据处理等应用场景,因此没有直接的关系。
Redis是一个开源的内存中的数据结构存储系统,它可以用作数据库、缓存和消息中间件。
它支持多种类型的数据结构,如字符串(Strings),散列(Hashes),列表(Lists),集合(Sets),有序集合(SortedSets或者是ZSet)与范围查询,Bitmaps,和地理空间(Geospatial)索引半径查询。其中常见的数据结构类型有String、List、Set、Hash、ZSet这5种。
redis 能不能做数据库,要看你具体的需求了。
1 像楼上各位大牛提到的,redis的持久化有问题,如果 使用aof模式,并且fsync always,则性能比mysql 还低,如果你喜欢redis 方便的数据结构而对性能要求不高,或者性能要求很高,但允许一定程度的丢失数据,则可以用redis做为数据库。
2 redis 是内存数据库, 内存写满后,数据不会存储到硬盘上(VM 不稳定,diskstore未启用),如果你内存足够大,则可以用redis作为数据库。
我们知道redis是一个 高效的分布式内存数据库 ,由于是 *** 作内存所以性能非常之快,通常用它来做分布式缓存,用来提高微服务的高性能,但是因为是内存 *** 作,所以当出现服务器故障,断电等情况就会造成 内存数据丢失 ,不可恢复,因此redis 引入了持久化机制来将内存数据写入磁盘,从而保障了Redis的数据不被丢失。
Redis有两种持久化的方式,一种是RDB,另外种是AOF。
RDB是将Redis内存中数据的快照存储在磁盘内,是Redis的默认持久化方案。
RDB持久化默认有三种策略
可在redisconf中配置,会以一段时间内达到指定修改的次数为规则来触发快照 *** 作,快照文件名为dumprdb。每当Redis服务重启的时候都会从该文件中把数据加载到内存中。
在60秒内有10000次 *** 作即触发RDB持久化。
没有满足第一种条件时,在900秒内有1次 *** 作即触发RDB持久化。
没有满足第二种条件时,在300秒内有10次 *** 作即触发RDB持久化。
RDB持久化除了可以根据配置中的策略来触发外,还可以使用save和bgsave命令手动来触发。这两个命令的区别在于save会阻塞服务器进程。在执行save命令的过程中,服务器不能处理任何请求,但是bgsave(background save,后台保存)命令会通过一个子进程在后台处理数据RDB持久化。本质上save和bgsave调用的都是rdbSave函数,所以Redis不允许save和bgsave命令同时执行,当然这也是为了避免RDB文件数据出现不一致性的问题。
每次都是一个大文件,备份写入IO *** 作笔记大,很容易耗时,影响进程资源使用。
如果最近一次进程崩溃,那么最近一次数据备份后的数据就被丢失。
文件直接就可以当冷备使用
AOF(Append Only File)以独立日志的方式记录每次的写命令,可以很好地解决了数据持久化的实时性。系统重启时可以重新执行AOF文件中的命令来恢复数据。AOF会先把命令追加在AOF缓冲区,然后根据对应策略写入硬盘。
AOF的实现流程有三个步骤
步骤一
把命令追加到AOF缓冲区,
步骤二
将缓冲区的内容写入程序缓冲区
步骤三
将程序缓冲区的内容写入文件
当AOF持久化功能处于开启状态时,服务器每执行完一个命令就会将命令以协议格式追加写入redisServer结构体的aof_buf缓冲区。而在服务重启的时候会把AOF文件加载到缓冲区中。
AOF有 三种触发机制
·always:每次发生数据变更都会被立即记录到磁盘,性能较差,但数据完整性比较好。
·everysec:每秒钟将aof_buf缓冲区的内容写入AOF文件,如果宕机,就会有1秒内的数据丢失。
·no:将数据同步 *** 作交给 *** 作系统来处理,性能最好,但是数据可靠性最差。在配置文件中设置appendonly=yes后,若没有指定apendfsync,默认会使用everysec选项。
写入指令随着时间的推移,记录了很多重复的指令,导致数据量非常大。
RDB优先级高于AOF
RDB小,AOF较大
RDB慢,AOF快
RDB快,AOF慢
从业务服务器到Redis服务器这条调用链路中变慢的原因可能有2个
但是大多数情况下都是Redis服务的问题。但是应该如何衡量Redis变慢了呢?命令执行时间大于1s,大于2s?这其实并没有一个固定的标准。
例如在一个配置较高的服务器中,05毫秒就认为Redis变慢了,在一个配置较低的服务器中,3毫秒才认为Redis变慢了。所以我们要针对自己的机器做基准测试,看平常情况下Redis处理命令的时间是多长?
我们可以使用如下命令来监测和统计测试期间的最大延迟(以微秒为单位)
比如执行如下命令
参数中的60是测试执行的秒数,可以看到最大延迟为3725微秒(3毫秒左右),如果命令的执行远超3毫秒,此时Redis就有可能很慢了!
那么Redis有哪些慢 *** 作呢?
Redis的各种命令是在一个线程中依次执行的,如果一个命令在Redis中执行的时间过长,就会影响整体的性能,因为后面的请求要等到前面的请求被处理完才能被处理,这些耗时的 *** 作有如下几个部分
Redis可以通过日志记录那些耗时长的命令,使用如下配置即可
执行如下命令,就可以查询到最近记录的慢日志
之前的文章我们已经介绍了Redis的底层数据结构,它们的时间复杂度如下表所示
名称 时间复杂度 dict(字典) O(1) ziplist (压缩列表) O(n) zskiplist (跳表) O(logN) quicklist(快速列表) O(n) intset(整数集合) O(n)
「单元素 *** 作」 :对集合中的元素进行增删改查 *** 作和底层数据结构相关,如对字典进行增删改查时间复杂度为O(1),对跳表进行增删查时间复杂为O(logN)
「范围 *** 作」 :对集合进行遍历 *** 作,比如Hash类型的HGETALL,Set类型的SMEMBERS,List类型的LRANGE,ZSet类型的ZRANGE,时间复杂度为O(n),避免使用,用SCAN系列命令代替。(hash用hscan,set用sscan,zset用zscan)
「聚合 *** 作」 :这类 *** 作的时间复杂度通常大于O(n),比如SORT、SUNION、ZUNIONSTORE
「统计 *** 作」 :当想获取集合中的元素个数时,如LLEN或者SCARD,时间复杂度为O(1),因为它们的底层数据结构如quicklist,dict,intset保存了元素的个数
「边界 *** 作」 :list底层是用quicklist实现的,quicklist保存了链表的头尾节点,因此对链表的头尾节点进行 *** 作,时间复杂度为O(1),如LPOP、RPOP、LPUSH、RPUSH
「当想获取Redis中的key时,避免使用keys 」 ,Redis中保存的键值对是保存在一个字典中的(和Java中的HashMap类似,也是通过数组+链表的方式实现的),key的类型都是string,value的类型可以是string,set,list等
例如当我们执行如下命令后,redis的字典结构如下
我们可以用keys命令来查询Redis中特定的key,如下所示
keys命令的复杂度是O(n),它会遍历这个dict中的所有key,如果Redis中存的key非常多,所有读写Redis的指令都会被延迟等待,所以千万不用在生产环境用这个命令(如果你已经准备离职的话,祝你玩的开心)。
「既然不让你用keys,肯定有替代品,那就是scan」
scan是通过游标逐步遍历的,因此不会长时间阻塞Redis
「用用zscan遍历zset,hscan遍历hash,sscan遍历set的原理和scan命令类似,因为hash,set,zset的底层实现的数据结构中都有dict。」
「如果一个key对应的value非常大,那么这个key就被称为bigkey。写入bigkey在分配内存时需要消耗更长的时间。同样,删除bigkey释放内存也需要消耗更长的时间」
如果在慢日志中发现了SET/DEL这种复杂度不高的命令,此时你就应该排查一下是否是由于写入bigkey导致的。
「如何定位bigkey」
Redis提供了扫描bigkey的命令
可以看到命令的输入有如下3个部分
这个命令的原理就是redis在内部执行了scan命令,遍历实例中所有的key,然后正对key的类型,分别执行strlen,llen,hlen,scard,zcard命令,来获取string类型的长度,容器类型(list,hash,set,zset)的元素个数
使用这个命令需要注意如下两个问题
「如何解决bigkey带来的性能问题?」
我们可以给Redis中的key设置过期时间,那么当key过期了,它在什么时候会被删除呢?
「如果让我们写Redis过期策略,我们会想到如下三种方案」
定时删除策略对CPU不友好,当过期键比较多的时候,Redis线程用来删除过期键,会影响正常请求的响应
惰性删除读CPU是比较有好的,但是会浪费大量的内存。如果一个key设置过期时间放到内存中,但是没有被访问到,那么它会一直存在内存中
定期删除策略则对CPU和内存都比较友好
redis过期key的删除策略选择了如下两种
「惰性删除」 客户端在访问key的时候,对key的过期时间进行校验,如果过期了就立即删除
「定期删除」 Redis会将设置了过期时间的key放在一个独立的字典中,定时遍历这个字典来删除过期的key,遍历策略如下
「因为Redis中过期的key是由主线程删除的,为了不阻塞用户的请求,所以删除过期key的时候是少量多次」 。源码可以参考expirec中的activeExpireCycle方法
为了避免主线程一直在删除key,我们可以采用如下两种方案
Redis是一个内存数据库,当Redis使用的内存超过物理内存的限制后,内存数据会和磁盘产生频繁的交换,交换会导致Redis性能急剧下降。所以在生产环境中我们通过配置参数maxmemoey来限制使用的内存大小。
当实际使用的内存超过maxmemoey后,Redis提供了如下几种可选策略。
「Redis的淘汰策略也是在主线程中执行的。但内存超过Redis上限后,每次写入都需要淘汰一些key,导致请求时间变长」
可以通过如下几个方式进行改善
Redis的持久化机制有RDB快照和AOF日志,每次写命令之后后,Redis提供了如下三种刷盘机制
「当aof的刷盘机制为always,redis每处理一次写命令,都会把写命令刷到磁盘中才返回,整个过程是在Redis主线程中进行的,势必会拖慢redis的性能」
当aof的刷盘机制为everysec,redis写完内存后就返回,刷盘 *** 作是放到后台线程中去执行的,后台线程每隔1秒把内存中的数据刷到磁盘中
当aof的刷盘机制为no,宕机后可能会造成部分数据丢失,一般不采用。
「一般情况下,aof刷盘机制配置为everysec即可」
在持久化一节中,我们已经提到 「Redis生成rdb文件和aof日志重写,都是通过主线程fork子进程的方式,让子进程来执行的,主线程的内存越大,阻塞时间越长。」
可以通过如下方式优化
当机器的内存不够时, *** 作系统会将部分内存的数据置换到磁盘上,这块磁盘区域就是Swap分区,当应用程序再次访问这些数据的时候,就需要从磁盘上读取,导致性能严重下降
「当Redis性能急剧下降时就有可能是数据被换到Swap分区,我们该如何排查Redis数据是否被换到Swap分区呢?」
每一行Size表示Redis所用的一块内存大小,Size下面的Swap表示这块大小的内存,有多少已经被换到磁盘上了,如果这2个值相等,说明这块内存的数据都已经被换到磁盘上了
我们可以通过如下方式来解决
最后我们总结一下Redis的慢 *** 作
Copyright © 1999-2020, CSDNNET, All Rights Reserved
Redis
登录
骑行天下_徐鑫
关注
redis和MongoDB比较 转载
2019-07-02 22:00:52
1点赞
骑行天下_徐鑫
码龄3年
关注
Redis技术陷阱
Redis 基于内存,也可以基于磁盘持久化NoSql数据库,使用 c语言编写,常用端口6379
Redis对内存依赖性很强的NoSql数据库,在内存足够的情况下性能出色,但是一般情况下,服务器内存并没有那么多。
一般情况下,Redis会索取大量服务器内存进行存储数据,以达到快速读取查询的效果。当对Redis插入数据后,redis会异步将数据dump到硬盘中,
比如服务器内存是20G,Redi会fork一个进程,并且会占用同样的大小内存,他需要的内存空间瞬间变为20+20=40G,这是内存超过了物理内存的限制,马上会启动虚拟内存,虽然服务器会有虚拟内存,但是那是服务器的虚拟内存,并不是redis自己的虚拟内存。
Linux虚拟内存page很大,IO剧增,dump速度非常慢,整个服务器的性能降到冰点,服务请求会堵塞,严重到服务器崩溃。
对于单台机子,最好是降低redis虚拟内存设置,page可以根据配置进行修改,这个虚拟内存比Linux虚拟内存好多,因为page小很多。
如果Redis既要读又要写,那么最好不要用redis占用大半的内存。
可以设置它的虚拟内存到8G,但是要根据key值大小去衡量,因为key必须在内存中,这样一来就算是启用了虚拟内存,redis占用的实际内存也会超出设想。
官方建议对key小,value很大的数据设置虚拟内存。
另外master/slave不是很成熟,目前只支持主从,Redis在master是非阻塞模式,也就是说在slave执行数据同步的时候,master是可以接受客户端的请求的,并不影响同步数据的一致性,然而在slave端是阻塞模式的,slave在同步master数据时,并不能响应客户端的查询。
可以根据master/slave 的特点,master不dump,只负责写数据,让slaver去dump
Redis如何持久化:持久化就是将内存中的数据写入到硬盘中。
(1):RDB:是将数据写入到临时文件(dumprdb),持久化之后用这个临时文件替换上次持久化文件,达到数据恢复的目的。RDB是间隔异地短时间进行持久化,如果持久化之间redis发生故障,会发生数据丢失,所以这种方式更适合数据要求不严谨的时候,默认开启。
(2):Redis内存淘汰策略:指的是用户存储的一些键可以被redis主动从实例中删除,从而产生miss的情况,内存淘汰是为了更好地使用内存,用一定的缓存miss来换取内存的使用率。① noeviction:默认策略,不删除任意数据,但是内存不够时,会直接返回错误
② Allkeys-lru:从数据集中(包括设置过期时间和未设置过期时间的数据集),优先移除最近未使用的key
③ Volatile-lru:在设置了过期时间的数据集中,优先移除最近未使用的key
④ Allkeys-random:从数据集中(包括设置过期时间和未设置过期时间的数据集),随机移除某个key
⑤ Volatile-random:在设置了过期时间的数据集中,随机移除某个key
Volatile-ttl:在设置了过期时间的数据集中,具有更早过期时间的key优先移除。
Redis有些数据类型:String Hash List Sets ZSets(存放多个值,不可有重复,有顺序,不同的是每个元素都会关联Double类型的分数,redis正是通过分数来为集合中的成员进行从小到大排序),
Redis使用场景:
缓存热数据使用,热数据就是在项目中经常会被查询,但不经常会被修改和删除的数据。
计数器,诸如统计点击数等应用。
队列
位 *** 作(大数据处理),比如统计QQ用户在线。
最新列表
排行榜,使用zadd添加有序集合
Linux虚拟内存:
为了运行比实际物理内存容量还要大的程序,包括Linux在内的所有现代 *** 作系统几乎毫无里外都采用了虚拟内存技术。虚拟内存技术,可让系统看上去具有比实际意义内存大得多的内存空间,并为实现多道程序的执行创造条件。
虚拟内存概念:总所周知,为了对内存中的存储单元进行识别,内存中的每一个存储单元都必须有一个确切的地址。而一台计算机的处理器能访问多大的内存空间就取决于处理器的程序计数器,该计数器字长越长,能访问的空间越大。
例如对于程序计数器位数为32位的处理器来说,他的地址发生器所能发出的地址数目2^32=4G个,于是这个处理器所能访问的最大内存空间就是4G。载计算机技术中,这个值就是处理器的寻址空间或寻址能力。
MongoDB
文档结构的存储方式。能够快捷获取数据
支持GridFS 支持大容量存储,海量数据存储
海量数据下,性能优越
动态查询
全索引支持,拓展到内部对象和内嵌数组
查询记录分析
快速,就地更新
高效存储二进制大对象
复制和支持自动恢复故障
内置Auto-Sharding 自动分片支持云级别拓展性。分片简单
MapReduce 支持复杂聚合
缺点:不支持事务 *** 作,占用硬盘空间大,没有Mysql成熟的维护工具,无法进行关联表查询,不适用于关系多的数据,复杂句和 *** 作通过mapreduce创建,速度慢,模式自由,自由灵活的文件存储格式带来的数据错误,MongoDB在你删除记录后不会在文件系统回收空间,除非删掉数据库,但是空间没有浪费。
分布式文件存储数据库,介于NoSql和关系型数据库之间的一款产品,基于C++编写,具有查询语言、索引、key-value存储结构,MongoDB存储数据是以BSON类型(二进制json)。
Redis(读写快) ---àMongoDB (数据量大、查询统计、缺乏事务支持)àOracle(数据量大、查询统计方便、事务强)
MongoDB适用于表单数据 *** 作、完整性要求不高的系统使用,高性能、易部署、易使用,存储数据非常方便。MongoDB :库->集合 JSON对象记录
区别联系:
(1):性能方面:Redis大于MongoDB、MongoDB支持丰富的数据表达,索引,最类似于关系型数据库,支持查询的语言非常丰富,redis数据结构方面更加丰富,可以存储List/set/Hash/sort Set等集合。
(2):内存空间和数据量大小: MongoDB适合大量数据存储
(3):数据一致性 Redis事务支持比较弱,MongoDB不支持事务
(4):Redis用在数据量较小的 *** 作和运算上,Mongodb主要解决海量数据访问效率问题。
(5)MemCachd 不支持数据持久化,断电或者重启后数据消失,但其稳定性是有保证的,redis支持数据持久化和数据恢复,允许单点故障
1Memcached单个key-value大小有限,一个value最大只支持1MB,而Redis最大支持512MB
2Memcached只是个内存缓存,对可靠性无要求;而Redis更倾向于内存数据库,因此对对可靠性方面要求比较高
3从本质上讲,Memcached只是一个单一key-value内存Cache;而Redis则是一个数据结构内存数据库,支持五种数据类型,因此Redis除单纯缓存作用外,还可以处理一些简单的逻辑运算,Redis不仅可以缓存,而且还可以作为数据库用
4新版本(30)的Redis是指集群分布式,也就是说集群本身均衡客户端请求,各个节点可以交流,可拓展行、可维护性更强大。
关于其原因,在官方的FAQ中,提到有如下几个方面:
1、空间的预分配:为避免形成过多的硬盘碎片,mongodb每次空间不足时都会申请生成一大块的硬盘空间,而且申请的量从64M、128M、256M那 样的指数递增,直到2G为单个文件的最大体积。随着数据量的增加,你可以在其数据目录里看到这些整块生成容量不断递增的文件。
2、字段名所占用的空间:为了保持每个记录内的结构信息用于查询,mongodb需要把每个字段的key-value都以BSON的形式存储,如果 value域相对于key域并不大,比如存放数值型的数据,则数据的overhead是最大的。一种减少空间占用的方法是把字段名尽量取短一些,这样占用 空间就小了,但这就要求在易读性与空间占用上作为权衡了。
3、删除记录不释放空间:这很容易理解,为避免记录删除后的数据的大规模挪动,原记录空间不删除,只标记“已删除”即可,以后还可以重复利用。
4、可以定期运行dbrepairDatabase()来整理记录,但这个过程会比较缓慢
MongoDB没有如MySQL那样成熟的维护工具,这对于开发和IT运营都是个值得注意的地方。
大致为两种措施:
一、脚本同步:
1、自己写脚本将数据库数据写入到redis/memcached。
2、这就涉及到实时数据变更的问题(mysqlrowbinlog的实时分析),binlog增量订阅Alibaba的canal,以及缓存层数据丢失/失效后的数据同步恢复问题。
二、业务层实现:
1、先读取nosql缓存层,没有数据再读取mysql层,并写入数据到nosql。
2、nosql层做好多节点分布式(一致性hash),以及节点失效后替代方案(多层hash寻找相邻替代节点),和数据震荡恢复了。
redis实现数据库缓存的分析:
对于变化频率非常快的数据来说,如果还选择传统的静态缓存方式(Memocached、FileSystem等)展示数据,可能在缓存的存取上会有很大的开销,并不能很好的满足需要,而Redis这样基于内存的NoSQL数据库,就非常适合担任实时数据的容器。
但是往往又有数据可靠性的需求,采用MySQL作为数据存储,不会因为内存问题而引起数据丢失,同时也可以利用关系数据库的特性实现很多功能。所以就会很自然的想到是否可以采用MySQL作为数据存储引擎,Redis则作为Cache。
MySQL到Redis数据复制方案,无论MySQL还是Redis,自身都带有数据同步的机制,比较常用的MySQL的Master/Slave模式,就是由Slave端分析Master的binlog来实现的,这样的数据复制其实还是一个异步过程,只不过当服务器都在同一内网时,异步的延迟几乎可以忽略。那么理论上也可用同样方式,分析MySQL的binlog文件并将数据插入Redis。
因此这里选择了一种开发成本更加低廉的方式,借用已经比较成熟的MySQLUDF,将MySQL数据首先放入Gearman中,然后通过一个自己编写的PHPGearmanWorker,将数据同步到Redis。比分析binlog的方式增加了不少流程,但是实现成本更低,更容易 *** 作。
mongodb和memcached不是一个范畴内的东西。mongodb是文档型的非关系型数据库,其优势在于查询功能比较强大,能存储海量数据。mongodb和memcached不存在谁替换谁的问题。 和memcached更为接近的是redis。它们都是内存型数据库,数据保存在内存中,通过tcp直接存取,优势是速度快,并发高,缺点是数据类型有限,查询功能不强,一般用作缓存。在我们团队的项目中,一开始用的是memcached,后来用redis替代。 相比memcached: 1、redis具有持久化机制,可以定期将内存中的数据持久化到硬盘上。 2、redis具备binlog功能,可以将所有 *** 作写入日志,当redis出现故障,可依照binlog进行数据恢复。 3、redis支持virtual memory,可以限定内存使用大小,当数据超过阈值,则通过类似LRU的算法把内存中的最不常用数据保存到硬盘的页面文件中。 4、redis原生支持的数据类型更多,使用的想象空间更大。 5、前面有位朋友所提及的一致性哈希,用在redis的sharding中,一般是在负载非常高需要水平扩展时使用。我们还没有用到这方面的功能,一般的项目,单机足够支撑并发了。redis 30将推出cluster,功能更加强大。 6、redis更多优点,请移步官方网站查询。
以上就是关于redis和ray的关系全部的内容,包括:redis和ray的关系、Redis简介以及和其他缓存数数据库的区别(redis缓存和数据库一致性)、Redis-Redis可以作为一个数据库使用吗等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)