面试常见问题-缓存

April 12th 2019 | 日常

  • redis集群怎么做
    1、Redis集群提供了以下两个好处
    1、将数据自动切分(split)到多个节点
    2、当集群中的某一个节点故障时,redis还可以继续处理客户端的请求。
    2、集群的方案:
       redis-cluster集群,采用无中心结构,每个节点保存数据和整个集群状态,每个节点都和其他所有节点连接,主要通过节点的配置,辅以redis的主从来完成集群。由于这块东西我使用得很少,所以只是平时抽时间去研究过,并没有真正的在线上实现过。
  • Redis 如何防止高并发
    其实redis是不会存在并发问题的,因为他是单进程的,再多的command都是one by one执行的。我们使用的时候,可能会出现并发问题,比如get和set这一对。
    redis为什么会有高并发问题
    redis的出身决定 
       Redis是一种单线程机制的nosql数据库,基于key-value,数据可持久化落盘。由于单线程所以redis本身并没有锁的概念,多个客户端连接并不存在竞争关系,但是利用jedis等客户端对redis进行并发访问时会出现问题。发生连接超时、数据转换错误、阻塞、客户端关闭连接等问题,这些问题均是由于客户端连接混乱造成。
     
    同时,单线程的天性决定,高并发对同一个键的操作会排队处理,如果并发量很大,可能造成后来的请求超时。
    在远程访问redis的时候,因为网络等原因造成高并发访问延迟返回的问题。
    解决办法
    在客户端将连接进行池化,同时对客户端读写Redis操作采用内部锁synchronized。
    服务器角度,利用setnx变向实现锁机制。
  • redis消息队列先进先出需要注意什么
       通常使用一个list来实现队列操作,这样有一个小限制,所以的任务统一都是先进先出,如果想优先处理某个任务就不太好处理了,这就需要让队列有优先级的概念,我们就可以优先处理高级别的任务,实现方式有以下几种方式:
       1)单一列表实现:队列正常的操作是 左进右出(lpush,rpop)为了先处理高优先级任务,在遇到高级别任务时,可以直接插队,直接放入队列头部(rpush),这样,从队列头部(右侧)获取任务时,取到的就是高优先级的任务(rpop)
       2)使用两个队列,一个普通队列,一个高级队列,针对任务的级别放入不同的队列,获取任务时也很简单,redis的BRPOP命令可以按顺序从多个队列中取值,BRPOP会按照给出的 key 顺序查看,并在找到的第一个非空 list 的尾部弹出一个元素,redis> BRPOP list1 list2 0
    list1 做为高优先级任务队列
    list2 做为普通任务队列
    这样就实现了先处理高优先级任务,当没有高优先级任务时,就去获取普通任务
    方式1最简单,但实际应用比较局限,方式3可以实现复杂优先级,但实现比较复杂,不利于维护
    方式2是推荐用法,实际应用最为合适
  • redis 常用的数据类型
      Redis 的数据类型主要有:
         string:字符串类型,可以包含任何数据。包括jpg图片或者序列化的对象。里面的incr方法可以实现网站计数器功能,每次访问一个就可以进行加1操作。降低了数据库的压力。
         list:是一个双向链表,通过push,pop操作从链表的头部或者尾部添加删除元素。
    这使得list既可以用作栈,也可以用作队列。比如可以获取最新添加的10个商品,获取最新的登陆的10个信息,做商品的秒杀等等。都可以通过链表中的队列来实现,极大节省了各方面的资源。
         hash:hash数据类型是redis模仿数据库把一条记录信息给存储起来,这样可以把数据库中的每一条记录保存在hash中,作为缓存处理,非常接近于数据库的操作。
         set :set是string类型的无序集合。set集合类型除了基本的添加删除操作,其他有用的操作还包含集合的取并集(union),交集(intersection),差集(difference)。通过这些操作可以很容易的实现sns中的好友推荐功能。比如qq好友推荐、微博系统的关注关系使用
         sorted set:和set一样sorted set也是string类型元素的集合,不同的是每个元素都会关联一个权。通过权值可以有序的获取集合中的元素,它的适用场合如:获得热门帖子(回复量)信息,根据学生成绩排序获得信息等.
        简单说下无序集合、有序集合、链表三者的主要区别:
    set类型:集合类型、内部元素没有顺序,同一个集合没有重复元素
    list链表类型:内部元素有彼此的先后顺序,同一个链表允许有重复元素
    Sort set类型:排序集合类型,相比set类型有排序功能
  • 持久化redis有几种方式?

    答:主要有两种方式:
    1 快照持久化
    在redis配置文件中已经自动开启了,
    格式是:save N M
    表示在N秒之内,redis至少发生M次修改则redis抓快照到磁盘。
    当然我们也可以手动执行save或者bgsave(异步)命令来做快照
    2append only file  AOF持久化
     总共有三种模式,如
    appendfsync everysec默认的是每秒强制写入磁盘一次
    appendfsync always 每次执行写操作的时候就强制写入磁盘
    appendfsync no 完全取决于os,性能最好但是持久化没法保证
    其中第三种模式最好。redis默认的也是采取第三种模式。
  • memcache与redis的区别
    1.数据类型支持不同
    Memcached仅支持简单的key-value结构 。
    Redis支持的数据类型主要由五种:String、Hash、List、Set和Sorted Set
    2.内存管理机制不同
    Memcached保存在内存中,断电则丢失数据。
    Redis并不是所有的数据都一直存储在内存中的,当物理内存用完时,可以将一些很久没用到的value交换到磁盘。
    Redis只会缓存所有的key的信息,如果Redis发现内存的使用量超过了某一个阀值,将触发swap的操作。
    3.数据持久化支持
    Redis虽然是基于内存的存储系统,但是它本身是支持内存数据的持久化的,而且提供两种主要的持久化策略:RDB快照和AOF日志。
    memcached是不支持数据持久化操作的。
    4.集群管理的不同
    Redis支持分布式集群来扩展存储能力。
    Memcached本身并不支持分布式,因此只能在客户端通过像一致性哈希这样的分布式算法来实现Memcached的分布式存储。
  • 你对Memcache的理解,优点有哪些?
    Memcache是一种缓存技术,在一定的时间内将动态网页经过解析之后保存到文件,下次访问时动态网页就直接调用这个文件,而不必在重新访问数据库。使用memcache做缓存的好处是:提高网站的访问速度,减轻高并发时服务器的压力。
    Memcache的优点:稳定、配置简单、多机分布式存储、速度快。
  • 分布式数据库
    答:我所知道的分布式数据库有memcache,主要是分布式的非关系型数据库,用于缓存处理。
        分布式是指将不同的业务分布在不同的地方。 而集群指的是将几台服务器集中在一起,实现同一业务。
    分布式中的每一个节点,都可以做集群。 而集群并不一定就是分布式的。
    举例:就比如新浪网,访问的人多了,他可以做一个群集,前面放一个响应服务器,后面几台服务器完成同一业务,如果有业务访问的时候,响应服务器看哪台服务器的负载不是很重,就将给哪一台去完成。
    而分布式,从窄意上理解,也跟集群差不多, 但是它的组织比较松散,不像集群,有一个组织性,一台服务器垮了,其它的服务器可以顶上来。
      memcache的应用场景
    1、适用memcached的业务场景?
    1)如果网站包含了访问量很大的动态网页,因而数据库的负载将会很高。由于大部分数据库请求都是读操作,那么memcached可以显著地减小数据库负载。
    2)利用memcached可以缓存session数据、临时数据以减少对他们的数据库写操作。
    4)缓存一些很小但是被频繁访问的文件。
    5)访问比较频繁,安全性不高,丢失无所谓,修改比较频繁的数据,比如一些用户的在线状态
     
    2 、不适用memcached的业务场景?
    1)缓存对象的大小大于1MB
    memcache本身就不是为了处理庞大的多媒体(large media)和巨大的二进制块(streaming huge blobs)而设计的。
    2)key的长度大于250字符
    3)应用运行在不安全的环境中
    4)业务本身需要的是持久化数据或者说需要的应该是database
  • Memcache缓存机制 以及分布式
    Memcached是一个高性能的分布式内存对象缓存系统。目前全世界不少人使用这个缓存项目来构建自己大负载的网站,来分担数据库的压力,通过在内在里维护一个统一的巨大的的hash表,它能够用来存储各种格式的数据,包括图像、视频、文件以及数据库检索的结果等,简单的说就是将数据调用到内存中,然后从内存中读取,从而大大提高读取速度。
     传统的查询方法是直接查询数据库,数据库将结果返回给查询语句,而当有Memcache中间缓存层时,查询的是Memcache缓存数据,下面详细了解Memcache各类数据操作原理:
    1. 查询数据(select),首先通过指定的Key查询(get)Memcache中间缓存层数据,如果存在相对应数据,则直接获取出数据结果,查询过程完全不需要查询数据库。如果不存在,则查询MySQL数据库,并以key对应value的形式将查询结果存储在Memcache缓存数据中,然后将结果返回给查询语句。
    2. 更新数据(update),首先更新数据,然后删除相关的memcache数据(delete)。
    3. 增加数据(add),首先删除相关缓存数据,然后增加数据。
    4. 删除数据(delete),删除数据,并删除Memcache数据。
    memcache的应用场景有:
     1.如果是一个小网站,pv值不大,就不考虑使用memcached
     2.变化频繁,查询频繁,但是不一定写入数据库(适合memcached)(用户在线状态)
     3.变化频繁,一变化就要入库(比如股票,金融)不适合memcached
     4.变化不频繁,查询频繁,不管入不入库,都比较适合memcache,(新浪的新闻频道)
        分布式是指将不同的业务分布在不同的地方(几台服务器)。 而集群指的是将几台服务器集中在一起,实现同一业务。
    分布式中的每一个节点,都可以做集群。 而集群并不一定就是分布式的。
    举例:就比如新浪网,访问的人多了,他可以做一个集群,前面放一个响应服务器,后面几台服务器完成同一业务,如果有业务访问的时候,响应服务器看哪台服务器的负载不是很重,就交给哪一台去完成。而分布式,从窄意上理解,也跟集群差不多,但是它的组织比较松散,不像集群,有一个组织性,一台服务器垮了,其它的服务器可以顶上来。memcache的分布式算法取决于客户端,主要用取余算法和一致性哈希算法。
  • memcache 缓存什么数据
    一、经常被读取并且实时性要求不强可以等到自动过期的数据。例如网站首页最新文章列表、某某排行等数据。
    二、经常被读取并且实时性要求强的数据。比如用户的好友列表,用户文章列表,用户阅读记录等。
    三、统计类缓存,比如文章浏览数、网站PV等。
        四、活跃用户的基本信息或者某篇热门文章。
        五、session数据
  • 说说你对缓存技术的了解?
    1、缓存技术是将动态内容缓存到文件中,在一定时间内访问动态页面直接调用缓存文件,而不必重新访问数据库。
    2、使用memcache和redis可以做缓存。
  • redis和memcacahe、mongoDB的区别
    都是非关系型数据库,性能都非常高,但是mongoDB和memcache、redis是不同的两种类型。
    后两者主要用于数据的缓存,前者主要用在查询和储存大数据方面,是最接近数据库的文档型的非关系数据库。
    这里我主要谈谈memcache和redis的区别。
    1从数据存储位置上来分,memcache的数据存在内存中,而redis既可以存储在内存中,也可以存储的到磁盘中,达到持久化存储的功能,memcache一旦断电,数据全部丢失,redis可以利用快照和AOF把数据存到磁盘中,当恢复时又从磁盘中读取到内存中,当物理内存使用完毕后,可以把数据写入到磁盘中。
    2从存储数据的类型上来分,memcache和redis存储的方式都是键值对,只不过redis值的类型比较丰富,有string(字符串),hash(哈希),list(列表),set(集合)zset(有序集合),而memcache主要存储的是字符串。
    3从架构层次来分,Redis支持master-slave(主—从)模式应用,memcache支持分布式。
    4另外从存储数据的大小上来分,Redis单个value的最大限制是1GB,memcached只能保存1MB的数据。但是Memcache在存储100K以上的数据,性能稍微好一点。
    5另外redis只支持单核,memcache可以支持多核,当然关于redis取代memcache的说法,在一般情况下,两者性能都很高,在大多的业务场景选择上,redis的选择可能更加具有优势,但也不能说可以完全取代,最终还是取决于你的应用场景。