这是我参与「第五届青训营 」伴学笔记创作活动的第 6 天
前言
数据库用于对数据进行存储,一般的任务中通常不会出现高并发情况,平时一般的数据库就能够胜任。可是一旦涉及到如商品抢购、抢课、抢票等情况,瞬间访问量巨大,使用数据库保存的数据需要系统从磁盘中读取然后写入,而磁盘的IO无法满足极短时间内的成千上万次读取操作,以至于数据库系统瘫痪,甚至整个服务宕机。
数据持久化和缓存
基于内存的数据库能够在一定程度上缓解上述现象,是一种非关系型数据库(NoSQL),它的产生就是为了解决大规模数据集多重数据种类和高并发带来的难题。
可以将数据持久化狭义的理解为把对象永久保存到数据库中,通过持久化技术减少访问数据库的次数,从而增加应用程序的执行速度。
Redis是目前使用较为广泛的一种NoSQL,性能优越,支持每秒十几万次的读写操作,其性能远超传统的关系型数据库,同时还支持分布式和集群。
日常使用中程序对数据库的读取操作要远大于写入操作,使用SQL语句从数据库中去读取,需要去磁盘把对应的数据索引取回,这个过程比较缓慢。
如果将数据放在内存中,服务端直接从内存中读取数据,能够明显提升速度,并且减少数据库的压力,然而这也是有弊端的。内存是非常珍贵的,使用内存进行数据存储的开销巨大,这指的是成本上的开销,所以通常只是将一些重要的用户数据存放在内存中。
Redis
Redis的两个主要应用场景
- 存储缓存用的数据
- 高速读/写
Redis作为缓存的流程:
-
读取Redis
-
是否读取成功
2.1 读取成功-->结束2.2 读取失败-->读取数据库-->写入Redis-->结束
第一次读取数据时,都会失败,然后触发程序读取数据库,把数据读出来并写入Redis中,第二次开始就会直接读取Redis,大大减小读取时间。
总结
Redis有着更为复杂的数据结构并且提供对他们的原子性操作,这是一个不同于其他数据库的进化路径。Redis的数据类型都是基于基本数据结构的同时对程序员透明,无需进行额外的抽象。
Redis运行在内存中但是可以持久化到磁盘,所以在对不同数据集进行高速读写时需要权衡内存,因为数据量不能大于硬件内存。在内存数据库方面的另一个优点是,相比在磁盘上相同的复杂的数据结构,在内存中操作起来非常简单,这样Redis可以做很多内部复杂性很强的事情。同时,在磁盘格式方面他们是紧凑的以追加的方式产生的,因为他们并不需要进行随机访问。