首页 > 手机 > 配件 > Redis为什么这么快,redis为什么快

Redis为什么这么快,redis为什么快

来源:整理 时间:2022-04-07 18:53:21 编辑:华为40 手机版

Redis为何设计为单线程?

Redis为何设计为单线程

redis的一个特点是读写速度快,这就很容易让人误以为redis是多线程的。因为大家想当然的会认为多线程的效率要比单线程高,其实不然。BAT的一个对redis有很深了解的高级工程师曾经说过,redis就是如果所有数据都在内存里,那么单线程是效率最高的。为什么这么说呢,多线程的本质是CPU模拟出多个线程去操作,但是模拟是有代价的,学过操作系统的朋友应该知道,多线程之间切换是要切换上下文的,这也是对时间的一种消耗。

所以,对于单处理器来说,当然是单线程,无切换才是最高效率的。redis就是用一块CPU绑定了一块内存,然后对数据的操作都是在这块内存上进行的,基于此,单线程的redis已经达到了效率最大化。我们用实际数据来说明。一次CPU内存的切换大约需要1500ns,从内存中读取1MB的数据,大概需要250us,就算我一次只读1MB的数据,读1000次之后,消耗在内存切换上这种非功能性过程上的消耗就达到了1500us,这个时间开销任谁看都是不值。

此外,基于redis的单线程,我们还可以利用它提供的set key field value加nx参数的方式,来实现分布式锁。众所周知,redis并不适合做数据持久层,更多的是取代memcache做缓存,做分布式架构的支撑。分布式架构势必就要面临如何实现分布式锁的问题,通过上面的接口,无论多少个分布式节点,都可以准确的获取分布式锁。

具体使用方式如下:通常来说,set函数是不管field字段是否存在,只要写入成功就会返回1,但是如果增加了NX参数,那么如果field值在redis中已经存在,就会返回空,否则才返回1。因此用这个函数来执行获取分布式锁操作,如果返回值不为空,则加锁成功,否则代表有其他线程在操作数据,当前请求需要等待。

redis为什么把数据放到内存中?

redis为什么把数据放到内存中

这个问题问得有问题!!首先,redis确实是一个内存型的数据库系统,把大量数据在内存中使用,并快速存取,但是,redis提供了以数据库文件的方式持久化数据的选择,通过使用bgsave,save等命令,可以把缓存中的数据存储到磁盘中进行永久性保存!把题目换种问法!为什么内存读取比磁盘读取数据速度快?1,内存是电器元件,利用高低电平存储数据,而磁盘是机械元件(去买电脑的时候写着5400r/min或者7200r/min),电气原件速度超级快,而磁盘因为在每个磁盘块切换的时候,磁头会消耗比较多的时间,也就是IO时间长,所以性能没发比!2,磁盘的数据进行操作的时候也都是读取到内存中,由CPU进行操作的,所以直接放在内存中的数据,读取速度肯定快了很多很多!那么内存有哪些缺点呢?1,丢数据:内存因为是存储的高低电平,断电之后数据全部丢失,而磁盘存储了二进制文件,断电以后数据依然存在!2,内存贵:一块4G的内存和一个500g的磁盘价格差不多,因为内存设计工艺要求更高,材料也更加昂贵!所以,不仅仅是redis,几乎所有的缓存系统都会先用到内存作为数据快速读取的基本保证,然后才能有扩展数据持久化的可能!redis作为分布式的可持久化的单线程的key-value缓存系统,有着大量的优点,吸引着广大开发者的关注,同时在保证数据一致性等问题上通常作为首选条件!关于redis集群,指令,开启持久化,防止内存穿透等问题,之后会有提及,敬请关注。

数据多的时候为什么要使用redis而不用mysql?

数据多的时候为什么要使用redis而不用mysql

通常来说,当数据多、并发量大的时候,架构中可以引入Redis,帮助提升架构的整体性能,减少Mysql(或其他数据库)的压力,但不是使用Redis,就不用MySQL。因为Redis的性能十分优越,可以支持每秒十几万此的读/写操作,并且它还支持持久化、集群部署、分布式、主从同步等,Redis在高并发的场景下数据的安全和一致性,所以它经常用于两个场景:缓存经常会被查询,但是不经常被修改或者删除的数据;比如数据字典,业务数据中的热点数据;这样不仅提升查询效率,还可以减少数据库的压力;经常被查询,实时性要求不高数据,比如网站的最新列表、排行榜之类的数据,只需要定时统计一次,然后把统计结果放到Redis中提供查询(请不要使用select top 10 from xxxx)。

