Redis 是一个远程内存数据库,它不仅性能强劲,而且还具有复制特性以及为解决问题而生的独一无二的数据模型。Redis 提供了 5 种不同类型的数据结构,各式各样的问题都可以很自然的映射到这些数据结构上。

除此之外没通过复制、持久化和客户端分片等特性,用户可以很方便的将 Redis 扩展成一个能够包含数百 GB 数据、每秒处理上班万次请求的系统。

1 Redis简介

Redis 是一个速度非常快的非关系数据库,它可以存储键与 5 种不同类型的值之间的映射,可以将存储在内存的键值对数据持久化到硬盘,可以使用复制特性来扩展读性能,还可以使用客户端分片来扩展写性能。

1.1 Redis与其他数据库和软件的对比

Redis 不使用表,它的数据库也不会预定义或者强制去要求用户对 Redis 存储的不同数据进行关联。

高性能简直缓存服务器 memcached 也经常被拿来与 Redis 进行比较:这两者都可用于存储键值映射,彼此的性能也相差无几,但是 Redis 能够自动以两种不同的方式将数据写入硬盘,并且 Redis 除了能存储普通的字符串键之外,还可以存储其他 4 种数据结构,而 memcached 只能存储普通的字符串键。这些不同之处使得 Redis 可以用于解决更为广泛的问题,并且既可以用作主数据库使用,又可以作为其他存储系统的辅助数据库使用。

名称 类型 数据存储选项 查询类型 附加功能
Redis 使用内存存储的非关系型数据库 字符串、列表、结合、散列表、有序集合 每种数据类型都有自己的专属命令,另外还有批量操作和不完全的事务操作 发布与订阅,主从复制、持久化、脚本
memcached 使用内存存储的键值缓存 键值之间的映射 创建命令、读取命令、更新命令、删除命令以及其他几个命令 为提升性能而设的多线程服务器
MySQL 关系型数据库 每个数据库可以包含多个表,每个表可以包含多个行;可以处理多个表的视图;支持空间和第三方扩展 SELECT、INSERT、UPDATE、DELETE、函数、存储过程 支持 ACID 性质,主从复制和主主复制
PostgreSQL 关系型数据库 每个数据库可以包含多个表,每个表可以包含多个行;可以处理多个表的视图;支持空间和第三方扩展;支持可定制类型 SELECT、INSERT、UPDATE、DELETE、内置函数、自定义的存储过程 支持 ACID 性质,只从复制,由第三方支持的多主复制
MongoDB 使用硬盘存储的非关系文档存储 每个数据库可以包含多个表,每个表可以包含多个无 schema 的 BSON 文档 创建命令、读取命令、更新命令、删除命令、条件查询命令等 支持 map-reduce 操作,主从复制,分片,空间索引

1.2 附加特性

Redis 拥有两种不同形式的持久化方法,它们都可以用小而紧凑的格式将存储在内存中的数据写入硬盘:第一种持久化方法为时间点转储,转储操作既可以在 “指定时间段内有指定数量的写操作执行” 这一条被满足时执行,又可以通过调用两条转储到硬盘命令中的任何一条来执行;第二种持久化方法将所有修改了数据库的命令都写入一个只追加文件里面,用户可以根据数据的重要程度,将只追加写入设置为从不同步、每秒同步一次或者每写入一个命令就同步一次。

尽管 Redis 的性能很好,但受限于 Redis 的内存存储设计,有时候只使用一套服务器可能没有办法处理所有请求。因此,为了扩展 Redis 的读性能,并为 Redis 提供故障转移支持,Redis 实现了主从复制特性:执行复制的从服务器会连接上主服务器,接收主服务器发送的整个数据库的初始副本;之后主服务器执行的写命令,都会被发送给所有连接着的从服务器去执行,从而实时地更新从服务器的数据集。因为从服务器包含的数据会不断的进行更新,所以客户端可以向任意一个从服务器发送读请求,以此来避免对主服务器进行集中式的访问。

1.3 使用Redis的理由

使用Redis 而不是 memcached 来解决问题,不仅可以让代码变得简短、更易懂、更易维护,而且还可以使代码的运行速度更快。除此之外,在其他许多情况下,Redis 的效率和易用性也比关系数据库要好的多。

使用 Redis 而不是关系数据库或者其他硬盘存储数据库,可以避免写入不必要的临沭数据,也免去了对临时数据进行扫描或者删除的麻烦,并最终改善程序的性能。

2 Redis数据结构简介

Redis 可以存储键与 5 种不同数据结构类型之间的映射,这 5 种数据结构类型分别为 STRING(字符串)、LIST(列表)、SET(集合)、HASH(散列) 和 ZSET(有序集合)。

