面试题4

一、redis有哪些数据结构及分别试用的业务场景?

  • string,key-value接口,使用存储一些用户信息,token
  • hash,key-map接口,可以存储一些字典信息
  • set,无序集合,里面的元素是不可重复的,去重的场景时可以用这种set数据结构
  • zset,有序集合,里面的zscore 可以进行自动排序,可以做一些排名的功能
  • list,是一个双向链表,一般可以做一些顺序存储,比如一些左进左出,左进右出非常灵活,
  • bit map,是一个二进制存储,可以做一些签到业务,它较于mysql可以节省很多空间
  • hyperlog log ,它会对重复的元素进行去重,非常适合做那个UV的一个统计
  • 布隆过滤器,有一个特点,它存在的时候不一定存在,它不存在的时候,它一定不存在

二、redis为什么是单线程的?单线程的还那么快?

  • 因为redis是基于内存的,所以说redis它本身就会很快,如果redis是单线程的话,反而会有一个线程的上下文切换的开销,降低效率,但是redis它处理网络IO是多线程的,所以redis虽然是单线程但依然很快

三、redis持久化机制?

一般配合使用,好处就是在redis进行重启的时候只要执行最后一个rdb文件和最后一段aof文件

  • rdb:优点:恢复速度快,占用空间小,但是会有丢失数据的风险
  • aof:记录所有的执行指令,优点它不会丢失数据,恢复速度较慢,严格上来说,它也有丢失数据的风险,先落缓存在去刷新磁盘,如果没有刷新磁盘,服务宕机了,这个时候会丢失部分数据

四、redis过期策略?

  • 直接删除,redis的所有数据结构,它都可以设置过期时间,时间一到就会自动删除,redis是单线程的,redis的收割时间也会占用处理时间,如果说收割的太过于频繁的话,会导致线上读写指令的卡顿,所以说,redis会将所有设置过期的key放入到字典表中,定时进行遍历,定期删除过期的key,默认redis每秒会遍历10次,不是全表扫描,是一个贪心算法,基于这种算法去遍历,
  • 同时也会采用惰性删除策略,当我们去查询这个key是否过期,过期了则删除

五、hashmap是否是线程安全的?

  • 非线程安全,在1.8扩容的时候,会产生一个循环链表,1.8以前是那个头插法,1.8以后采用尾插法来解决此问题,在多线程存值的时候,可能会出现一个值覆盖的问题,所以它并不是一个线程安全的
  • hashtable,concurrenthashMap,是线程安全的。hashtable锁力度比较粗,因为他这个synchoried的关键字是直接加载到方法上的,只能支持一个并发。而concurrenthashMap,1.7和1.8版本是不一样的,1.7的时候采用的是分段锁的思想,锁的是segment数组对象,segment数组他是有16个节点,可以最多支持16个并发。1.8以后取消了segment数组对象,直接锁的是数据的一个头节点,这个时候我们有多少个头节点就可以支持多少个并发,简单来说是优化了锁的力度,可以支持更高的并发。
posted @ 2024-04-21 21:40  牛奶配苦瓜  阅读(11)  评论(0)    收藏  举报