一、什么是Redis?node
二、Redis相比memcached有哪些优点?程序员
三、Redis支持哪几种数据类型?web
四、Redis主要消耗什么物理资源?redis
五、Redis的全称是什么?算法
六、Redis有哪几种数据淘汰策略?数据库
七、Redis官方为何不提供Windows版本?windows
八、一个字符串类型的值能存储最大容量是多少?后端
九、为何Redis须要把全部数据放到内存中?缓存
十、Redis集群方案应该怎么作?都有哪些方案?安全
十一、Redis集群方案什么状况下会致使整个集群不可用?
十二、MySQL里有2000w数据,redis中只存20w的数据,如何保证redis中的数据都是热点数据?
1三、Redis有哪些适合的场景?
1四、Redis支持的Java客户端都有哪些?官方推荐用哪一个?
1五、Redis和Redisson有什么关系?
1六、Jedis与Redisson对比有什么优缺点?
1七、Redis如何设置密码及验证密码?
1八、说说Redis哈希槽的概念?
1九、Redis集群的主从复制模型是怎样的?
20、Redis集群会有写操做丢失吗?为何?
2一、Redis集群之间是如何复制的?
2二、Redis集群最大节点个数是多少?
2三、Redis集群如何选择数据库?
2四、怎么测试Redis的连通性?
2五、Redis中的管道有什么用?
2六、怎么理解Redis事务?
2七、Redis事务相关的命令有哪几个?
2八、Redis key的过时时间和永久有效分别怎么设置?
2九、Redis如何作内存优化?
30、Redis回收进程如何工做的?
3一、Redis回收使用的是什么算法?
3二、Redis如何作大量数据插入?
3三、为何要作Redis分区?
3四、你知道有哪些Redis分区实现方案?
3五、Redis分区有什么缺点?
3六、Redis持久化数据和缓存怎么作扩容?
3七、分布式Redis是前期作仍是后期规模上来了再作好?为何?
3八、Twemproxy是什么?
3九、支持一致性哈希的客户端有哪些?
40、Redis与其余key-value存储有什么不一样?
4一、Redis的内存占用状况怎么样?
4二、都有哪些办法能够下降Redis的内存使用状况呢?
4三、查看Redis使用状况及状态信息用什么命令?
4四、Redis的内存用完了会发生什么?
4五、Redis是单线程的,如何提升多核CPU的利用率?
4六、一个Redis实例最多能存放多少的keys?List、Set、Sorted Set他们最多能存放多少元素?
4七、Redis常见性能问题和解决方案?
4八、Redis提供了哪几种持久化方式?
4九、如何选择合适的持久化方式?
50、修改配置不重启Redis会实时生效吗?
一、什么是Redis?
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适合的场景主要局限在较小数据量的高性能操做和运算上。
二、Redis相比memcached有哪些优点?
(1) memcached全部的值均是简单的字符串,redis做为其替代者,支持更为丰富的数据类型
(2) redis的速度比memcached快不少
(3) redis能够持久化其数据
三、Redis支持哪几种数据类型?
String、List、Set、Sorted Set、hashes
四、Redis主要消耗什么物理资源?
redis是一种基于内存高性能的数据库--- 主要依赖于内存
内存。
五、Redis的全称是什么?
Remote Dictionary Server。
六、Redis有哪几种数据淘汰策略?
noeviction:返回错误当内存限制达到而且客户端尝试执行会让更多内存被使用的命令(大部分的写入指令,但DEL和几个例外)
allkeys-lru: 尝试回收最少使用的键(LRU),使得新添加的数据有空间存放。
volatile-lru: 尝试回收最少使用的键(LRU),但仅限于在过时集合的键,使得新添加的数据有空间存放。
allkeys-random: 回收随机的键使得新添加的数据有空间存放。
volatile-random: 回收随机的键使得新添加的数据有空间存放,但仅限于在过时集合的键。
volatile-ttl: 回收在过时集合的键,而且优先回收存活时间(TTL)较短的键,使得新添加的数据有空间存放。
七、Redis官方为何不提供Windows版本?
由于目前Linux版本已经至关稳定,并且用户量很大,无需开发windows版本,反而会带来兼容性等问题。
八、一个字符串类型的值能存储最大容量是多少?
512M
九、为何Redis须要把全部数据放到内存中?
Redis为了达到最快的读写速度将数据都读到内存中,并经过异步的方式将数据写入磁盘。因此redis具备快速和数据持久化的特征。若是不将数据放在内存中,磁盘I/O速度为严重影响redis的性能。在内存愈来愈便宜的今天,redis将会愈来愈受欢迎。 若是设置了最大使用的内存,则数据已有记录数达到内存限值后不能继续插入新值。
十、Redis集群方案应该怎么作?都有哪些方案?
1.twemproxy,大概概念是,它相似于一个代理方式,使用方法和普通redis无任何区别,设置好它下属的多个redis实例后,使用时在本须要链接redis的地方改成链接twemproxy,它会以一个代理的身份接收请求并使用一致性hash算法,将请求转接到具体redis,将结果再返回twemproxy。使用方式简便(相对redis只需修改链接端口),对旧项目扩展的首选。 问题:twemproxy自身单端口实例的压力,使用一致性hash后,对redis节点数量改变时候的计算值的改变,数据没法自动移动到新的节点。
2.codis,目前用的最多的集群方案,基本和twemproxy一致的效果,但它支持在 节点数量改变状况下,旧节点数据可恢复到新hash节点。
3.redis cluster3.0自带的集群,特色在于他的分布式算法不是一致性hash,而是hash槽的概念,以及自身支持节点设置从节点。具体看官方文档介绍。
4.在业务代码层实现,起几个毫无关联的redis实例,在代码层,对key 进行hash计算,而后去对应的redis实例操做数据。 这种方式对hash层代码要求比较高,考虑部分包括,节点失效后的替代算法方案,数据震荡后的自动脚本恢复,实例的监控,等等。
十一、Redis集群方案什么状况下会致使整个集群不可用?
有A,B,C三个节点的集群,在没有复制模型的状况下,若是节点B失败了,那么整个集群就会觉得缺乏5501-11000这个范围的槽而不可用。
十二、MySQL里有2000w数据,redis中只存20w的数据,如何保证redis中的数据都是热点数据?
redis内存数据集大小上升到必定大小的时候,就会施行数据淘汰策略。
1三、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的发布/订阅功能来创建聊天系统!(不,这是真的,你能够去核实)。
1四、Redis支持的Java客户端都有哪些?官方推荐用哪一个?
Redisson、Jedis、lettuce等等,官方推荐使用Redisson。
1五、Redis和Redisson有什么关系?
Redisson是一个高级的分布式协调Redis客服端,能帮助用户在分布式环境中轻松实现一些Java的对象 (Bloom filter, BitSet, Set, SetMultimap, ScoredSortedSet, SortedSet, Map, ConcurrentMap, List, ListMultimap, Queue, BlockingQueue, Deque, BlockingDeque, Semaphore, Lock, ReadWriteLock, AtomicLong, CountDownLatch, Publish / Subscribe, HyperLogLog)。
1六、Jedis与Redisson对比有什么优缺点?
Jedis是Redis的Java实现的客户端,其API提供了比较全面的Redis命令的支持;Redisson实现了分布式和可扩展的Java数据结构,和Jedis相比,功能较为简单,不支持字符串操做,不支持排序、事务、管道、分区等Redis特性。Redisson的宗旨是促进使用者对Redis的关注分离,从而让使用者可以将精力更集中地放在处理业务逻辑上。
1七、Redis如何设置密码及验证密码?
设置密码:config set requirepass 123456
受权密码:auth 123456
1八、说说Redis哈希槽的概念?
Redis集群没有使用一致性hash,而是引入了哈希槽的概念,Redis集群有16384个哈希槽,每一个key经过CRC16校验后对16384取模来决定放置哪一个槽,集群的每一个节点负责一部分hash槽。
1九、Redis集群的主从复制模型是怎样的?
为了使在部分节点失败或者大部分节点没法通讯的状况下集群仍然可用,因此集群使用了主从复制模型,每一个节点都会有N-1个复制品.
20、Redis集群会有写操做丢失吗?为何?
Redis并不能保证数据的强一致性,这意味这在实际中集群在特定的条件下可能会丢失写操做。
2一、Redis集群之间是如何复制的?
异步复制
2二、Redis集群最大节点个数是多少?
16384个。
2三、Redis集群如何选择数据库?
Redis集群目前没法作数据库选择,默认在0数据库。
2四、怎么测试Redis的连通性?
ping
2五、Redis中的管道有什么用?
一次请求/响应服务器能实现处理新的请求即便旧的请求还未被响应。这样就能够将多个命令发送到服务器,而不用等待回复,最后在一个步骤中读取该答复。
这就是管道(pipelining),是一种几十年来普遍使用的技术。例如许多POP3协议已经实现支持这个功能,大大加快了从服务器下载新邮件的过程。
2六、怎么理解Redis事务?
事务是一个单独的隔离操做:事务中的全部命令都会序列化、按顺序地执行。事务在执行的过程当中,不会被其余客户端发送来的命令请求所打断。
事务是一个原子操做:事务中的命令要么所有被执行,要么所有都不执行。
2七、Redis事务相关的命令有哪几个?
MULTI、EXEC、DISCARD、WATCH
2八、Redis key的过时时间和永久有效分别怎么设置?
EXPIRE和PERSIST命令。
2九、Redis如何作内存优化?
尽量使用散列表(hashes),散列表(是说散列表里面存储的数少)使用的内存很是小,因此你应该尽量的将你的数据模型抽象到一个散列表里面。好比你的web系统中有一个用户对象,不要为这个用户的名称,姓氏,邮箱,密码设置单独的key,而是应该把这个用户的全部信息存储到一张散列表里面.
30、Redis回收进程如何工做的?
一个客户端运行了新的命令,添加了新的数据。
Redi检查内存使用状况,若是大于maxmemory的限制, 则根据设定好的策略进行回收。
一个新的命令被执行,等等。
因此咱们不断地穿越内存限制的边界,经过不断达到边界而后不断地回收回到边界如下。
若是一个命令的结果致使大量内存被使用(例如很大的集合的交集保存到一个新的键),不用多久内存限制就会被这个内存使用量超越。
3一、Redis回收使用的是什么算法?
LRU算法
3二、Redis如何作大量数据插入?
Redis2.6开始redis-cli支持一种新的被称之为pipe mode的新模式用于执行大量数据插入工做。
3三、为何要作Redis分区?
分区可让Redis管理更大的内存,Redis将可使用全部机器的内存。若是没有分区,你最多只能使用一台机器的内存。分区使Redis的计算能力经过简单地增长计算机获得成倍提高,Redis的网络带宽也会随着计算机和网卡的增长而成倍增加。
3四、你知道有哪些Redis分区实现方案?
客户端分区就是在客户端就已经决定数据会被存储到哪一个redis节点或者从哪一个redis节点读取。大多数客户端已经实现了客户端分区。
代理分区 意味着客户端将请求发送给代理,而后代理决定去哪一个节点写数据或者读数据。代理根据分区规则决定请求哪些Redis实例,而后根据Redis的响应结果返回给客户端。redis和memcached的一种代理实现就是Twemproxy
查询路由(Query routing) 的意思是客户端随机地请求任意一个redis实例,而后由Redis将请求转发给正确的Redis节点。Redis Cluster实现了一种混合形式的查询路由,但并非直接将请求从一个redis节点转发到另外一个redis节点,而是在客户端的帮助下直接redirected到正确的redis节点。
3五、Redis分区有什么缺点?
涉及多个key的操做一般不会被支持。例如你不能对两个集合求交集,由于他们可能被存储到不一样的Redis实例(实际上这种状况也有办法,可是不能直接使用交集指令)。
同时操做多个key,则不能使用Redis事务.
分区使用的粒度是key,不能使用一个很是长的排序key存储一个数据集(The partitioning granularity is the key, so it is not possible to shard a dataset with a single huge key like a very big sorted set).
当使用分区的时候,数据处理会很是复杂,例如为了备份你必须从不一样的Redis实例和主机同时收集RDB / AOF文件。
分区时动态扩容或缩容可能很是复杂。Redis集群在运行时增长或者删除Redis节点,能作到最大程度对用户透明地数据再平衡,但其余一些客户端分区或者代理分区方法则不支持这种特性。然而,有一种预分片的技术也能够较好的解决这个问题。
3六、Redis持久化数据和缓存怎么作扩容?
若是Redis被当作缓存使用,使用一致性哈希实现动态扩容缩容。
若是Redis被当作一个持久化存储使用,必须使用固定的keys-to-nodes映射关系,节点的数量一旦肯定不能变化。不然的话(即Redis节点须要动态变化的状况),必须使用能够在运行时进行数据再平衡的一套系统,而当前只有Redis集群能够作到这样。
3七、分布式Redis是前期作仍是后期规模上来了再作好?为何?
既然Redis是如此的轻量(单实例只使用1M内存),为防止之后的扩容,最好的办法就是一开始就启动较多实例。即使你只有一台服务器,你也能够一开始就让Redis以分布式的方式运行,使用分区,在同一台服务器上启动多个实例。
一开始就多设置几个Redis实例,例如32或者64个实例,对大多数用户来讲这操做起来可能比较麻烦,可是从长久来看作这点牺牲是值得的。
这样的话,当你的数据不断增加,须要更多的Redis服务器时,你须要作的就是仅仅将Redis实例从一台服务迁移到另一台服务器而已(而不用考虑从新分区的问题)。一旦你添加了另外一台服务器,你须要将你一半的Redis实例从第一台机器迁移到第二台机器。
3八、Twemproxy是什么?
Twemproxy是Twitter维护的(缓存)代理系统,代理Memcached的ASCII协议和Redis协议。它是单线程程序,使用c语言编写,运行起来很是快。它是采用Apache 2.0 license的开源软件。 Twemproxy支持自动分区,若是其代理的其中一个Redis节点不可用时,会自动将该节点排除(这将改变原来的keys-instances的映射关系,因此你应该仅在把Redis当缓存时使用Twemproxy)。 Twemproxy自己不存在单点问题,由于你能够启动多个Twemproxy实例,而后让你的客户端去链接任意一个Twemproxy实例。 Twemproxy是Redis客户端和服务器端的一个中间层,由它来处理分区功能应该不算复杂,而且应该算比较可靠的。
3九、支持一致性哈希的客户端有哪些?
Redis-rb、Predis等。
40、Redis与其余key-value存储有什么不一样?
Redis有着更为复杂的数据结构而且提供对他们的原子性操做,这是一个不一样于其余数据库的进化路径。Redis的数据类型都是基于基本数据结构的同时对程序员透明,无需进行额外的抽象。
Redis运行在内存中可是能够持久化到磁盘,因此在对不一样数据集进行高速读写时须要权衡内存,应为数据量不能大于硬件内存。在内存数据库方面的另外一个优势是, 相比在磁盘上相同的复杂的数据结构,在内存中操做起来很是简单,这样Redis能够作不少内部复杂性很强的事情。 同时,在磁盘格式方面他们是紧凑的以追加的方式产生的,由于他们并不须要进行随机访问。
4一、Redis的内存占用状况怎么样?
给你举个例子: 100万个键值对(键是0到999999值是字符串“hello world”)在个人32位的Mac笔记本上 用了100MB。一样的数据放到一个key里只须要16MB, 这是由于键值有一个很大的开销。 在Memcached上执行也是相似的结果,可是相对Redis的开销要小一点点,由于Redis会记录类型信息引用计数等等。
固然,大键值对时二者的比例要好不少。
64位的系统比32位的须要更多的内存开销,尤为是键值对都较小时,这是由于64位的系统里指针占用了8个字节。 可是,固然,64位系统支持更大的内存,因此为了运行大型的Redis服务器或多或少的须要使用64位的系统。
4二、都有哪些办法能够下降Redis的内存使用状况呢?
若是你使用的是32位的Redis实例,能够好好利用Hash,list,sorted set,set等集合类型数据,由于一般状况下不少小的Key-Value能够用更紧凑的方式存放到一块儿。
4三、查看Redis使用状况及状态信息用什么命令?
info
4四、Redis的内存用完了会发生什么?
若是达到设置的上限,Redis的写命令会返回错误信息(可是读命令还能够正常返回。)或者你能够将Redis当缓存来使用配置淘汰机制,当Redis达到内存上限时会冲刷掉旧的内容。
4五、Redis是单线程的,如何提升多核CPU的利用率?
能够在同一个服务器部署多个Redis的实例,并把他们看成不一样的服务器来使用,在某些时候,不管如何一个服务器是不够的, 因此,若是你想使用多个CPU,你能够考虑一下分片(shard)。
4六、一个Redis实例最多能存放多少的keys?List、Set、Sorted Set他们最多能存放多少元素?
理论上Redis能够处理多达232的keys,而且在实际中进行了测试,每一个实例至少存放了2亿5千万的keys。咱们正在测试一些较大的值。
任何list、set、和sorted set均可以放232个元素。
换句话说,Redis的存储极限是系统中的可用内存值。
4七、Redis常见性能问题和解决方案?
(1) Master最好不要作任何持久化工做,如RDB内存快照和AOF日志文件
(2) 若是数据比较重要,某个Slave开启AOF备份数据,策略设置为每秒同步一次
(3) 为了主从复制的速度和链接的稳定性,Master和Slave最好在同一个局域网内
(4) 尽可能避免在压力很大的主库上增长从库
(5) 主从复制不要用图状结构,用单向链表结构更为稳定,即:Master <- Slave1 <- Slave2 <- Slave3...
这样的结构方便解决单点故障问题,实现Slave对Master的替换。若是Master挂了,能够马上启用Slave1作Master,其余不变。
4八、Redis提供了哪几种持久化方式?
RDB持久化方式可以在指定的时间间隔能对你的数据进行快照存储.
AOF持久化方式记录每次对服务器写的操做,当服务器重启的时候会从新执行这些命令来恢复原始的数据,AOF命令以redis协议追加保存每次写的操做到文件末尾.Redis还能对AOF文件进行后台重写,使得AOF文件的体积不至于过大.
若是你只但愿你的数据在服务器运行的时候存在,你也能够不使用任何持久化方式.
你也能够同时开启两种持久化方式, 在这种状况下, 当redis重启的时候会优先载入AOF文件来恢复原始的数据,由于在一般状况下AOF文件保存的数据集要比RDB文件保存的数据集要完整.
最重要的事情是了解RDB和AOF持久化方式的不一样,让咱们以RDB持久化方式开始。
4九、如何选择合适的持久化方式?
通常来讲, 若是想达到足以媲美PostgreSQL的数据安全性, 你应该同时使用两种持久化功能。若是你很是关心你的数据, 但仍然能够承受数分钟之内的数据丢失,那么你能够只使用RDB持久化。
有不少用户都只使用AOF持久化,但并不推荐这种方式:由于定时生成RDB快照(snapshot)很是便于进行数据库备份, 而且 RDB 恢复数据集的速度也要比AOF恢复的速度要快,除此以外, 使用RDB还能够避免以前提到的AOF程序的bug。
50、修改配置不重启Redis会实时生效吗?
针对运行实例,有许多配置选项能够经过 CONFIG SET 命令进行修改,而无需执行任何形式的重启。 从 Redis 2.2 开始,能够从 AOF 切换到 RDB 的快照持久性或其余方式而不须要重启 Redis。检索 ‘CONFIG GET *’ 命令获取更多信息。
但偶尔从新启动是必须的,如为升级 Redis 程序到新的版本,或者当你须要修改某些目前 CONFIG 命令还不支持的配置参数的时候。