缓存可以方便数据共享,比如我先用电脑网页打开X东,选了两件商品放到购物车里面,再登录手机APP,也是可以看到购物车里面的商品的。判断数据是否适合缓存到Redis中,可以从几个方面考虑:会经常查询么?命中率如何?写操作多么?数据大小?我们经常采用这样的方式将数据刷到Redis中:查询的请求过来,现在Redis中查询,如果查询不到,就查询数据库拿到数据,再放到缓存中,这样第二次相同的查询请求过来,就可以直接在Redis中拿到数据;不过要注意【缓存穿透】的问题。

缓存的刷新会比较复杂,通常是修改完数据库之后,还需要对Redis中的数据进行操作;代码很简单,但是需要保证这两步为同一事务,或最终的事务一致性。高速读写常见的就是计数器,比如一篇文章的阅读量,不可能每一次阅读就在数据库里面update一次。高并发的场景很适合使用Redis,比如双11秒杀,库存一共就一千件,到了秒杀的时间,通常会在极为短暂的时间内,有数万级的请求达到服务器,如果使用数据库的话,很可能在这一瞬间造成数据库的崩溃,所以通常会使用Redis(秒杀的场景会比较复杂,Redis只是其中之一,例如如果请求超过某个数量的时候,多余的请求就会被限流)。

这种高并发的场景,是当请求达到服务器的时候,直接在Redis上读写,请求不会访问到数据库;程序会在合适的时间,比如一千件库存都被秒杀,再将数据批量写到数据库中。所以通常来说,在必要的时候引入Redis,可以减少MySQL(或其他)数据库的压力,两者不是替代的关系。我将持续分享Java开发、架构设计、程序员职业发展等方面的见解,希望能得到你的关注。

为啥Redis/Mongo这么快,就不能直接替代mysql吗?

mysql、redis、MongoDB基本上在对应的业务场景中都会用到。习惯上,所有的业务数据都是需要“落库”的,这种“落库”指关系型数据库的数据写入,可以很直观的在关系型数据库的客户端进行查询,可以持久化到磁盘空间,因 mysql 开源稳定,满足业务需求,其成为互联网公司的最优选择。而 redis 经常在高并发的请求加速、优化用户体验中用到,普遍的做法是将数据库中的数据请求一次,放入缓存中,同时返回给用户,而修改数据库时对缓存数据进行清理,保障数据一致性。

而对于mongoDB,我在业务中使用不多,但其可以高效存储二进制大对象 (比如照片、视频、消息等),在业界得到了充分的认可。下面简述一下其各自的优缺点,仅供参考。mysql,优点:体积小、速度快、总体拥有成本低,开源,提供的接口支持多种语言连接操作;支持多种操作系统;采用完全的多线程编程,线程轻量;鉴权体系完善。

缺点:不支持热备份,但可通过binlog日志进行同步;不支持自定义数据类型;对 xml 支持不够良好,但此基本上可以忽略,目前很少见到 xml 的使用。redis,优点:读写性能优异,选择的最大理由;支持数据持久化,支持 AOF 和 RDB 两种持久化方式;支持主从复制,可以进行读写分离;数据结构丰富;缺点:不具备自动容错和恢复功能,主机从机宕机导致客户端请求失败;主机宕机,宕机前有部分数据未能及时同步到从机,切换 IP 后还会引入数据不一致的问题,降低了系统的可用性;Redis 的主从复制采用全量复制,网络波动时可能进行全量的数据复制,对集群造成压力;Redis 较难支持在线扩容,在集群容量达到上限时在线扩容比较复杂。

MongoDB,优点:弱一致性(最终一致),更能保证用户的访问速度;文档结构的存储方式,能够更便捷的获取数;高效存储二进制大对象 (比如照片、视频、消息等);与其他的NoSQL相比第三方支持丰富;缺点:不支持事务操作;占用空间过大;成熟的维护工具较为欠缺。个人感觉,redis 适用于数据变化快且数据库大小可预见(适合内存容量)的业务场景,其适合做关系型数据库的中间层。

redis是个单线程的程序,为什么会这么快呢?具体是快在哪里呢?

REDIS是个K-V结构的内存数据库,基于hash的内存查找是非常快的,不受磁盘IO性能的影响;其次,REDIS采用了异步非阻塞IO模型,这个性能比同步阻塞IO要好很多;再次,REDIS采用了自己实现的ae_event,没有锁,比通用的libevent性能要更好一些;最后,单线程的优势在于,不用频繁切换线程上下文,也没有各种多线程需要的数据安全的消耗。

文章TAG:Redisredis

最近更新