常见面试题(八)内存数据库 NOSQL

1、如何使用RedisTemplate访问Redis数据结构

String、list、hashtable,set,zset

https://www.jianshu.com/p/7bf5dc61ca06/

2、常见的缓存策略有哪些

LRU 最近最少使用

LFU 使用频率最少

3、缓存和数据库一致性解决方案

采用延时双删策略

在写库前后都进行redis.del(key)操作,并且设定合理的超时时间。

具体的步骤就是:

1)先删除缓存

2)再写数据库

3)休眠500毫秒

4)再次删除缓存

4、缓存穿透解决方案

DB中也无数据的情况:防止恶意攻击,在缓存中设置默认值

DB中存在数据:热点数据可设置不过期,定期补偿数据

5、缓存雪崩解决方案

和缓存击穿不同的是,缓存击穿指并发查同一条数据,缓存雪崩是不同数据都过期了,很多数据都查不到从而查数据库。

1、缓存数据的过期时间设置随机,防止同一时间大量数据过期现象发生。

2、如果缓存数据库是分布式部署,将热点数据均匀分布在不同搞得缓存数据库中。

3、设置热点数据永远不过期。

6、redis有哪些数据结构

7、redis持久化方式

RDB:通过同步或者异步的方式保存数据快照,重新启动时恢复数据快,缺点由于fork子进程异步进行持久化的,在宕机时可能会丢失数据

AOF:以日志的形式记录服务器所处理的每一个写、删除操作,查询操作不会记录,以文本的方式记录,可以打开文件看到详细的操作记录。每条同步、每秒同步和不同步,三种策略,缺点是AOF文件大重新启动时恢复慢

 

8、redis淘汰策略

noeviction: 不删除策略, 达到最大内存限制时, 如果需要更多内存, 直接返回错误信息。 大多数写命令都会导致占用更多的内存(有极少数会例外, 如 DEL )。

allkeys-lru: 所有key通用; 优先删除最近最少使用(less recently used ,LRU) 的 key。

volatile-lru: 只限于设置了 expire 的部分; 优先删除最近最少使用(less recently used ,LRU) 的 key。

allkeys-random: 所有key通用; 随机删除一部分 key。

volatile-random: 只限于设置了 expire 的部分; 随机删除一部分 key。

volatile-ttl: 只限于设置了 expire 的部分; 优先删除剩余时间(time to live,TTL) 短的key。

 

9、Redis的过期策略

Redis中同时使用了惰性过期和定期过期两种过期策略

10、redis2和redis3的区别

1)、主要体现在主从复制上面,redis2.8以前,主要是通过sync命令全量复制,即使在主从终端恢复后也是全量复制

redis3.0开始 ,通过psync部分复制,首次同步主服务器发送RDB文件,非首次只发送非同步数据,主服务器保存了同步的偏移量,和复制积压缓冲区

2)、Redis Cluster是一种服务器Sharding技术,3.0版本开始正式提供

11、redis集群方案

1)主从模式

Redis不具备自动容错和恢复功能,可用性低

2)哨兵模式

Sentinel(哨兵)进程是用于监控redis集群中Master主服务器工作的状态,在Master主服务器发生故障的时候,可以实现Master和Slave服务器的切换,保证系统的高可用。

缺点:哨兵模式也是基于主从模式,切配置复杂

3)Redis官方 Cluster集群模式

集群搭建的时候需要给集群节点分配哈希槽,当我们的存取的key到达的时候,redis会根据crc16的算法得出一个结果,然后把结果对 16384 求余数,这样每个 key 都会对应一个编号在 0-16383 之间的哈希槽,通过这个值,去找到对应的插槽所对应的节点,然后直接自动跳转到这个对应的节点上进行存取操作。

4)Jedis sharding集群

5)利用中间件代理

12、redis和memcached 的内存管理的区别

