1.redis数据结构有哪些?

  string,list,hash,set,zset

2.redis为什么是单线程的?

  redis是基于内存的操作,cpu不是redis的瓶颈,内存大小或网络带宽才是;

3.redis为什么这么快?

  1.redis是完全基于内存操作;

  2.数据结构简单,操作也不复杂;

  3.采用单线程可以避免不必要的上下文切换和竞争条件,不存在多线程切换导致的cpu消耗,不需要考虑锁的问题,不会出现死锁而导致的cpu消耗问题;

  4.使用单线程多路I/O复用模型实现高性能的内存数据服务。

4.Redis缓存穿透,缓存雪崩?

  缓存穿透:用户查询的数据在数据库中没有,在缓存中自然也不会有。这样导致查询的时候,在缓存中没有,每次都要去数据库查询一遍,然后每次都返回空,想到与进行了两次无用的操作。

  缓存雪崩:由于原有缓存失效,新缓存未到期,原本应该访问缓存的请求全部变成访问数据库,从而对数据库,cpu和内存造成巨大压力,严重会造成数据库宕机,最终导致整个系统的崩溃。

  缓存预热:系统上线后直接将相关的缓存数据加载到缓存系统,以避免用户请求时先查询数据库,再将数据缓存的问题。

5.如何使用Redis来实现分布式锁?

  setnx

6.Redis的并发竞争问题如何解决?

  多客户端同时并发写一个key,可能本来应该先到的数据后到了,导致数据版本错了。或者是多客户端同时获取一个key,修改值之后再写回去,只要顺序错了,数据就错了。

  解决:

  1.使用独占锁,实现复杂,成本较高;

  2.使用乐观锁,成本较低,非阻塞,性能较高;本质上是假设不会进行冲突,使用redis命令watch进行构造条件。

7.Redis持久化的几种方式,优缺点是什么,怎么实现的?

  RDB快照:将当前内存中的数据持久化到硬盘,恢复时将快照文件读取到内存中。

  触发方式:1.自动触发2.手动触发

  save:save 60 1000 60s有超过1000次key值的变化则保存。该命令执行期间会阻塞Redis服务器,不能执行其它命令,直到RDB完成,对内存较大的实例会造成长时间阻塞。

  bgsave执行该命令时,Redis在后台异步执行快照操作,同时可以响应客户端请求。具体操作是Redis进程执行fork操作创建子进程,RDB过程由子进程负责,完成后自动结束。阻塞只会发生在fork阶段,一般时间很短。

  AOF:把写操作命令记录到日志中。

  比较:RDB发生宕机会丢失最后一次备份后的所有写入数据;数据比较庞大时fork()可能会非常耗时,造成服务器在数百毫秒内停止处理客户端;

8.Redis的缓存淘汰策略?

  常用的淘汰算法:

  1.FIFO:first in first out,先进先出。判断被存储的时间,离目前最远的数据优先被淘汰。

  2.LRU:least recently used,最近最少使用。判断最近被使用的时间,目前最远的数据优先被淘汰。

  3.LFU:least frequently used,最近不经常使用。在最近的一段时间内,数据被使用次数最少的,被优先淘汰。

  淘汰策略:

  1.volatile-lru:从已设置过期时间的数据集(server.db[i].expire)中挑选最近最少使用的数据淘汰

  2.volatile-ttl:从已设置过期时间的数据集中挑选将要过期的数据淘汰

  3.vovatile-random:从已设置过期时间的数据集中随即挑选数据淘汰

  4.allkeys-lru:从数据集中挑选最近最少使用的数据淘汰

  5.allkeys-randim:从数据集中随即挑选数据淘汰

  6.no-enviction(驱逐):禁止驱逐数据

9.Redis集群,高可用,原理?

  redis-cluster

10.Redis缓存分片?

11.redis队列应用场景?

11.分布式使用场景(储存session)?

