初级JAVA程序员应该掌握的Redis知识(超详细面试点整理)

为什么要学习Redis?

Mysql是一种关系型数据库,由于其速度快和稳定性强等诸多优点被许多公司青睐。Redis是一种内存型数据库,可以显著的提升数据访问速度,当物理内存够用的时候,Redis的速度要快于MySQL。因此大多数公司目前都会采用MySQL数据库(主)+Redis(辅)的数据存储方式,所以说不定就用到了,从实用的角度看掌握Redis的知识比较重要,从面试的角度来看,Redis的知识点考察频率也是相对较高的,因此学习Redis的知识就更加重要了。

Redis的应用场景是?

Redis可以做缓存,使查询效果更快。
Redis可以做队列,虽然效果不如Kafka。
Redis可以做分布式锁,用于商品秒杀等需求。
Redis可以用来做限流,识别缛羊毛用户等等。
Redis可以用来做排行榜,大数据处理…

Redis有哪些功能?

缓存/持久化/哨兵和复制/集群/Lua脚本/管道/事务/分布式锁

Redis的优缺点?

优点

性能高/数据类型丰富/操作都是原子性的/补偿了mamcached的不足/简单…

缺点

由于物理内存原因,局限于较小数量级的操作运算

Redis的Tips

1.list,set,hash,zset这四种数据结构共享规则:create if not exit & drop if no elements
2.Redis的所有数据结构都可以设置过期时间,Redis的过期是以对象为单位的,例如hash结构的过期是整个hash对象的过期

分布式锁及Redis的分布式锁

为什么需要分布式锁?

当我们在使用多线程的时候,我们需要对一些共同访问的资源加锁。它可以保证在单个JVM时候的数据安全。
当遇到分布式系统,考虑到多个JVM的时候,此时也需要类似的锁,来保证数据的安全,这个时候用到的锁就是分布式锁。

分布式锁有哪些?

基于数据库实现/Zookeeper实现/Redis实现/

分布式锁有哪些特点?

1.互斥性,任意时间只能有一个客户端获得锁。
2.有可能出现死锁,如果获得锁的客户端挂掉的话,会出现锁不归还的情况,这种情况叫死锁,如果不想办法避免这个问题,其他客户端就没办法拿到这个锁。因此需要锁超时,防止死锁。
3.容错性,集群中(一堆电脑)挂掉一部分节点(部分电脑),不影响还存活的节点获得或者释放锁。
4.可重入性,同一节点的同一线程在锁未过期之前可以再次获得锁并更新过期时间。

Redis的分布式锁如何实现?

1.使用Lua脚本(setnx+expire)
2.或者使用Redlock算法

Redis的一些关键知识?

Redis的基本用法?

set/get命令:设置数据、获取数据;
del命令:删除数据
Redis的使用看起来很像具有封装好的方法的集合/数组

Redis的数据结构?

图片来自网络,总结的很好~
在这里插入图片描述

Redis的底层实现?

Redis的底层是实用的C语言,Redis使用的数据结构是
SDS(语法是C语言的结构体):
struct sds {
int len;
int free;
char buf[];
}
使用SDS的好处是获取字符串长度的时间复杂度为O(1),因为可以直接通过len字段得到长度,而不用通过遍历字符串得到啦;此外,因为有free字段,所以不会造成缓冲区溢出;然后,可以直接用C语言封装的库函数对字符串进行处理。所以底层也是有玄机的!

Redis的内存淘汰策略?

Redis有几种内存淘汰策略,可以把这个策略理解成一个当内存不够用的时候淘汰数据的算法(函数),默认策略是noeviction,即直接报错,还有使用LRU算法的allkeys-lru,优先把最近没有用到的数据删掉,此外还有一些策略,按需学习。

Redis的常见面试题?

如果要改成用hash结构来缓存用户信息,如何封装比较合适?

这个会了,Redis的常用命令差不多就熟悉了。

Redis的操作是原子性的吗,为什么?

Redis的操作当然是原子性的啦,因为Redis是单线程的!

单线程的Redis为什么这么快?

因为数据都在内存中!在内存中效率当然是最高的!

Redis为什么又使用多线程了?

一定要明确一个观点:Redis无论使用单线程还是多线程,都是为了更高效率的处理问题。就像微信支持改名一样,多线程也只是业务的需要。

未完待续

等到后面准备面试的时候我再多写几个吧。

猜你喜欢

转载自blog.csdn.net/qq_32648593/article/details/106470872