2017年6月Java面试——redis

一、redis

1.redis的数据类型?

答:五种 string 、hash、set、list、zset,我们实际项目中比较常用的是string,hash

2.谈谈redis的LRU算法

答:LRU即最近最久未使用,当内存达到限制时,Redis 具体的回收策略是通过 maxmemory-policy 配置项配置的。由以下多个选项:
noenviction:不清除数据,只是返回错误,这样会导致浪费掉更多的内存,对大多数写命令(DEL 命令和其他的少数命令例外)
allkeys-lru:从所有的数据集(server.db[i].dict)中挑选最近最少使用的数据淘汰,以供新数据使用
volatile-lru:从已设置过期时间的数据集(server.db[i].expires)中挑选最近最少使用的数据淘汰,以供新数据使用
allkeys-random:从所有数据集(server.db[i].dict)中任意选择数据淘汰,以供新数据使用
volatile-random:从已设置过期时间的数据集(server.db[i].expires)中任意选择数据淘汰,以供新数据使用
volatile-ttl:从已设置过期时间的数据集(server.db[i].expires)中挑选将要过期的数据淘汰,以供新数据使用
当 cache 中没有符合清除条件的 key 时,回收策略 volatile-lru, volatile-random 和volatile-ttl 将会和 策略 noeviction 一样返回错误。选择正确的回收策略是很重要的,取决于你的应用程序的访问模式。

        回收的过程是这么运作的非常的重要:
①一个客户端运行一个新命令,添加了新数据。
②Redis 检查内存使用情况,如果大于 maxmemory 限制,根据策略来回收键。
③一个新的命令被执行,如此等等

Redis的LRU算法不是一个严格的LRU实现。这意味着Redis不能选择最佳候选键来回收,也就是最久未被访问的那些键。

相反,Redis 会尝试执行一个近似的LRU算法,通过采样一小部分键,然后在采样键中回收最适合(拥有最久访问时间)的那个。

3.如何提高redis命中率

在获取数据的时候,会判断key是否存在,如果存在keyspace_hits++,如果不存在keyspace_misses,命中率用这两个数就可以算出

提高redis命中率的方法:

缓存的设计(粒度和策略)

缓存的粒度越小,命中率会越高,

缓存容量

缓存的容量有限,则容易引起缓存失效和被淘汰

其他因素

当缓存节点发生故障时,需要避免缓存失效并最大程度降低影响

4.redis过期键的删除策略

定时删除:在设置键的过期时间的同时,创建一个定时器( timer ). 让定时器在键的过期时间来临时,立即执行对键的删除操作。
惰性删除:放任键过期不管,但是每次从键空间中获取键时,都检查取得的键是否过期,如果过期的话,就删除该键;如果没有过期,就返回该键。
定期删除: 每隔一段时间程序就对数据库进行一次检查,删除里面的过期键。至于要删除多少过期键,以及要检查多少个数据库,则由算法决定。

5.redis主从是如何实现同步的

  第一次、Slave向Master同步的实现是:
        Slave向Master发出同步请求(发送sync命令),Master先dump出rdb文件,然后将rdb文件全量传输给slave,然后Master把缓存的写命令转发给Slave,初次同步完成。
第二次、以及以后的同步实现是:
        Master将变量的快照直接实时依次发送给各个Slave。
        但不管什么原因导致Slave和Master断开重连都会重复以上两个步骤的过程。
        Redis的主从复制是建立在内存快照的持久化基础上的,只要有Slave就一定会有内存快照发生。

           6.redis主从中的哨兵是做什么的

Redis的哨兵模式就是对redis系统进行实时的监控,其主要功能有下面两点
1.监测主数据库和从数据库是否正常运行。
2.当我们的主数据库出现故障的时候,可以自动将从数据库转换为主数据库,实现自动的切换     

6.redis持久化方式

aof 和rdb

 

 

 

你可能感兴趣的:(redis)