学之,则难者亦易矣;

不学,则易者亦难矣 。

点个赞,别让我一个人看起来太过自恋。

说一下Redis的数据类型吧?

常用数据类型 String、list、set、hash、zset

其他数据类型 bitmap、hyperLogLog、geo

String:类型是我们平常用的最多的类型,经常用来缓存一个简单的值或者从数据库获取到的数据。 list:存储的值是有序地经常可以用作消息队列,可以直接在集合两端进行元素的插入和删除,也可以替换某个值 set:是一个无序的集合,会排除重复的数据,同一个key添加相同的数据会直接失败,set可以用作抽奖保证每个用户只能抽一次

hash:一个键值对的集合常用来存储对象

zset:是一个没有重复数据的集合,每个元素会有一个关联的分数值根据分数值将数据进行排序

常用数据类型我们都知道了,那 bitmap、hyperLogLog、geo 是干什么用的?

bitmap位图是由字符串String实现的,他是一个包含二进制位的字符串,并不是一个文本字符串 这种数据类型可以用来展示用户的在线状态 每个用户可以用一个位来表示是否在线 比如 0代表离线 1代表在线。 hyperLogLog是一种概率的数据结构常用于大规模数据基数估计,比如网站访问的ip数量。

ok 知道缓存穿透和缓存击穿吗,说一下你的理解

缓存穿透,就是缓存中不存在并且数据库里也没有的数据被持续请求,这样会导致我们的数据库压力过大,严重时会击垮数据库。缓存击穿的话就是大量的请求访问 一个热点的key 当这个key失效时会导致我们的数据库在一瞬间接收大量的请求,从而导致数据库垮掉。

接下来该问我怎么解决了吧 我直接预判

缓存穿透一般我们可以通过代码层判断解决或者将空的key存下来给个空的值,或者引入布隆过滤器 解决, 布隆过滤器是一种数据结构,可以很高效的查询一个元素是否在一个集合中,而不需要去查元素具体的值,它有高效的查询性能与存储性能,并且占用空间小。它的原理也很简单,就是利用多个hash函数将元素映射到一个位数组上并且将该位置设置为1,下次查询用同样的hash函数查找元素是否存在,可以有效解决缓存穿透的问题。

顺便说一下我准备过得缓存雪崩,尽量占用长的时间不让他问到我不擅长的领域,嘿嘿嘿

除了这两种问题外,还有一种缓存雪崩,这是在同一时间大面积的缓存失效,然后这时候又有大量的请求访问到数据库,会导致数据库压力过大。这种情况一般的解决方式是在编码期间尽量不要将key的过期时间设置一样,就可以有效避免这类问题。

不错不错,我看你的简历上写到项目中用到了redis,在项目中是怎么应用的呢

redis是基于内存存储的,所以比直接访问数据库要快很多,在我们的项目中应用的场景也很多,比如手机号登录客户端发送的验证码把验证码存到redis中设置过期时间,还有我们的活动积分排行用redis的数据zset实现,文章的点赞用redis限制在短时间内不能持续点赞取消,当然最常用的还是用redis存储热点数据比如首页的数据,用户登录后就要访问到。

redis的分布式锁怎么实现

redis的分布式锁主要使用redis数据结构中的setnx来实现,如果我们需要对某个资源加锁只需要setnx key value就可以了,通常我们会加一个过期时间防止机器宕机导致锁不会释放。

redis挂掉了数据怎么恢复

redis有两种持久化方式,一种是RDB一种是AOF,RDB是一种用快照的方式记录数据在一定时间间隔内将内存数据写入到磁盘中这种方式高效、占用空间小,但是可能会导致数据丢失,完整性不高,AOF是一种追加机制,它是将redis的命令记录下来,容错性比较好,可靠性高,数据完整性高,但是恢复的话相对比较慢。

了解redis的集群吗

懂一点,redis的集群是为了提高数据的容量以及高可用性,redis通过一致性hash算法将数据分散在不同的节点。集群中每一个节点负责一部分数据,并且会自动将主节点数据复制到从节点,保证数据的备份及故障转移,redis集群中有三个角色,一个是主节点,一个是从节点,还有一个普通节点,主节点负责数据的写操作,从节点通过复制主节点的数据来提供读的操作,并且也具备了故障转移的能力,普通节点的话可以作为主节点也可以作为从节点,当主节点出现问题时,会通过选举机制将从节点升为主节点从而保证数据的可用性和可靠性

redis的淘汰策略有哪些

redis有六种淘汰策略,Noeviction分别是无淘汰策略、Allkeys-LRU最近最少使用淘汰策略、Allkeys-LFU最不经常使用淘汰策略、Volatile-LRU过期时间最近最少使用淘汰策略、Volatile-LFU过期时间最不经常使用淘汰策略、Volatile-TTL过期时间淘汰策略

有没有遇到过redis的大key你是如何处理的

redis的大key指的是value值的大 根据数据类型不同对大key的定义不同,String类型值得是value值大于10kb左右的,对于集合类型值得是值超过6000的,大key可能会引起客户端反应变慢,因为redis是单线程的操作大key是比较耗时,会导致客户端阻塞,一般找大key可以使用bigkeys命令,注意操作时在从节点操作不要在主节点操作。

Redis的数据分片了解吗,在Redis集群中数据如何被分片及分片的策略有什么

redis有两种分片策略,首先redis通过一致性hash算法将数据分散到各个节点,这种方式相对于单个节点来说效率和扩展性都得到了提高,从而实现分布式存储和查询,如果有新的节点加入或失效不会影响其他节点,从而使我们的数据具有一定的弹性,对之后的横向扩展和负载均衡都有一定的好处。然后分片策略一种是hash槽分片,具体做法是将数据空间分为固定的hash槽,每个键通过hash函数映射到某个槽,另一种是一致性hash分片,在建立集群时通过一致性hash算法来分片数据,hash函数将键映射到一个环形空间,每个节点负责一个范围内的数据。

会有什么新的问题吗

当然会的,首先是数据一致性,某个节点发生故障时对数据的迁移复制会有一定的挑战性,然后是一致性hash算法可能会导致热点数据被分配到同一节点,这样的话压力就会很大,需要进行其他的策略比如数据再分片处理等

「可以啊,小伙子,回答的不错,那今天就先到这里,我该吃饭了」


最近业余在学习摄影,之后文章最后也会放一些图片,技术类文章都是比较枯燥的,在学习拍摄人像,兄弟们在这个行业应该很少见异性了,哈哈,无意冒犯。大家关注下公众号「CodeDancing」每周持续更新技术类文章中~

📷:拍摄于太阳刚到山顶的

什么Redis,别问了,我不会_java

📷:拍摄于太阳被山峰遮挡

什么Redis,别问了,我不会_java_02

这里有一些文章可能对你有www.yuque.com/liangliang-… 最后点赞关注,这个对我真的很重要

「白嫖也喜欢你」