Java面试题之Redis的更多相关文章

  1. Java面试题(Redis篇)

    Redis 179.redis 是什么?都有哪些使用场景? Redis是一个开源的使用ANSI C语言编写.支持网络.可基于内存亦可持久化的日志型.Key-Value数据库,并提供多种语言的API. ...

  2. Java面试题(六)--Redis

    1 Redis基础篇 1.简单介绍一下Redis优点和缺点? 优点: 1.本质上是一个 Key-Value 类型的内存数据库,很像memcached 2.整个数据库统统加载在内存当中进行操作,定期通过 ...

  3. Java面试题整理---Redis篇

    1.redis支持五种数据结构类型?   2.redis内部结构?   3.redis持久化机制?   4.redis集群方案与实现?   5.redis为什么是单线程的?   6.redis常见回收 ...

  4. BATJ高级Java面试题分享:JVM+Redis+Kafka +数据库+设计模式

    话不多说,直接上面试题,来看一下你还欠缺多少? Mysql 与 Oracle 相比, Mysql 有什么优势? 简洁描述 Mysql 中 InnoDB 支持的四种事务隔离级别名称,以及逐级之间的区别? ...

  5. Java笔试题解答和部分面试题

    面试类  银行类的问题 问题一:在多线程环境中使用HashMap会有什么问题?在什么情况下使用get()方法会产生无限循环? HashMap本身没有什么问题,有没有问题取决于你是如何使用它的.比如,你 ...

  6. 拼多多、饿了么、蚂蚁金服Java面试题大集合

    自己当初找工作时参加过众多一线互联网公司的Java研发面试,这段时间处于寒冬,然而前几天跳槽找工作,两天面了3家,已经拿了两个offer,觉得可以和大家分享下: 下面为拼多多.饿了么.蚂蚁金服.哈啰出 ...

  7. 一些常见的Java面试题 & 面试感悟

    < 前言 > 近期在面试,深感这个行业的浮躁,一些菜不辣基的弱鸡开出的工资待遇要求,超过了我.不知道他们是怎么拿到那么高的工资的,难道是他在公司有亲戚朋友吗?有后台吗?是行业热钱真的过多了 ...

  8. 10个经典的Java面试题集合

    这里有10个经典的Java面试题,也为大家列出了答案.这是Java开发人员面试经常容易遇到的问题,相信你了解和掌握之后一定会有所提高.让我们一起来看看吧. 1.Java的HashMap是如何工作的? ...

  9. 【面试必备】常见Java面试题大综合

    一.Java基础 1.Arrays.sort实现原理和Collections.sort实现原理答:Collections.sort方法底层会调用Arrays.sort方法,底层实现都是TimeSort ...

随机推荐

  1. Java解法-两数相加(Add Two Numbers)

    问题  给出两个非空的链表用来表示两个非负的整数.其中,它们各自的位数是按照逆序的方式存储的,并且它们的每个节点只能存储一位数字. 如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和. ...

  2. SuRF: Practical Range Query Filtering with Fast Succinct Tries 阅读笔记

    SuRF(Succinct Range Filter)是一种快速而紧凑的过滤器,同时支持点查询和范围查询(包括开区间查询.闭区间查询.范围计数),可以在RocksDB中用SuRF来替换Bloom过滤器 ...

  3. Spring再接触 自动装配

    UserDaoImpl package com.bjsxt.dao.impl; import com.bjsxt.dao.UserDAO; import com.bjsxt.model.User; p ...

  4. 1.express中间件的简介

    express中间件的意思 1, 中间件是一个模块.在js中,模块意味着函数,所以中间件是一个函数.那么这个函数长什么样子? 这还要从中间件的功能说起,它拦截http 服务器提供的请求和响应对象,执行 ...

  5. c语言作业01-分支、顺序结构

    1.本章思考总结 1.1思维导图 1.2本章学习体会及代码量学习体会 1.2.1学习体会 这一个星期算是我学习c语言的起点,因为暑假没有提前自学c语言,所以一上课时会觉得比较吃力也难以跟上其他大部分同 ...

  6. jenkins 多版本 jdk

    最近又开始使用jenkins了,遇到一个问题,开发本地使用的jdk是1.7,而我们jenkins由于需要对docker的插件的支持必须使用1.8. 这样就导致了有的开发的代码在jenkins去代码库c ...

  7. python之函数递归

    函数递归调用 在函数内部,可以调用其它函数,如果一个函数在内部调用自身,即是递归调用 为防止无限递归类似于死循环,需要如下: 1.必须要有一个明确的返回值: 2.每次进入更深一层递归时,问题规模应该比 ...

  8. python--第十六天总结(bootstrap)

    一. 实现原理 网格布局是通过容器的大小,平均分为12份(可以修改),再调整内外边距,和表格布局有点类似但是也存在区别. 实现步骤如下: (1) 数据行.row 必须包含在容器.container 中 ...

  9. python_Tkinter1

    一个更详细的Tkinter笔记: 首先是最重要基础的,如何 创建一个窗口 窗口代码: #coding:utf8 import Tkinter show = Tkinter.Tk() show.titl ...

  10. Spring常用注解总结(1)

    前言:项目中常用的注解常看常记,总会对自己有些好处,所以在这里分享一下. 使用spring时,可以使用xml配置文件配置相关信息.但是我还是喜欢用注解的方式,因为可以充分利用反射机制获取类结构信息,而 ...