有一部分 Redis 命令对于这 5 种结构都会通用的,如 DEL、TYPE、RENAME 等;但有一部分 Redis 命令只能对特定的一中或者两种结构使用。

结构类型 结构存储的值 结构的读写能力
STRING 可以是字符串、整数或者浮点数 对整个字符串或者字符串的其中一部分执行操作,对整数和浮点数执行自增或者自减操作
LIST 一个链表,链表上的每个节点都包含了一个字符串 总链表的两端推入或者弹出元素;根据偏移量对链表进行修剪;读取单个或者多个元素;根据值查找或者移除元素
SET 包含字符串的无序收集器,并且被包含的每个字符串都是独一无二、各不相同的 添加、获取、移除单个元素;检查一个元素是否存在于集合中;计算交集、并集、差集;从集合里面随机获取元素
HASH 包含键值对的无序散列表 添加、获取、移除单个键值对;获取所有键值对
ZSET 字符串成员与浮点数分值之间的有序映射,元素的排列顺序由分值的大小决定 添加、获取、删除单个元素;根据分值范围或者成员来获取元素

2.1 Redis中的字符串

命令 行为
GET 获取存储在给定键中的值
SET 设置存储在给定键中的值
DEL 删除存储在给定键中的值(这个命令可以用于所有类型)

除了能够 GET、SET 和 DEL 字符串之外,Redis 还提供了一些可以对字符串的其中一部分内容进行读取和写入的命令,以及一些能对字符串存储的数值执行自增或者自减操作的命令。

2.2 Redis中的列表

Redis 对链表结构的支持使得它在键值存储的世界中独树一帜。一个列表结构可以有序的存储多个字符串,和表示字符串时使用的方法一样。

命令 行为
RPUSH 将给定值推入到列表的右端
LRANGE 获取列表在给定范围上的所有值
LINDEX 获取列表在给定位置上的单个元素
LPOP 从列表的左端弹出一个值,并返回被弹出的值

lrange list-key 0 -1 //取出列表所有元素

除了上述命令外,Redis 列表还拥有从列表里面移除元素的命令、将元素出入列表中间的命令、将列表修剪至指定长度(相当于从列表的其中一端或者两端移除元素)的命令,以及其他的一些命令。

2.3 Redis的集合

Redis 的集合和列表都可以存储多个字符串,它们之间的不同在于,列表可以存储多个相同的字符串,而集合则通过使用散列表来保证自己存储的每个字符串都是各不相同的(这些散列表只有键,但没有与键相关联的值)。

Redis 的集合是无序的。

命令 行为
SADD 将给定元素添加到集合
SMENBERS 返回集合包含的所有元素
SISMEMBER 检查给定元素是否存在于集合中
SREM 如果给定的元素存在于集合中,那么移除这个元素

跟字符串和列表一样,集合除了基本的添加操作和移除操作之外,还支持很多其他操作,比如 SINSERT、SUNION、SDIFF 这 3 个命令就可以分别执行常见的交集计算、并集计算和差集计算。

2.4 Redis的散列

Redis 的散列可以存储多个键值对之间的映射。和字符串一样,散列存储的值既可以是字符串又可以是数字值,并且用户可以对散列存储的数字值执行自增操作或者自减操作。

命令 行为
HSET 在散列里面关联起给定的键值对
HGET 获取指定散列键的值
HGETALL 获取散列包含的所有键值对
HDEL 如果给定键存在于散列里面,那么移除这个键

2.5 Redis的有序集合

有序集合和散列一样,都用于存储键值对:有序集合的键被称为成员,每个成员都是各不相同的;而有序集合的值则被称为分值,分值必须为浮点数。有序集合是 Redis 里面唯一一个既可以根据成员访问元素,又可以根据分值以及分值的排列顺序来访问元素的结构。

命令 行为
ZADD 讲一个带有给定分值的成员添加到有序集合里面
ZRANGE 根据元素在有序排列中所处的位置,从有序集合里面获取多个元素
ZRANGEBYSCORE 获取有序集合在给定分值范围内的所有元素
ZREM 如果给定成员存在于有序集合,那么移除这个成员

