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

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.dtcms.com/a/12752.html

相关文章:

  • springboot实战学习笔记(2)
  • Thinkphp5 + Swoole实现邮箱异步通知
  • 【Linux 从基础到进阶】Docker 容器技术基础与应用
  • 【两方演化博弈代码复现】:双方演化博弈的原理、概率博弈仿真、相位图、单个参数灵敏度演化
  • Unity程序基础框架
  • pytest 接口测试
  • 深度挖掘| 如何高效实现Cloudera 安装之基础环境搭建
  • Web3入门指南:从基础概念到实际应用
  • C++第二讲:类和对象
  • Linux中的简单命令2
  • C++系列-STL中搜索相关算法
  • C++二叉搜索树学习
  • 【C/C++】涉及string类的经典OJ编程题
  • Redis 数据类型
  • SpringBoot开发——获取HTTP请求头(Header)的三种方法
  • chattr:修改文件的特殊属性
  • Flask-JWT-Extended登录验证
  • 使用LangChain创建简单的语言模型应用程序【快速入门指南】
  • 快速提升Python Pandas处理速度的秘诀
  • Redis 篇-初步了解 Redis 持久化、Redis 主从集群、Redis 哨兵集群、Redis 分片集群
  • 【电脑组装】✈️从配置拼装到安装系统组装自己的台式电脑
  • 使用肘部法则确定K-Means中的k值
  • SQL使用IN进行分组统计时如何将不存在的字段显示为0
  • JZ2440开发板——S3C2440的UART的使用
  • 嵌入式常用算法之低通滤波算法
  • C/C++实现植物大战僵尸(PVZ)(打地鼠版)
  • Qt (16)【Qt 事件 —— Qt 事件简介 | 如何重写相关的 Event 函数】
  • 【D3.js in Action 3 精译_023】3.3 使用 D3 将数据绑定到 DOM 元素
  • 计算机网络 第三章: 点对点协议
  • 应用案例分享 | 智驾路试数据分析及 SiL/HiL 回灌案例介绍