目录
Redis回收使用的是什么算法?
Redis如何做大量数据插入?
为什么要做Redis分区?
你知道有哪些Redis分区实现方案?
Redis分区有什么缺点?
Redis持久化数据和缓存怎么做扩容?
分布式Redis是前期做还是后期规模上来了再做好?为什么?
Twemproxy是什么?
支持一致性哈希的客户端有哪些?
Redis与其他key-value存储有什么不同?
Redis的内存占用情况怎么样?
都有哪些办法可以降低Redis的内存使用情况呢?
查看Redis使用情况及状态信息用什么命令?
Redis的内存用完了会发生什么?
Redis是单线程的,如何提高多核CPU的利用率?
一个Redis实例最多能存放多少的keys?
Redis常见性能问题和解决方案?
Redis回收使用的是什么算法?
LRU算法
Redis如何做大量数据插入?
Redis2.6开始redis-cli支持一种新的被称之为pipe mode的新模式用于执行大量数据插入工 作。
为什么要做Redis分区?
分区可以让Redis管理更大的内存,Redis将可以使用所有机器的内存。如果没有分区,你 最多只能使用一台机器的内存。分区使Redis的计算能力通过简单地增加计算机得到成倍提 升,Redis的网络带宽也会随着计算机和网卡的增加而成倍增长。
你知道有哪些Redis分区实现方案?
客户端分区就是在客户端就已经决定数据会被存储到哪个redis节点或者从哪个redis节点读 取。大多数客户端已经实现了客户端分区。 代理分区 意味着客户端将请求发送给代理,然后代理决定去哪个节点写数据或者读数据。 代理根据分区规则决定请求哪些Redis实例,然后根据Redis的响应结果返回给客户端。 redis和memcached的一种代理实现就是Twemproxy 查询路由(Query routing) 的意思是客户端随机地请求任意一个redis实例,然后由Redis将 请求转发给正确的Redis节点。Redis Cluster实现了一种混合形式的查询路由,但并不是直接将请求从一个redis节点转发到另一个redis节点,而是在客户端的帮助下直接redirected 到正确的redis节点。
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节点,能做 到最大程度对用户透明地数据再平衡,但其他一些客户端分区或者代理分区方法则不支持这 种特性。然而,有一种预分片的技术也可以较好的解决这个问题。
Redis持久化数据和缓存怎么做扩容?
如果Redis被当做缓存使用,使用一致性哈希实现动态扩容缩容。 如果Redis被当做一个持久化存储使用,必须使用固定的keys-to-nodes映射关系,节点的 数量一旦确定不能变化。否则的话(即Redis节点需要动态变化的情况),必须使用可以在运 行时进行数据再平衡的一套系统,而当前只有Redis集群可以做到这样。
分布式Redis是前期做还是后期规模上来了再做好?为什么?
既然Redis是如此的轻量(单实例只使用1M内存),为防止以后的扩容,最好的办法就是一 开始就启动较多实例。即便你只有一台服务器,你也可以一开始就让Redis以分布式的方式 运行,使用分区,在同一台服务器上启动多个实例。 一开始就多设置几个Redis实例,例如32或者64个实例,对大多数用户来说这操作起来可能 比较麻烦,但是从长久来看做这点牺牲是值得的。这样的话,当你的数据不断增长,需要更多的Redis服务器时,你需要做的就是仅仅将 Redis实例从一台服务迁移到另外一台服务器而已(而不用考虑重新分区的问题)。一旦你 添加了另一台服务器,你需要将你一半的Redis实例从第一台机器迁移到第二台机器。
Twemproxy是什么?
Twemproxy是Twitter维护的(缓存)代理系统,代理Memcached的ASCII协议和Redis协 议。它是单线程程序,使用c语言编写,运行起来非常快。它是采用Apache 2.0 license的 开源软件。 Twemproxy支持自动分区,如果其代理的其中一个Redis节点不可用时,会自 动将该节点排除(这将改变原来的keys-instances的映射关系,所以你应该仅在把Redis当 缓存时使用Twemproxy)。 Twemproxy本身不存在单点问题,因为你可以启动多个 Twemproxy实例,然后让你的客户端去连接任意一个Twemproxy实例。 Twemproxy是 Redis客户端和服务器端的一个中间层,由它来处理分区功能应该不算复杂,并且应该算比 较可靠的。
支持一致性哈希的客户端有哪些?
Redis-rb、Predis等。
Redis与其他key-value存储有什么不同?
Redis有着更为复杂的数据结构并且提供对他们的原子性操作,这是一个不同于其他数据库 的进化路径。Redis的数据类型都是基于基本数据结构的同时对程序员透明,无需进行额外 的抽象。 Redis运行在内存中但是可以持久化到磁盘,所以在对不同数据集进行高速读写时需要权衡 内存,应为数据量不能大于硬件内存。在内存数据库方面的另一个优点是, 相比在磁盘上 相同的复杂的数据结构,在内存中操作起来非常简单,这样Redis可以做很多内部复杂性很 强的事情。 同时,在磁盘格式方面他们是紧凑的以追加的方式产生的,因为他们并不需要 进行随机访问。
Redis的内存占用情况怎么样?
给你举个例子: 100万个键值对(键是0到999999值是字符串“hello world”)在我的32 位的Mac笔记本上 用了100MB。同样的数据放到一个key里只需要16MB, 这是因为键值 有一个很大的开销。 在Memcached上执行也是类似的结果,但是相对Redis的开销要小一 点点,因为Redis会记录类型信息引用计数等等。 当然,大键值对时两者的比例要好很多。64位的系统比32位的需要更多的内存开销,尤其是键值对都较小时,这是因为64位的系统 里指针占用了8个字节。 但是,当然,64位系统支持更大的内存,所以为了运行大型的 Redis服务器或多或少的需要使用64位的系统。
都有哪些办法可以降低Redis的内存使用情况呢?
如果你使用的是32位的Redis实例,可以好好利用Hash,list,sorted set,set等集合类型数 据,因为通常情况下很多小的Key-Value可以用更紧凑的方式存放到一起。
查看Redis使用情况及状态信息用什么命令?
info
Redis的内存用完了会发生什么?
如果达到设置的上限,Redis的写命令会返回错误信息(但是读命令还可以正常返回。)或 者你可以将Redis当缓存来使用配置淘汰机制,当Redis达到内存上限时会冲刷掉旧的内 容。
Redis是单线程的,如何提高多核CPU的利用率?
可以在同一个服务器部署多个Redis的实例,并把他们当作不同的服务器来使用,在某些时 候,无论如何一个服务器是不够的, 所以,如果你想使用多个CPU,你可以考虑一下分片 (shard)。
一个Redis实例最多能存放多少的keys?
List、Set、Sorted Set他们最多能存放多少 元素? 理论上Redis可以处理多达232的keys,并且在实际中进行了测试,每个实例至少存放了2亿 5千万的keys。我们正在测试一些较大的值。 任何list、set、和sorted set都可以放232个元素。 换句话说,Redis的存储极限是系统中的可用内存值。
Redis常见性能问题和解决方案?
(1) Master最好不要做任何持久化工作,如RDB内存快照和AOF日志文件 (2) 如果数据比较重要,某个Slave开启AOF备份数据,策略设置为每秒同步一次(3) 为了主从复制的速度和连接的稳定性,Master和Slave最好在同一个局域网内 (4) 尽量避免在压力很大的主库上增加从库 (5) 主从复制不要用图状结构,用单向链表结构更为稳定,即:Master