redis面试题

1.redis五种数据结构及作用

  String—— 简单的 key-value 类型,value 不仅可以是 String,也可以是数字。最大的存储大小512M
  Hash——  哈希结构相对于字符串序列化缓存信息更加直观,并且在更新操作上更加便捷。所以常常用于储存对象
  List—— 使用双端链表实现的 List 可以向左向右插入数据 可以轻松地实现最新消息排行,消息队列等功能
  Set—— 一个集合,集合的概念就是一堆不重复值的组合
  zSet—— 有序集合 保留了集合不能有重复成员的特性,但不同得是,有序集合中的元素是可以排序的

2.redis持久化

  redis提供两种持久化方式AOF(Append-only file)和RDB(Redis DataBase)

  AOF:redis执行过的所有写指令记录下来

  RDB:将redis存储的数据生成快照并存储到磁盘等介质上

  如果RDB和AOF同时使用的话,redis重启的话,则会优先采用AOF方式来进行数据恢复,这是因为AOF方式的数据恢复完整度更高

  如果没有数据持久化的需求,也完全可以关闭RDB和AOF方式,redis将变成一个纯内存数据库,就像memcache一样。

3.redis为什么快

  1、完全基于内存,绝大部分请求是纯粹的内存操作,非常快速。数据存在内存中,类似于 HashMap,HashMap 的优势就是查找和操作的时间复杂度都是O(1);

  2、数据结构简单,对数据操作也简单,Redis 中的数据结构是专门进行设计的;

  3、采用单线程,避免了不必要的上下文切换和竞争条件,也不存在多进程或者多线程导致的切换而消耗 CPU,不用去考虑各种锁的问题,不存在加锁释放锁操作,没有因为可能出现死锁而导致的性能消耗;

  4、使用多路 I/O 复用模型,非阻塞 IO;

  5、使用底层模型不同,它们之间底层实现方式以及与客户端之间通信的应用协议不一样,Redis 直接自己构建了 VM 机制 ,因为一般的系统调用系统函数的话,会浪费一定的时间去移动和请求;

4. MySQL里有1000w数据,redis中只存10w的数据,如何保证redis中的数据都是热点数据

  redis内存数据集大小上升到一定大小的时候,就会施行数据淘汰策略。

  全局的键空间选择性移除

   noeviction:当内存不足以容纳新写入数据时,新写入操作会报错。

     allkeys-lru:当内存不足以容纳新写入数据时,在键空间中,移除最近最少使用的key。(这个是最常用的)

          allkeys-random:当内存不足以容纳新写入数据时,在键空间中,随机移除某个key。

  设置过期时间的键空间选择性移除

     volatile-lru:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,移除最近最少使用的key。

     volatile-random:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,随机移除某个key。

     volatile-ttl:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,有更早过期时间的key优先移除

5.redis是否是单线程线程安全

  Redis是基于内存的操作,CPU不是Redis的瓶颈,Redis的瓶颈最有可能是机器内存的大小或者网络带宽。既然单线程容易实现,而且CPU不会成为瓶颈,那就顺理成章地采用单线程的方案了。

  单进程单线程优势

    1. 代码更清晰,处理逻辑更简单
    2. 不用去考虑各种锁的问题,不存在加锁释放锁操作,没有因为可能出现死锁而导致的性能消耗
    3.  不存在多进程或者多线程导致的切换而消耗CPU 

6.事务

  redis对事务的支持也是源自于这部分需求,即支持一次性按顺序执行多个命令的能力,并保证其原子性

原文地址:https://www.cnblogs.com/ch94/p/14962022.html