您的位置:首页 > 数据库 > Redis

Redis知识总结

2017-07-21 17:42 218 查看
Redis介绍

Redis 本质上一个
Key/Value 数据库,与 Memcached类似的
NoSQL 型数据库,但是他的数据可以持久化的保存在磁盘上,解决了服务重启后数据不丢失的问题,他的值可以是
string(字符串)、list(列表)、sets(集合)或者是ordered
sets(被排序的集合),所有的数据类型都具有push/pop、
add/remove、执行服务端的并集、交集、两个
sets 集中的差别等等操作,这些操作都是具有原子性的,
Redis 还支持各种不同的排序能力。Redis 2.0更是增加了很多新特性,如:提升了性能、增加了新的数据类型、更少的利用内存(
AOF 和
VM)

Redis支持绝大部分主流的开发语言,如:
C、Java
C#、
PHP、Perl、
Python
Lua、Erlang、Ruby等等

redis 性能:

根据 Redis 官方的测试结果:在50
个并发的情况下请求 10w
次,写的速度是 110000

次/s,读的速度是81000
次/s

测试环境:

1. 50 个并发,请求
100000 次

2. 读和写大小为
256bytes 的字符串

3. Linux2.6 Xeon X3320 2.5GHz
的服务器上

4.通过本机的
loopback interface接口上执行

Redis的功能:

1、
Redis 的 Sharding:Redis
支持客户端的 Sharding
功能,通过一致性 hash 算法实现,当前
Redis不支持故障冗余,在集群中不能在线增加或删除
Redis

2、 Redis
的 master/slave 复制:

1.
一个 master 支持多个
slave

2. Slave 可以接受其他slave
的连接来替代他连接 master

3. 复制在
master 是非阻塞的,而在 slave是阻塞的

4.
复制被利用来提供可扩展性,在 slave
端只提供查询功能及数据的冗余

3、
Redis 的 Virtual Memory功能:
vm 是
Redis2.0 新增的一个非常稳定和可靠的功能,vm的引入是为了提高
Redis 的性能,也就是把很少使用的
value 保存到
disk,而 key
保存在内存中。实际上就是如果你有 10w
的 keys 在内存中,而只有仅仅
10%左右的 key
经常使用,那么 Redis 可以通过开启
VM 尝试将不经常使用的Value
转换到 disk
上保存。

4、
Redis 的附加档案( AOF)功能:Redis
通过配置的策略将数据集保存到aof
中,当

Redis 挂掉后能够通过
aof 恢复到挂掉前的状态

个人总结:

redis特点:

in_memory高速读存

持久化(存到硬盘)

主从(借助于sentinel实现一定意义上的HA)

Clustering(分布式)

redis与Memcached的区别:

redis的优势:

1.丰富的操作(Hashs,Lists,Sets,Hyperlog等)

2.内建replication及cluster

3.就地更新

4.支持持久化(防止崩盘效应)

memcached的优势:

1.多线程

2.更少的内存开销

3.更少的内存分配压力

4.更少的内存碎片

Redis是如何完成事务的?

将一个或多个命令归并为一个操作,提交后,按照顺序进行;不支持回滚

Redis实现持久化

Redis提供了多种不同级别的持久化方式:

• RDB
持久化可以在指定的时间间隔内生成数据集的时间点快照(
point-in-time snapshot)。

• AOF持久化记录服务器执行的所有写操作命令,并在服务器启动时,通过重新执行这些命令来还原数据集。AOF
文件中的命令全部以
Redis 协议的格式来保存,新命令会被追加到文件的末尾。
Redis 还可以在后台对
AOF 文件进行重写(
rewrite),使得AOF
文件的体积不会超出保存数据集状态所需的实际大小。

• Redis
还可以同时使用 AOF
持久化和 RDB
持久化。在这种情况下,当 Redis
重启时,它会优先使用AOF
文件来还原数据集,因为 AOF
文件保存的数据集通常比 RDB
文件所保存的数据集更完整。


你甚至可以关闭持久化功能,让数据只在服务器运行时存在。了解 RDB
持久化和 AOF
持久化之间的异同是非常重要的,以下几个小节将详细地介绍这这两种持久化功能,并对它们的相同和不同之处进行说明。

RDB的优点

• RDB
是一个非常紧凑( compact)的文件,它保存了Redis
在某个时间点上的数据集。这种文件非常

适合用于进行备份:比如说,你可以在最近的 24
小时内,每小时备份一次 RDB
文件,并且在每个月

