当前位置: 首页 > article >正文

NoSQL数据库实战派

第二章 Redis基础

缓存通过“用空间换时间”来达到数据获取的目的。

缓存的成本较高,在实际设计架构中需要权衡访问延迟和成本。

通过缓存,可以提升访问性能、降低网络拥堵、减轻服务负载和增强可扩展性。

一般情况下,数据被存放在数据库中,应用程序直接操作数据库。当应用程序访问量达到上万条时,数据库服务器的压力会增大。如果需要减轻数据库服务器的压力:

1.实现数据库的读写分离。

2.实现数据库的分库分表。

3.使用缓存,并实现读写分离。

缓存的原理是:将应用程序已经访问过的内容或数据存储起来,当应用程序再次访问这些内容或数据时先从缓存中查找:如果缓存命中,则返回数据;如果缓存不命中,则再次查找数据库,并将得到的内容或数据保存到缓存中。

缓存具有以下缺点:

1.在系统中引入缓存,会增加系统的复杂度。

2.缓存比数据库的存储成本更高,系统部署及运行的费用也更高。

3.由于一份数据被同时存放到缓存和数据库中,甚至缓存中也会有多个数据副本,所以会存在多份数据不一致的问题。

Redis是完全开源的,并遵守BSD协议,它是一个高性能的Key-Value数据库。具有以下三个特点:

1.支持数据持久化,可以将缓存中的数据保存到磁盘中,重启后可以再次加载到这些数据进行使用。

2.不仅支持Key-Value类型的数据,还支持基于list、set、zset、hash等数据结构的存储。

3.支持Master-Salve模式的数据备份。

2.1.2 Redis的优势

Redis是基于内存的数据库,读操作和写操作都在内存中完成,速度完全超过磁盘数据库的读写速度。

Redis之所以具有很高的性能,主要得益于以下几点:

1.纯内存操作。一般都是简单的读写操作,,线程占用的时间很少,时间的花费主要集中在I/O上,所以读写数据快。

2.采用单线程模型。从而保证每个操作的原子性,也减少了线程上下文切换和竞争。

3.使用I/O多路复用模型。非阻塞I/O;使用单线程来轮询描述符;将数据库的开、关、读、写都转换成了事件;Redis采用自己实现的事件分离器,效率比较高。

4.高效的数据结构。

 · 整个Redis就是一个全局哈希表,其时间复杂度是O(1),而且Redis会执行再哈希操作以防止因哈希冲突导致链表过长。并且为防止一次性重新映射时数据过大导致线程阻塞,Redis采用了渐进式再哈希,巧妙地将一次性复制分摊到多次操作中,从而避免了阻塞。

 · Redis使用哈希结构和有序的数据结构加快了读写速度。

 · Redis对数据存储进行了优化,对数据进行压缩存储,还可以根据实际存储的数据类型选择不同编码。

2.1.3 Redis与其他Key-Value数据库有何不同

Redis有着更为复杂的数据结构,并且提供了对它们的原子性操作(这一个不同于其他Key-Value数据库的重点)。Redis的数据类型都是基本数据结构,并且对程序员透明,程序员无需进行额外的抽象。

Redis运行在内存中,但是其数据可以持久化到磁盘中,所以在对不同数据进行高速读写时,数据量不能多于内存的存储空间。

Redis的另一个优点是:对于在磁盘上操作比较复杂的数据结构,在内存中操作它们非常简单,这样Redis可以做很多复杂性很强的事情。同时,在磁盘格式方面,内存数据库以追加方式写入数据,因为它不需要进行随机访问。


http://www.kler.cn/news/314474.html

相关文章:

  • 为什么要关闭SMB V1
  • C++ 一个基本的 MyString 实现和分析实践
  • idea中.git文件夹存在但是没有git功能列表
  • 数据集的选取、标注
  • POS共识机制简介
  • 从0到1训练私有大模型技能与应用实现 ,企业急迫需求,抢占市场先机
  • LabVIEW提高开发效率技巧----采用并行任务提高性能
  • Qt优秀开源项目之二十三:QSimpleUpdater
  • 地面站通过SSH连接无人机
  • Vue3中监听器watchEffect的使用
  • Vue使用axios二次封装、解决跨域问题
  • 【go/方法记录】cgo静态库编译以及使用dlv定位cgo崩溃问题
  • 《娱乐至死》
  • BERT模型解读与简单任务实现(论文复现)
  • ChatGPT搭上langchain的知识库RAG应用,效果超预期
  • Vue.js 与 Flask/Django 后端的高效配合指南
  • 动态线程池(五)
  • 【ESP32】ESP-IDF开发 | UART通用异步收发传输器+串口收发例程
  • 深度学习-图像处理篇1.3pytorch神经网络例子
  • 【数据仓库】数据仓库层次化设计
  • vue3(整合版)
  • docker入门总结(附错误处理,持续更新)
  • 如何使用 Python 的 sqlite3 模块操作 SQLite 数据库?
  • mac命令行分卷压缩与合并
  • 长列表加载性能优化
  • python画图1
  • springboot实战学习(6)(用户模块的登录认证)(初识令牌)(JWT)
  • python:给1个整数,你怎么判断是否等于2的幂次方?
  • java.nio.ByteBuffer的 capacity, limit, position, mark
  • 如何打造高效的远程开发团队:最佳实践与挑战