Java面试—Redis篇

文章目录

    • 1、什么是Redis?
    • 2、Redis可以运用在哪些地方呢?
    • 3、Redis为什么那么快?
    • 4、Redis有哪些基本数据结构?
    • 5、Redis的底层数据机构?
    • 6、Redis的过期策略和淘汰策略?

1、什么是Redis?

  1. Redis是一种基于键值对(key-value)的NoSQL数据库

NoSQL数据库是一种非关系型数据库,它不使用关系型数据库的传统基于表的结构。

  1. 基于C语言开发
  2. Redis中的数据是存储在内存中的,读写速度非常快
  3. Redis比一般键值对强大之处是,其中的value支持String、Hash、Sorted Set、BitMap、GEO等

2、Redis可以运用在哪些地方呢?

  1. 缓存:我相信大多数人接触到Redis一开始都是做缓存的吧,读写速度快,减少关系型数据的访问压力,还有存储session,存储序列化等等
  2. 计数器、排行榜、赞/踩:Redis有天然的计数功能来做计数器,采用合适的结构去构建排行榜体系(本人是在黑马点评中都见识过)
  3. 消息队列:Redis提供了发布订阅和阻塞队列的功能,也可以用,但是对于这个功能还是交给专业的RocketMq、RibbitMq和Kafka这些东西去做
  4. 分布式锁:在分布式环境下,利用Redis去做分布式锁,提到这个就要了解一下Redisson

3、Redis为什么那么快?

  1. 是基于C语言开发的,其中用到的几种数据结构都是经过优化的,性能很高
  2. 是完全基于内存的操作,内存的访问速度是磁盘的上千倍
  3. 使用的是单线程和IO多路复用,高效的事件处理模型

4、Redis有哪些基本数据结构?

描述 使用场景
string 字符串是最基础的数据结构,但是值最大不能超过512MB 缓存、计数、共享session、限速
hash 本身又是key-value的键值对 缓存用户信息、缓存对象
list 可以存储多个有序的字符串 消息队列、文章列表
set 用来保存多个字符串元素,集合中不允许有重复元素并且无序 标签、共同关注
Sorted Set 带权的set,通过权可以进行排序 用户点赞排序、用户排序

还有三种特殊的数据类型:

geospatial 可以推算出地理位置信息,两地之间的距离
hyperloglog 数据上集合的元素个数,是不能重复的,常用于统计网站的UV
bitmap 就是通过最小的单位 bit 来进行0或者1的设置,表示某个元素对应的值或者状态

5、Redis的底层数据机构?

  1. String:底层数据结构是由简单动态字符串(SDS)直接存储,但是编码方式可以是int、raw、embstr
    1. int编码:字符串保存的是整数值,会直接保存在redisObject的ptr里面,并将编码设置成int
    2. raw编码:保存大于32字节的字符串,会使用SDS结构,并将编码设置为raw,此时内存分配次数为两次,创建redisObject和sdshdr
    3. embstr编码:保存小于等于32字节的字符串,也是SDS结构,结构做了优化,内存只用分配一次,分配一块连续的空间即可

在Redis中,存储long、double类型的浮点数是先转换为字符串再进行存储的;int编码、embstr编码如果继续做字符串追加操作的话,一定条件下会转换成raw编码的

  1. List:底层数据结构是由ziplistlinkedlist组成的。
    1. ziplist看起来是一块连续的内存,本质上就是一个字节数组,为了节约内存而设计的一种线性结构,可以包含多个元素,每个元素可以是一个字节数组或一个整数
    2. linkedlist:就和普通那个差不多

当list对象保存的字符串元素长度都小于64字节,保存的元素个数小于512个,使用ziplist编码,其余使用linkedlist编码

  1. hash:底层数据结构是由ziplisthashtable组成的
    1. ziplist:保存同一键值对的两个节点紧靠相邻,键key在前,值value在后,先保存的键值对在压缩列表的表头方向,后来在表尾方向
    2. hashtable:用字典键值对保存,字典的键为字符串对象,保存键key,字典的值也为字符串对象,保存键值对的值

当list对象保存的字符串元素长度都小于64字节,保存的元素个数小于512个,使用ziplist编码,其余使用hashtable编码,这两个条件的上限值可以进行配置文件修改

  1. set:底层数据结构是由intsethashtable
    1. intset:使用整数集合作为底层实现,set对象包含的所有对象都被保存在intset整数集合中
    2. hashtable:字典key包含一个set元素,value都为null

当set对象保存的所有元素都是整数值,set对象保存的元素数量不超过512个,使用intset编码,其余使用hashtable编码

  1. zset:底层数据结构是ziplistskiplist
    1. ziplist:每个集合元素使用相邻的两个压缩列表节点保存,一个保存元素成员,一个保存元素的分值,然后根据分数进行从小到大的排序
    2. skiplist:使用了zset结构,包含一个字典和一个跳跃表

当有序集合保存的元素数量小于128个,有序集合保存的所有元素的长度都小于64字节,使用ziplist,否则使用skiplist,这两个条件的上限值可以进行配置文件修改

6、Redis的过期策略和淘汰策略?

  1. 我们可以通过给缓存数据设置过期时间,它有助于缓解内存的消耗,有利于某些应用场景(短信验证码)
  2. Redis通过一个叫做过期字典来保存你设置过数据的过期时间,实际上就是一个hash表,当我们查询一个key时,Redis先会查找这个key是否存在于过期字典中,如果不在,就正常取值即可,如果在的话,会获取key的过期时间,然后与系统时间做对比来判断是否过期
  3. 过期策略:
    1. 惰性删除:只会取出key的时候才会对数据进行过期性检查,对cpu友好
    2. 定期删除:每隔一段时间就会抽取一批key执行删除过期key的操作,对内存更加友好

所以Redis一般采用的是:定期删除+惰性删除的过期策略

  1. 淘汰策略:当 Redis 的运行内存已经超过 Redis 设置的最大内存之后,则会使用内存淘汰策略删除符合条件的 key,以此来保障 Redis 高效的运行。
内存淘汰策略 作用
volatile-lru 从已设置过期时间的数据集中挑选最近最少使用的数据淘汰
volatile-ttl 从已设置过期时间的数据集中挑选将要过期的数据淘汰
volatile-random 从已设置过期时间的数据集中任意选取数据淘汰
allkeys-lru 当内存不足时,在键空间中,移除最近最少使用的key(最常用)
allkeys-random 从数据集中任意选择数据淘汰
no-eviction 禁止驱逐数据,当内存不足时,禁止写入数据,会报错
vloatile-lfu 从已设置过期时间的数据集中挑选最不经常使用的数据淘汰
allkeys-lfu 当内存不足时,在键空间中,移除最不经常使用的key

你可能感兴趣的:(面试,java,redis,面试)