的每一天,也备份一个 RDB
文件。这样的话,即使遇上问题,也可以随时将数据集还原到不同的版

本。

• RDB
非常适用于灾难恢复( disaster recovery):它只有一个文件,并且内容都非常紧凑,可以(在加

密后)将它传送到别的数据中心,或者亚马逊 S3
中。

• RDB
可以最大化 Redis
的性能:父进程在保存 RDB
文件时唯一要做的就是 fork
出一个子进程,然

后这个子进程就会处理接下来的所有保存工作,父进程无须执行任何磁盘 I/O
操作。

• RDB
在恢复大数据集时的速度比 AOF
的恢复速度要快。

RDB的缺点


如果你需要尽量避免在服务器故障时丢失数据,那么 RDB
不适合你。虽然 Redis
允许你设置不同的保存点( save point)来控制保存RDB
文件的频率,但是,因为
RDB 文件需要保存整个数据集的状态,所以它并不是一个轻松的操作。因此你可能会至少
5
分钟才保存一次 RDB
文件。在这种情况下,一旦发生故障停机,你就可能会丢失好几分钟的数据。


每次保存 RDB
的时候,Redis
都要 fork()
出一个子进程,并由子进程来进行实际的持久化工作。在数据集比较庞大时,fork()可能会非常耗时,造成服务器在某某毫秒内停止处理客户端;如果数据集非常巨大,并且CPU
时间非常紧张的话,那么这种停止时间甚至可能会长达整整一秒。虽然
AOF 重写也需要进行
fork() ,但无论
AOF 重写的执行间隔有多长,数据的耐久性都不会有任何损失。

AOF的优点


使用 AOF
持久化会让 Redis
变得非常耐久( much more durable):你可以设置不同的fsync
策略,比如无
fsync ,每秒钟一次
fsync ,或者每次执行写入命令时
fsync 。
AOF 的默认策略为每秒钟fsync
一次,在这种配置下,Redis
仍然可以保持良好的性能,并且就算发生故障停机,也最多只会丢失一秒钟的数据(
fsync 会在后台线程执行,所以主线程可以继续努力地处理命令请求)。

• AOF
文件是一个只进行追加操作的日志文件( append only log),因此对AOF
文件的写入不需要进行
seek ,即使日志因为某些原因而包含了未写入完整的命令(比如写入时磁盘已满,写入中途停机,等等),redis-check-aof工具也可以轻易地修复这种问题。

• Redis
可以在 AOF
文件体积变得过大时,自动地在后台对 AOF
进行重写:重写后的新 AOF
文件包含了恢复当前数据集所需的最小命令集合。整个重写操作是绝对安全的,因为
Redis 在创建新
AOF文件的过程中,会继续将命令追加到现有的
AOF 文件里面,即使重写过程中发生停机,现有的
AOF文件也不会丢失。而一旦新
AOF 文件创建完毕,Redis就会从旧
AOF
文件切换到新 AOF
文件,并开始对新 AOF
文件进行追加操作。

• AOF
文件有序地保存了对数据库执行的所有写入操作,这些写入操作以 Redis
协议的格式保存,因此 AOF
文件的内容非常容易被人读懂,对文件进行分析( parse)也很轻松。导出(export)AOF
文件也非常简单:举个例子,如果你不小心执行了FLUSHALL命令,但只要
AOF
文件未被重写,那么只要停止服务器,移除 AOF
文件末尾的FLUSHALL命令,并重启
Redis
,就可以将数据集恢复到FLUSHALL执行之前的状态。

AOF的缺点


对于相同的数据集来说,AOF
文件的体积通常要大于 RDB
文件的体积。


根据所使用的 fsync
策略,AOF
的速度可能会慢于 RDB
。在一般情况下,每秒 fsync
的性能依然非常高,而关闭 fsync
可以让 AOF
的速度和 RDB
一样快,即使在高负荷之下也是如此。不过在处理巨大的写入载入时,RDB
可以提供更有保证的最大延迟时间( latency)。

• AOF
在过去曾经发生过这样的 bug
:因为个别命令的原因,导致 AOF
文件在重新载入时,无法将数据集恢复成保存时的原样。(举个例子,阻塞命令BRPOPLPUSH就曾经引起过这样的
bug
。)测试套件里为这种情况添加了测试:它们会自动生成随机的、复杂的数据集,并通过重新载入这些数据来确保一切正常。虽然这种bug

AOF 文件中并不常见,但是对比来说,RDB
几乎是不可能出现这种bug
的。

