Python--Redis实战:第一章:初识Redis:第一节:Redis简介
上一篇文章:Pyhton--Redis实战:Mac brew安装redis
下一篇文章:Python--Redis实战:第一章:初识Redis:第二节:Redis数据结构简介
Redis是一个远程内存数据库,它不仅性能强劲,而且还具有复制特性以及为解决问题而生的独一无二的数据模型,是一个速度非常快的非关系数据库(no-relational database)。
Redis提供了5种不同类型的数据结构,它可以存储键(key)与5种不同类型的值(value)之间的映射(mapping),各式各样的问题都可以很自然地映射到这些数据结构上:Redis的数据结构致力于帮助用户解决问题,而不会像其他数据库那样,要求用户扭曲问题来适应数据库。除此之外,通过复制、持久化(persistence)和客户端分片(client-side sharding)等特性,用户可以很方便地将Redis扩展成一个能够包含数百GB数据、每秒处理上百万此请求的系统。
持久化:将存储在内存的键值对数据持久化带硬盘。
Redis与其它数据库和软件的对比
如果你熟悉关系数据库,那么你肯定写过用来关联两个表的数据的SQL查询。而Redis则属于人民常说的NoSQL数据库或者非关系数据库:Redis不使用表,它的数据库也不会预定义或者强制要求用户对Redis存储的不同数据进行关联。
高性能键值对缓存服务器memcached也经常被拿来于Redis进行比较:这两者都可以用于存储键值映射,彼此的性能也相差无几,但是Redis能够自动以两种不同的方式将数据写入硬盘,并且Redis除了能存储普通的字符串键之外,还可以存储其它4种数据结构,而memcached只能存储普通的字符串。这些不同之处使得Redis可以用于解决更为广泛的问题,并且即可以用于主数据库(primary database)使用,又可以作为其他存储系统的辅助数据库(auxiliar database)来使用。
一般来说,用户只会在Redis的性能或者功能是必要的情况下,才会将数据存储到Redis中。如果程序对性能要求不高,又或者因为费用原因而没有办法将大量数据库存储到内存中,那么用户可以选择使用关系数据库,或者其他非关系数据库。
下表展示了一部分功能上与Redis有重叠的数据库服务器和缓存服务器。从这个表可以看出Redis与这些数据库及软件之间的区别。
名称 | 类型 | 数据存储选项 | 查询类型 | 附加功能 |
---|---|---|---|---|
Redis | 使用内存存储(in-memory)的非关系数据库 | 字符串、列表、集合、散列表、有序集合 | 每种数据类型都有自己的专属命令,另外还有批量操作(bulk operation)和不完全(partial)的事务支持。 | 发布与订阅,主从复制(master/slave replication),持久化,脚本(存储过程,stored procedure) |
memcached | 使用内存存储的键值缓存 | 键值之间的映射 | 创建命令、读取命令、更新命令、删除命令以及其他几个命令。 | 为提升性能而设的多线程服务器。 |
MySQL | 关系数据库 | 每个数据库可以包含多个表,每个表包含多个行,可以处理多个表的视图(view)、支持空间(spatial)和第三方扩展 | SELECT、INSERT、UPDATE、DELETE、函数、存储过程。 | 支持ACID性质(需要使用InnoDB)。主从复制和主主复制(master/master replication) |
PostgreSQL | 关系数据库 | 每个数据库可以包含多个表,每个表可以包含多个行;可以处理多个表的视图;支持空间和第三方扩展;支持可定制类型。 | SELECT、INSERT、UPDATE、DELETE、内置函数、自定义的存储过程。 | 支持ACID性质。主从复制,由第三方支持的多主复制(multi-master replication) |
MongoDB | 使用硬盘存储(on-disk)的非关系文档存储 | 每个数据库可以包含多个表,每个表可以包含多个无schema(schema-less)的BSON文档 | 创建命令、读取命令、更新命令、删除命令、条件查询命令等。 | 支持map-reduce操作,主从复制。分片。控件索引(spatial index) |
附加特性
在使用类似Redis这样的内存数据库时,一个首先要考虑的问题就是【当服务器关闭时,服务器存储的数据将何去何从呢?】
Redis拥有两种不同形式的持久化方法,他们都可以用小而紧凑的格式将存储在内存中的数据写入硬盘:
- 第一种持久化方法为:时间点转储(point-in-time dump)。转储操作既可以在【指定时间段内有指定数量的写操作执行】这一条件被满足时执行,又可以通过调用两条转储的硬盘(dump-to-disk)命令中的任何一条来执行。
- 第二种持久化方法为:将所有修改了数据库的命令都写入一个只追加(append-only)文件里面,用户可以根据数据的重要程度,将只追加写入设置为:从不同步、每秒同步一次、写入一个命令就同步一次。
尽管Redis的性能很好,但受限于Redis的内存存储设计,有时候只使用一台Redis服务器可能没有办法处理所有请求,因此,为了扩展Redis的读性能,并为Redis提供故障转移(failover)支持,Redis实现了主从复制特性:
- 执行复制的从服务器会连接上主服务器,接受主服务器发送的整个数据库的初始副本(copy);
- 之后主服务器执行的写命令,都会被发送给所有连接着的【从服务器】去执行,从而实时的更新从服务器的数据集。
- 因为【从服务器】包含的数据会不断的更新,所以客户端可以向任意一个从服务器发送【读请求】,以此来避免对主服务器进行集中式访问。
使用Redis的理由
有memcached使用经验的读者可能知道,用户只能用APPEND命令将数据添加到已有字符串的末尾。memcached的文档中声明,可以用APPEND命令来管理元素列表。这很好,用户可以将元素追加到一个字符串的末尾,并将那个字符串当做列表来使用。但随后如何删除这些元素呢?memcached采用的方法是通过黑名单(blacklist)来隐藏列表里面的元素,从而避免对元素执行读写、更新、写入(包括在一次数据库查询之后执行的memcached写入)等操作。相反的,Redis的LIST和SET允许用户添加或则删除元素。
使用Redis而不是 memcached来解决问题,不仅可以让代码变得更简短、更易懂、更易维护,而且还可以使代码的允许速度更快(因为用户不需要通过读取数据库来更新数据)。除此之外,在其他很多情况下,Redis的效率和易用性也比关系数据库要好的多。
数据库的一个常见用法是存储长期的报告数据,并将这些报告数据用作固定时间范围内的聚合数据(aggregates)。收集聚合数据的常见做法是:
- 先将各个行插入一个报告表里面
- 之后再通过扫描这些行来收集聚合数据
- 再根据收集到的聚合数据来更新聚合表中已有的那些行。
之所以使用插入行的方式来存储,是因为对于大部分数据库来说,出入行操作的执行速度非常快(插入行只会在硬盘文件末尾进行写入)。不过,对表里面的行进行更新却是一个非常慢的操作,因为这种更新除了会引起一次随机读(random read)之外,还可能会引起一次随机写(random write)。而Redis里面,用户可以直接使用原子的(atomic)INCR命令及其变种来计算聚合数据,并且因为Redis将数据存储在内存里面,而且发送给Redis的命令请求并不需要经过典型的查询分析器(parser)或者查询优化器(optimizer)进行处理,所有对Redis存储的数据执行随机写的速度总是非常迅速的。
使用Redis而不是关系数据库或则其他硬盘存储数据库,可以避免写入不必要的临时数据,也免去了对临时数据进行扫描或则删除的麻烦,并最终改善程序的性能。
【工具会极大地改变人们解决问题的方式】
上一篇文章:Pyhton--Redis实战:Mac brew安装redis
下一篇文章:Python--Redis实战:第一章:初识Redis:第二节:Redis数据结构简介
Python--Redis实战:第一章:初识Redis:第一节:Redis简介相关推荐
- 第一章 初识EmguCV
第一章 初识EmguCV 1.1 EmguCV的基本介绍 1.1.1 计算机视觉.OpenCV和EmguCV 计算机视觉是一门研究如何使机器"看"的科学,更进一步的说,就是是指用摄 ...
- 第一章 初识NANO板卡
第一章 初识NANO板卡 一. 英伟达Jetson Nano 是什么 二. 为什么要用NVIDIA DIGITS 三. 我们可以在Jetson Nano上运行什么样的算法? 四.英伟达 NANO板卡配 ...
- 第一章 初识Mathematica
第一章 初识Mathematica 1.Mathematica是什么 Matematica是由美国Wolfram公司研究开发的一个著名的数学软件,它提供了非常强大的功能,能够完成符号运算.数学图 ...
- 《起跑吧,Opa》 -- 中译本 第一章 初识Opa
第一章 初识opa 本章,你将初识opa.你将学习如何安装Opa,编写opa程序以及熟悉Opa开发周期中的各个步骤. 安装opa 需要你预先从opa网站(http://opalang.org/)下载适 ...
- 第一章 初识HTML
第一章 初识HTML 学习HTML: 开发网页.微信小程序.跨端界面开发.web游戏 hyper text markup language 超文本标记语言 网页的源码,解释和执行 w3c:万维网联盟/ ...
- 第一章 初识OpenHarmony
序言 本书以3W1H教学法对每个知识点进行多维度介绍,笔者认为这样写更符合人类对新知识的学习.本书以教学场景续写,一章为半天知识点. 本书读者对象 阅读本书您需要具备html.css.js基础知识,所 ...
- 《HBase 不睡觉》第一章 - 初识 HBase
<HBase 不睡觉书>是一本让人看了不会睡着的HBase技术书籍,写的非常不错,为了加深记忆,决定把书中重要的部分整理成读书笔记,便于后期查阅,同时希望为初学 HBase 的同学带来一些 ...
- c生万物【第一章 初识c语言】
c生万物---第一章 初识c语言 前言 1.什么是C语言 2.第一个C语言程序 3.数据类型 4.变量.常量 4.1定义变量的方法 4.2变量的分类 4.3变量的使用 4.4 变量的作用域和生命周期 ...
- Cocos2d-x 3.0 红孩儿私家必修 - 第一章 初识Cocos2d-x 3.0工程
Cocos2d-x 3.0 红孩儿私家必修 前言: 时光飞逝,每每看到博客上的回复和微博上的鼓励,总会觉得亏欠大家点什么.停下来太久,总是觉得不太对劲,哈哈,时习之吧,望以此勉励大家. 红孩儿C ...
- 第一章 初识Docker
第一章 初识Docker 1.1 什么是Docker Docker开源项目 Docker是基于Go语言实现的云开源项目,诞生于2013年初,最初发起者是dotCloud公司.Docker自开源后受到广 ...
最新文章
- BZOJ2298 [HAOI2011]problem a
- 【云ERP】SAP S/4 HANA CLOUD 采购订单处理基本操作
- Setting up Ethereum smart contract development using Parity on Ubuntu
- 1060 爱丁顿数 (25 分)(思维)
- Spring-Boot + AOP实现多数据源动态切换
- Error: Java heap space
- 282.给表达式添加运算符
- NI Teststand 2014 64bit 调用python脚本指南
- win10远程计算机证书错误,win10系统下遇到Wi-Fi证书错误问题的几种解决方法
- PPT封面怎样设计才更赏心悦目
- php对接建行h5网页支付
- mw150r 虚拟服务器,水星MW150R V1.3路由器web刷dd-wrt和741n以及刷回官方原版过程记录...
- 用python做外贸
- 聊一聊如何把SSL证书安装到小鸟云服务器上
- hihoCoder1378 (最大流最小割)
- 《白话大数据与机器学习》学习笔记
- C语言基础——C语言概述——语句和每行代码的含义
- 亚马逊测评自养号,小白应该如何开始?
- 幽默感七个技巧_如何提高幽默感
- python解析MNIST数据集(IDX格式)
热门文章
- Atitit 各有所长原则 Thinker和Doer之争。 Doer Influencer relater thinker 目录 1. Doer Influencer relater thinke
- Atitit 提升可读性 流畅接口 1.1. 大接口vs 小接口 小接口可用流畅api串接起来	1 1.2. 部分comm fun可用大接口固化	1 2. 流畅接口 方法连 “Fluent接口
- atitit.提升开发效率---动态语言总结
- paip.获取地理位置根据Ip
- 在没有源代码的情况下调试JAR包..
- 呼之欲出的“7万亿”往哪儿去?
- API网关的几点思考
- 亚马逊:贝佐斯没有闹钟
- 创金合信基金公司:专户模式案例
- 常用内存数据库介绍(一)