type
status
date
slug
summary
tags
category
icon
password
Property
Redis
全称Remote Dictionary Server
(远程字典服务),是一个基于内存实现的键值型非关系(NoSQL)数据库,由意大利人Salvatore Sanfilippo
用C
语言编写。Redis
遵守BSD协议,实现了免费开源。自诞生以来,以其超高的性能、完美的文档和简洁易懂的源码广受好评,国内外很多大型互联网公司都在使用Redis
,比如腾讯、阿里、Twitter、Github
等等。数据库对比
常见的内存型数据库,除
Redis
之外,还有 Oracle Berkeley DB
(甲骨文旗下的一款产品)、SQlite
(轻量级内存数据库)、Memcache
(键值型分布式缓存数据库)、Altibase
(基于内存的高性能数据库)。与其他内存型数据库相比,
Redis
具有以下特点:Redis
不仅可以将数据完全保存在内存中,还可以通过磁盘实现数据的持久存储
Redis
支持丰富的数据类型,包括string
、list
、set
、zset
、hash
等多种数据类型,也被称为“数据结构服务器”
Redis
支持主从同步,即master-slave
主从复制模式。数据可以从主服务器向任意数量的从服务器上同步,有效地保证数据的安全性
Redis
支持多种编程语言,包括C
、C++
、Python
、Java
、PHP
、Ruby
、Lua
等
与
SQL
型数据库截然不同,Redis
没有提供新建数据库的操作,因为它自带了16
(0—15
)个数据库(默认使用0
库)。在同一个库中,key
是唯一存在的、不允许重复的,它就像一把“密钥”,只能打开一把“锁”。键值存储的本质就是使用key
来标识value
,当想要检索value
时,必须使用与value
相对应的key
进行查找。Redis
数据库没有“表”的概念,它通过不同的数据类型来实现存储数据的需求,不同的数据类型能够适应不同的应用场景,从而满足开发者的需求。Redis
数据库与其他常用数据库做了简单对比:名称 | 类型 | 数据存储选项 | 附加功能 |
Redis | 基于内存存储的键值非关系型数据库 | 字符串、列表、散列、有序集合、无序集合 | 发布与订阅、主从复制、持久化存储等 |
Memcached | 基于内存存储的键值缓存型数据库 | 键值之间的映射 | 为提升性能构建了多线程服务器 |
MySQL | 基于磁盘的关系型数据库 | 每个数据库可包含多个表,每个表可包含多条记录,支持第三方扩展 | 支持 ACID 性质、主从复制和主主复制 |
MongoDB | 基于磁盘存储的非关系文档型数据库 | 每个数据库可以包含多个集合,每个集合可以插入多个文档 | 支持聚合操作、主从复制、分片和空间索引 |
Redis
基于内存来实现数据的存储,因此其速度非常快。但是计算机的内存是非常珍贵的资源,所以Redis
不适合存储较大的文件或者二进制数据,否则会出现错误,Redis
适合存储较小的文本信息。理论上Redis
的每个 key
、value
的大小不超过 512 MBMemcached 也是基于内存的数据库,为什么不选择它作为缓存呢?Redis 与 Memcached 共同点:
- 都是基于内存的数据库,一般都用来当做缓存使用
- 都有过期策略
- 两者的性能都非常高
Redis 与 Memcached 区别:
- Redis 支持的数据类型更丰富(String、Hash、List、Set、ZSet),而 Memcached 只支持最简单的 key-value 数据类型;
- Redis 支持数据的持久化,可以将内存中的数据保持在磁盘中,重启的时候可以再次加载进行使用,而 Memcached 没有持久化功能,数据全部存在内存之中,Memcached 重启或者挂掉后,数据就没了;
- Redis 原生支持集群模式,Memcached 没有原生的集群模式,需要依靠客户端来实现往集群中分片写入数据;
- Redis 支持发布订阅模型、Lua 脚本、事务等功能,而 Memcached 不支持;
Redis架构
Redis
体系架构主要分为两个部分:Redis
服务端redis-server
Redis
客户端redis-cli
客户端和服务端可以位于同一台计算机上,也可以位于不同的计算机上。服务端是整个架构的“大脑”,能够把数据存储到内存中,并且起到管理数据的作用。
Redis优势
- 性能极高:
Redis
基于内存实现数据存储,它的读取速度是 110000次/s,写速度是 81000次/s
- 多用途工具:
Redis
有很多的用途,比如可以用作缓存、消息队列、搭建Redis
集群等
- 命令提示功能:
Redis
客户端拥有强大的命令提示功能,使用起来非常的方便,降低了学习门槛
- 可移植性:
Redis
使用用标准C
语言编写的,能够在大多数操作系统上运行,比如Linux
,Mac
,Solaris
等
Redis应用场景
Redis
用来缓存一些经常被访问的热点数据、或者需要耗费大量资源的内容,通过把这些内容放到Redis
中,可以让应用程序快速地读取它们。例如,网站的首页需要经常被访问,并且在创建首页的过程中会消耗的较多的资源,此时就可以使用Redis
将整个首页缓存起来,从而降低网站的压力,减少页面访问的延迟时间。数据库的存储方式大体可分为两大类,基于磁盘存储和基于内存存储。磁盘存储的数据库,因为磁头机械运动以及系统调用等因素导致读写效率较低。
Redis
基于内存来实现数据存取,相对于磁盘来说,其读写速度要高出好几个数量级。为什么用 Redis 作为 MySQL 的缓存?
主要是因为 Redis 具备「高性能」和「高并发」两种特性。
- Redis 具备高性能
假如用户第一次访问 MySQL 中的某些数据。这个过程会比较慢,因为是从硬盘上读取的。将该用户访问的数据缓存在 Redis 中,这样下一次再访问这些数据的时候就可以直接从缓存中获取了,操作 Redis 缓存就是直接操作内存,所以速度相当快。
如果
MySQL
中的对应数据改变的之后,同步改变Redis
缓存中相应的数据即可,不过这里会有Redis
和MySQL
双写一致性的问题。- Redis 具备高并发
单台设备的
Redis
的QPS
(Query Per Second,每秒处理完请求的次数)是MySQL
的10倍,Redis
单机的QPS
能轻松破10w,而MySQL
单机的QPS
很难破1w。直接访问Redis
能够承受的请求远远大于直接访问MySQL
,所以可以考虑把数据库中的部分数据转移到缓存中去,这样用户的一部分请求会直接到缓存这里而不用经过数据库。