Redis的复制:

一个Master可以有多个Slave

支持链式复制

Master以非阻塞方式同步数据至slave

Redis的sentinel:

用于管理多个redis服务实现HA

监控、通知、自动故障转移

流言协议、投票协议

Clustering:集群

分布式数据库,通过分片机制进行数据分析,Clustering内的每个节点仅存数据库的一部分数据。

每个节点持有全局元数据,但只有部分数据。

redis面试总结

1. 使用Redis有哪些好处?

(1) 速度快,因为数据存在内存中,类似于HashMap,HashMap的优势就是查找和操作的时间复杂度都是O(1)

(2) 支持丰富数据类型,支持string,list,set,sorted set,hash

(3) 支持事务,操作都是原子性,所谓的原子性就是对数据的更改要么全部执行,要么全部不执行

(4) 丰富的特性:可用于缓存,消息,按key设置过期时间,过期后将会自动删除

2. redis相比memcached有哪些优势?

(1) memcached所有的值均是简单的字符串,redis作为其替代者,支持更为丰富的数据类型

(2) redis的速度比memcached快很多

(3) redis可以持久化其数据

3. redis常见性能问题和解决方案:

(1) Master最好不要做任何持久化工作,如RDB内存快照和AOF日志文件

(2) 如果数据比较重要,某个Slave开启AOF备份数据,策略设置为每秒同步一次

(3) 为了主从复制的速度和连接的稳定性,Master和Slave最好在同一个局域网内

(4) 尽量避免在压力很大的主库上增加从库

(5) 主从复制不要用图状结构,用单向链表结构更为稳定,即:Master <- Slave1 <- Slave2 <- Slave3…

这样的结构方便解决单点故障问题,实现Slave对Master的替换。如果Master挂了,可以立刻启用Slave1做Master,其他不变。
http://blog.csdn href="http://lib.csdn.net/base/dotnet" target=_blank>.NET/guchuanyun111/article/category/6335900

(1)什么是redis?

Redis 是一个基于内存的高性能key-value数据库
(有空再补充,有理解错误或不足欢迎指正)

(2)Reids的特点

Redis本质上是一个Key-Value类型的内存数据库,很像memcached,整个数据库统统加载在内存当中进行操作,定期通过异步操作把数据库数据flush到硬盘上进行保存。因为是纯内存操作,Redis的性能非常出色,每秒可以处理超过 10万次读写操作,是已知性能最快的Key-Value DB。

Redis的出色之处不仅仅是性能,Redis最大的魅力是支持保存多种数据结构,此外单个value的最大限制是1GB,不像 memcached只能保存1MB的数据,因此Redis可以用来实现很多有用的功能,比方说用他的List来做FIFO双向链表,实现一个轻量级的高性
能消息队列服务,用他的Set可以做高性能的tag系统等等。另外Redis也可以对存入的Key-Value设置expire时间,因此也可以被当作一 个功能加强版的memcached来用。

Redis的主要缺点是数据库容量受到物理内存的限制,不能用作海量数据的高性能读写,因此Redis适合的场景主要局限在较小数据量的高性能操作和运算上。

(3)Redis支持的数据类型

Redis通过Key-Value的单值不同类型来区分, 以下是支持的类型:

Strings

Lists

Sets 求交集、并集

Sorted Set

hashes



(4)为什么redis需要把所有数据放到内存中?

Redis为了达到最快的读写速度将数据都读到内存中,并通过异步的方式将数据写入磁盘。所以redis具有快速和数据持久化的特征。如果不将数据放在内存中,磁盘I/O速度为严重影响redis的性能。在内存越来越便宜的今天,redis将会越来越受欢迎。

如果设置了最大使用的内存,则数据已有记录数达到内存限值后不能继续插入新值。

(5)Redis是单进程单线程的

redis利用队列技术将并发访问变为串行访问,消除了传统数据库串行控制的开销

(6)虚拟内存

当你的key很小而value很大时,使用VM的效果会比较好.因为这样节约的内存比较大.

当你的key不小时,可以考虑使用一些非常方法将很大的key变成很大的value,比如你可以考虑将key,value组合成一个新的value.

vm-max-threads这个参数,可以设置访问swap文件的线程数,设置最好不要超过机器的核数,如果设置为0,那么所有对swap文件的操作都是串行的.可能会造成比较长时间的延迟,但是对数据完整性有很好的保证.

自己测试的时候发现用虚拟内存性能也不错。如果数据量很大,可以考虑分布式或者其他数据库

