Redis
- 什么是Redis?
Remote Dictionary Server
Redis本质上是一个Key-value类型的内存数据库,很像memcached,整个数据库加载在内存当中进行操作,定期通过异步操作把数据库数据flush到硬盘上进行保存。因为是纯内存操作,Redis的性能非常出色,每秒可以处理超过十万次的读写操作,是一只性能最快的Key-Value DB。
Redis的出色之处不仅仅是性能,Redis最大的魅力是支持保存多种数据结构,此外单个value的最大限制是1GB,不像memcached只能保存1MB的数据,因此Redis可以用来实现很多有用的功能。
- Redis相比memcached有哪些优势?
- memcached所有的值均是简单的字符串,redis作为其替代者,支持更为丰富的数据类型
- redis的速度比memcached快很多
- redis可以持久化其数据
- Redis支持哪几种数据类型
String、List、Set、Sorted Set、hashes
- Redis消耗什么无力资源?
消耗内存
- Redis有哪几种数据淘汰策略
- noeviction:返回错误当内存限制达到并且客户端尝试执行会让更多内存被使用的命令
- allkeys-Iru:尝试回收最少使用的键(LRU),使得新添加的数据有空间存放。
- volatile-Iru:尝试回收最少使用的键(LRU),但仅限于在过期集合的键,使得新添加的数据有空间存放
- allkeys-random:回收随机的键使得新添加的数据有空间存放
- volatile-ttl:回收在过期集合的键,并且优先回收存活时间(TTL)较短的键,是的新添加的数据有空间存放
- 为什么Redis需要将所有的数据存放到内存中?
Redis为了达到最快的读写速度将数据都读到内存中,并通过异步的方式将数据写入磁盘。所以reids具有快速和数据持久化的特征。如果不将数据存放到内存中,磁盘I/O速度为严重影响reids的性能。如果设置了最大使用内存,则数据已有记录数达到内存限值后不能继续插入新值。
- Redis有哪些适合的场景?
- 会话缓存(Session Cache):最常用的一种使用redis的情景是会话缓存。用redis缓存会话比其他存储的优势在于:Redis提供持久化。
-
- 全页缓存(FPC):除基本的会话token之外,Redis还提供很简单的FPC平台。即使重启了Redis的实力,因为有磁盘的持久化,用户也不会看到页面加载速度的下降。
- 队列:Redis在内存存储引擎领域提供list和set操作,这使得Redis能作为一个很好的消息队列平台来使用。redis作为队列使用的操作,就类似于本地程序语言对list的push/pop操作。
- 排行榜/计数器:Redis在内存中对数字进行递增或递减的操作实现的非常好。集合(Set)和有序集合也使这些操作变得简单,redis正好提供了这两种数据结构。
- 发布/订阅
- Redis和Redission的关系
Redission是一个高级的分布式协调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)。
- Redis设置密码及验证码
设置密码:config set requirepass 123456
授权密码:auth 123456
- Redis事物相关的命令有哪几个?
MULTI、EXEC、DISCARD、WATCH
- Redis回收使用的是什么算法?
LRU算法
-
为什么要做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存储一个数据集
- 当使用分区的时候,数据处理会非常复杂。因为为了备份你必须从不同的redis实例和主机同时收集RDB/AOF文件
- 分区时动态扩容或缩容可能会非常复杂。
- redis持久化数据和缓存怎么做扩容?
- 如果redis当作缓存使用,使用一只性哈希实现动态扩容缩容
- 如果redis被当作一个持久化存储使用,必须使用固定的keys-to-nodes映射关系,节点的数量一旦确定不能变化。否则的话(即Reids节点需要动态变化的情况),必须使用可以在运行时进行时进行数据在平衡的一套系统,而当前只有redis集群可以做到这样。
- Redis是单线程的,如何提高多核CPU的利用率?
可以在同一个服务器部署多个redis的实例,并把他们当作不同的服务器来使用,在某些时候,一个服务器是不够的,所以如果你想使用多个CPU,可以考虑一下分片(shard)。