1)Redis支持服务器端的数据操作:Redis相比Memcached来说,拥有更多的数据结构和并支持更丰富的数据操作,通常在Memcached里,你需要将数据拿到客户端来进行类似的修改再set回去。这大大增加了网络IO的次数和数据体积。在Redis中,这些复杂的操作通常和一般的GET/SET一样高效。所以,如果需要缓存能够支持更复杂的结构和操作,那么Redis会是不错的选择。

2)内存使用效率对比:使用简单的key-value存储的话,Memcached的内存利用率更高,而如果Redis采用hash结构来做key-value存储,由于其组合式的压缩,其内存利用率会高于Memcached。

3)性能对比:由于Redis只使用单核,而Memcached可以使用多核,所以平均每一个核上Redis在存储小数据时比Memcached性能更高。而在100k以上的数据中,Memcached性能要高于Redis,虽然Redis最近也在存储大数据的性能上进行优化,但是比起Memcached,还是稍有逊色。

13、什么是Redis的并发竞争问题,如何解决

1)、利用redis自带的incr命令

2)、可以使用独占锁的方式,类似操作系统的mutex机制

3)、使用乐观锁的方式进行解决(成本较低,非阻塞,性能较高)

4)、这个是针对客户端来的,在代码里要对redis操作的时候,针对同一key的资源,就先进行加锁(java里的synchronized或lock)。

5)利用redis的setnx实现内置的锁

 

13、了解Redis事务的CAS操作吗

乐观锁工作机制:

watch 命令会监视给定的每一个key,当exec时如果监视的任一个key自从调用watch后发生过变化,则整个事务会回滚,不执行任何动作。注意watch的key是对整个连接有效的,事务也一样。如果连接断开,监视和事务都会被自动清除。当然exec,discard,unwatch命令,及客户端连接关闭都会清除连接中的所有监视。还有,如果watch一个不稳定(有生命周期)的key并且此key自然过期,exec仍然会执行事务队列的指令。

14、Redis的选举算法和流程是怎样的。

对raft算法的实现,Raft采用心跳机制触发Leader选举。系统启动后,全部节点初始化为Follower,term为0.节点如果收到了RequestVote或者AppendEntries,就会保持自己的Follower身份。如果一段时间内没收到AppendEntries消息直到选举超时,说明在该节点的超时时间内还没发现Leader,Follower就会转换成Candidate,自己开始竞选Leader。

https://blog.csdn.net/qq_34988624/article/details/86412393

15、知道哪些redis的优化操作

1)尽量使用短的key

2)避免使用keys *

3)在存到Redis之前先把你的数据压缩下

4)设置 key 有效期

5)选择回收策略(maxmemory-policy)

6)使用bit位级别操作和byte字节级别操作来减少不必要的内存使用

7)尽可能地使用hashes哈希存储。

8)当业务场景不需要数据持久化时,关闭所有的持久化方式可以获得最佳的性能。

9)想要一次添加多条数据的时候可以使用管道。

10)限制redis的内存大小(64位系统不限制内存,32位系统默认最多使用3GB内存)

11)SLOWLOG [get/reset/len]

https://blog.csdn.net/achuo/article/details/80600170

16、redis的线程模型

采用文件事件驱动模式,文件事件驱动器使用IO多路复用对网络套接字进行监听,将监听到的事件放入队列,然后依次分配给事件处理器进行处理。

https://www.cnblogs.com/barrywxx/p/8570821.html

17、Redis是单线程模型为什么效率还这么高?

1)纯内存访问:数据存放在内存中,内存的响应时间大约是100纳秒,这是Redis每秒万亿级别访问的重要基础。

2)非阻塞I/O:Redis采用epoll做为I/O多路复用技术的实现,再加上Redis自身的事件处理模型将epoll中的连接,读写,关闭都转换为了时间,不在I/O上浪费过多的时间。单线程避免了线程切换和竞态产生的消耗。

3)Redis采用单线程模型,每条命令执行如果占用大量时间,会造成其他线程阻塞,对于Redis这种高性能服务是致命的,所以Redis是面向高速执行的数据库

 

你可能感兴趣的:(Java面试整理,JAVA面试题库)