(7)分布式

redis支持主从的模式。原则:Master会将数据同步到slave,而slave不会将数据同步到master。Slave启动时会连接master来同步数据。

这是一个典型的分布式读写分离模型。我们可以利用master来插入数据,slave提供检索服务。这样可以有效减少单个机器的并发访问数量

(8)读写分离模型

通过增加Slave DB的数量,读的性能可以线性增长。为了避免Master DB的单点故障,集群一般都会采用两台Master DB做双机热备,所以整个集群的读和写的可用性都非常高。

读写分离架构的缺陷在于,不管是Master还是Slave,每个节点都必须保存完整的数据,如果在数据量很大的情况下,集群的扩展能力还是受限于单个节点的存储能力,而且对于Write-intensive类型的应用,读写分离架构并不适合。

(9)数据分片模型

为了解决读写分离模型的缺陷,可以将数据分片模型应用进来。

可以将每个节点看成都是独立的master,然后通过业务实现数据分片。

结合上面两种模型,可以将每个master设计成由一个master和多个slave组成的模型。

(10)Redis的回收策略

volatile-lru:从已设置过期时间的数据集(server.db[i].expires)中挑选最近最少使用的数据淘汰

volatile-ttl:从已设置过期时间的数据集(server.db[i].expires)中挑选将要过期的数据淘汰

volatile-random:从已设置过期时间的数据集(server.db[i].expires)中任意选择数据淘汰

allkeys-lru:从数据集(server.db[i].dict)中挑选最近最少使用的数据淘汰

allkeys-random:从数据集(server.db[i].dict)中任意选择数据淘汰

no-enviction(驱逐):禁止驱逐数据

1. 使用Redis有哪些好处?

(1) 速度快,因为数据存在内存中,类似于HashMap,HashMap的优势就是查找和操作的时间复杂度都是O(1)

(2) 支持丰富数据类型,支持string,list,set,sorted set,hash

(3) 支持事务,操作都是原子性,所谓的原子性就是对数据的更改要么全部执行,要么全部不执行

(4) 丰富的特性:可用于缓存,消息,按key设置过期时间,过期后将会自动删除

2. redis相比memcached有哪些优势?

(1) memcached所有的值均是简单的字符串,redis作为其替代者,支持更为丰富的数据类型

(2) redis的速度比memcached快很多

(3) redis可以持久化其数据

3. redis常见性能问题和解决方案:

(1) Master最好不要做任何持久化工作,如RDB内存快照和AOF日志文件

(2) 如果数据比较重要,某个Slave开启AOF备份数据,策略设置为每秒同步一次

(3) 为了主从复制的速度和连接的稳定性,Master和Slave最好在同一个局域网内

(4) 尽量避免在压力很大的主库上增加从库

(5) 主从复制不要用图状结构,用单向链表结构更为稳定,即:Master <- Slave1 <- Slave2 <- Slave3…

这样的结构方便解决单点故障问题,实现Slave对Master的替换。如果Master挂了,可以立刻启用Slave1做Master,其他不变。

4.
MySQL里有2000w数据,redis中只存20w的数据,如何保证redis中的数据都是热点数据


相关知识:redis 内存数据集大小上升到一定大小的时候,就会施行数据淘汰策略。redis 提供 6种数据淘汰策略:

voltile-lru:从已设置过期时间的数据集(server.db[i].expires)中挑选最近最少使用的数据淘汰

volatile-ttl:从已设置过期时间的数据集(server.db[i].expires)中挑选将要过期的数据淘汰

volatile-random:从已设置过期时间的数据集(server.db[i].expires)中任意选择数据淘汰

allkeys-lru:从数据集(server.db[i].dict)中挑选最近最少使用的数据淘汰

allkeys-random:从数据集(server.db[i].dict)中任意选择数据淘汰

no-enviction(驱逐):禁止驱逐数据

5. Memcache与Redis的区别都有哪些?

1)、存储方式

Memecache把数据全部存在内存之中,断电后会挂掉,数据不能超过内存大小。

Redis有部份存在硬盘上,这样能保证数据的持久性。

2)、数据支持类型

Memcache对数据类型支持相对简单。

Redis有复杂的数据类型。

3)、使用底层模型不同

它们之间底层实现方式 以及与客户端之间通信的应用协议不一样。

Redis直接自己构建了VM 机制 ,因为一般的系统调用系统函数的话,会浪费一定的时间去移动和请求。

4),value大小