Redis--初识Redis的更多相关文章

  1. 初识redis数据类型

    初识redis数据类型 1.String(字符串) string是redis最基本的类型,一个key对应一个value. string类型是二进制安全的.意思是redis的string可以包含任何数据 ...

  2. Redis初识、设计思想与一些学习资源推荐

    一.Redis简介 1.什么是Redis Redis 是一个开源的使用ANSI C 语言编写.支持网络.可基于内存亦可持久化的日志型.Key-Value 数据库,并提供多种语言的API.从2010 年 ...

  3. Redis——学习之路三(初识redis config配置)

    我们先看看config 默认情况下系统是怎么配置的.在命令行中输入 config get *(如图) 默认情况下有61配置信息,每一个命令占两行,第一行为配置名称信息,第二行为配置的具体信息.     ...

  4. Redis——学习之路二(初识redis服务器命令)

    上一章我们已经知道了如果启动redis服务器,现在我们来学习一下,以及如何用客户端连接服务器.接下来我们来学习一下查看操作服务器的命令. 服务器命令: 1.info——当前redis服务器信息   s ...

  5. 01:初识Redis

    付磊和张益军两位大咖写的葵花宝典(Redis开发和运维)学习笔记. 一.初识Redis 1.redis简介 Redis是一种基于键值对(key-value)的NoSQL数据库,与很多键值对数据库不同的 ...

  6. redis实战笔记(1)-第1章 初识Redis

    第1章 初识Redis 注:本书在redis3.0版本的,比如redis3.0以后支持服务端集群.3.0之前只能客户端分片.    本章主要内容 1.Redis与其他软件的相同之处和不同之处 2.Re ...

  7. Linux(5)- MariaDB、mysql主从复制、初识redis

    一.MYSQL(mariadb) MariaDB数据库管理系统是MySQL的一个分支,主要由开源社区在维护,采用GPL授权许可. 开发这个分支的原因之一是:甲骨文公司收购了MySQL后,有将MySQL ...

  8. 分布式数据存储 之 Redis(一) —— 初识Redis

    分布式数据存储 之 Redis(一) -- 初识Redis 为什么要学习并运用Redis?Redis有什么好处?我们步入Redis的海洋,初识Redis. 一.Redis是什么 ​ Redis 是一个 ...

  9. [转]Redis之(一)初识Redis

    原文地址:http://blog.csdn.net/u012152619/article/details/52550315 Redis之(一)初识Redis 标签: Redisredis-server ...

  10. 1.初识Redis

    作者 微信:tangy8080 电子邮箱:914661180@qq.com 更新时间:2019-08-14 20:35:36 星期三 欢迎您订阅和分享我的订阅号,订阅号内会不定期分享一些我自己学习过程 ...

随机推荐

  1. 怎么在一个servlet中实现多个功能 ?如何使一个Servlet处理多个请求?

    自学javaweb一直不知道一个servelt可以有多个功能!看了别人代码才知道这个可以有! 平时你建立servelt时候你会吧doget和dopost这两个勾上,要想实现多个功能,你不必要勾选dog ...

  2. 类的始祖Object

    一.概述 Object时java中顶级父类,也是唯一没有父类的类:它是整个java中最基本的类,在java中所有的类都默认继承了Object. 二.重要方法 1.clone方法 克隆出一个新的对象. ...

  3. Python MySQL Where

    章节 Python MySQL 入门 Python MySQL 创建数据库 Python MySQL 创建表 Python MySQL 插入表 Python MySQL Select Python M ...

  4. spring boot配置druid连接池连接mysql

    Spring Boot 集成教程 Spring Boot 介绍 Spring Boot 开发环境搭建(Eclipse) Spring Boot Hello World (restful接口)例子 sp ...

  5. webpack随笔2--编译ES6/ES7

    一.Babel 1.安装babel Bable-loader: babeljs.io babel最新版:npm install babel-loader@8.0.0-beta.0 @babel/cor ...

  6. Linux基础操作及概念

    Linux基础操作及概念 终端的概念 通常我们在使用 Linux 时,并不是直接与系统打交道,而是通过一个叫做 Shell 的中间程序来完成的,在图形界面下为了实现让我们在一个窗口中完成用户输入和显示 ...

  7. POJ 1408:Fishnet

    Fishnet Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 1921   Accepted: 1234 Descripti ...

  8. 个人网站一步一步搭建——(20)成功在本地IIS运行

    昨天网站都做完了,今天发布.然后在IIS运行成功了. 遇到了很多问题  发布了不低于10次 头都晕了. 问题1:之前写了很多调试代码 console.log(); 慢慢删除完,. 问题2:vue 不能 ...

  9. arduino双机通信 (解决引脚不够用)

    作用 实现将一个 arduino 中的多个 String 类型变量准确地传到另一个 arduino 中对应的多个 String 类型变量 中. 接线图 注意 TX 接另一个arduino的 RX !可 ...

  10. Airflow 使用 Celery 时,如何添加 Celery 配置

    背景 前段时间我选用了 Airflow 对 wms 进行数据归档,在运行一段时间后,经常发现会报以下错误: [-- ::,: WARNING/ForkPoolWorker-] Failed opera ...