redis最大可以达到1GB,而memcache只有1MB

6. Redis 常见的性能问题都有哪些?如何解决?

1).Master写内存快照,save命令调度rdbSave函数,会阻塞主线程的工作,当快照比较大时对性能影响是非常大的,会间断性暂停服务,所以Master最好不要写内存快照。

2).Master AOF持久化,如果不重写AOF文件,这个持久化方式对性能的影响是最小的,但是AOF文件会不断增大,AOF文件过大会影响Master重启的恢复速度。Master最好不要做任何持久化工作,包括内存快照和AOF日志文件,特别是不要启用内存快照做持久化,如果数据比较关键,某个Slave开启AOF备份数据,策略为每秒同步一次。

3).Master调用BGREWRITEAOF重写AOF文件,AOF在重写的时候会占大量的CPU和内存资源,导致服务load过高,出现短暂服务暂停现象。

4). Redis主从复制的性能问题,为了主从复制的速度和连接的稳定性,Slave和Master最好在同一个局域网内

7, redis 最适合的场景

Redis最适合所有数据in-momory的场景,虽然Redis也提供持久化功能,但实际更多的是一个disk-backed的功能,跟传统意义上的持久化有比较大的差别,那么可能大家就会有疑问,似乎Redis更像一个加强版的Memcached,那么何时使用Memcached,何时使用Redis呢?

如果简单地比较Redis与Memcached的区别,大多数都会得到以下观点:

1 、Redis不仅仅支持简单的k/v类型的数据,同时还提供list,set,zset,hash等数据结构的存储。

2 、Redis支持数据的备份,即master-slave模式的数据备份。

3 、Redis支持数据的持久化,可以将内存中的数据保持在磁盘中,重启的时候可以再次加载进行使用。

(1)、会话缓存(Session Cache)

最常用的一种使用Redis的情景是会话缓存(session cache)。用Redis缓存会话比其他存储(如Memcached)的优势在于:Redis提供持久化。当维护一个不是严格要求一致性的缓存时,如果用户的购物车信息全部丢失,大部分人都会不高兴的,现在,他们还会这样吗?

幸运的是,随着 Redis 这些年的改进,很容易找到怎么恰当的使用Redis来缓存会话的文档。甚至广为人知的商业平台Magento也提供Redis的插件。

(2)、全页缓存(FPC)

除基本的会话token之外,Redis还提供很简便的FPC平台。回到一致性问题,即使重启了Redis实例,因为有磁盘的持久化,用户也不会看到页面加载速度的下降,这是一个极大改进,类似PHP本地FPC。

再次以Magento为例,Magento提供一个插件来使用Redis作为全页缓存后端

此外,对WordPress的用户来说,Pantheon有一个非常好的插件
wp-redis,这个插件能帮助你以最快速度加载你曾浏览过的页面。

(3)、队列

Reids在内存存储引擎领域的一大优点是提供 list 和 set 操作,这使得Redis能作为一个很好的消息队列平台来使用。Redis作为队列使用的操作,就类似于本地程序语言(如Python)对 list 的 push/pop 操作。

如果你快速的在Google中搜索“Redis queues”,你马上就能找到大量的开源项目,这些项目的目的就是利用Redis创建非常好的后端工具,以满足各种队列需求。例如,Celery有一个后台就是使用Redis作为broker,你可以从这里去查看。

(4),排行榜/计数器

Redis在内存中对数字进行递增或递减的操作实现的非常好。集合(Set)和有序集合(Sorted Set)也使得我们在执行这些操作的时候变的非常简单,Redis只是正好提供了这两种数据结构。所以,我们要从排序集合中获取到排名最靠前的10个用户–我们称之为“user_scores”,我们只需要像下面一样执行即可:

当然,这是假定你是根据你用户的分数做递增的排序。如果你想返回用户及用户的分数,你需要这样执行:

ZRANGE user_scores 0 10 WITHSCORES

Agora Games就是一个很好的例子,用Ruby实现的,它的排行榜就是使用Redis来存储数据的,你可以在这里看到。

(5)、发布/订阅

最后(但肯定不是最不重要的)是Redis的发布/订阅功能。发布/订阅的使用场景确实非常多。我已看见人们在社交网络连接中使用,还可作为基于发布/订阅的脚本触发器,甚至用Redis的发布/订阅功能来建立聊天系统!(不,这是真的,你可以去核实)。

Redis提供的所有特性中,我感觉这个是喜欢的人最少的一个,虽然它为用户提供如果此多功能。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: