1.介绍一下你写的这个项目
我做的这个项目是一个仿大众点评的评价类项目,实现了优惠券秒杀,好友关注,点赞评论,查看附近娱乐场所等功能
2.在这个项目中你实现了哪些功能
优惠券秒杀:目录9的秒杀业务
好友关注,点赞评论:目录12
查看附近娱乐场所:使用Redis中GEO数据类型实现。将所有的商铺信息按照商铺类型在Redis中建立对应的数据然后进行查询即可。
3.为什么要用redis替代session实现登录注册功能,有什么好处?
因为session的数据是存储在服务器端的,当服务器中数据量很大的时候可能导致服务器内存不足。而Redis是基于内存的读写速度非常快和Session类似。
4.如何解决集群的session共享问题?
在分布式系统下每一个服务器的Session数据是独立的,用户在不同服务器之间切换的时候可能因为session不共享问题而需要反复登录。然而使用Redis则保证多个服务器访问的是同一个Redis就实现了数据的共享。此外Redis集群内部的数据一致性机制也很棒
5.如何解决了缓存穿透、缓存击穿和缓存雪崩问题?
缓存穿透是什么:
缓存穿透是指查询一个缓存和数据库里都没有的数据,每次查询都透过缓存直接查询数据库,最后返回空。当用户使用这条不存在的数据疯狂发起查询请求的时候就会给数据库造成了很大的压力,数据库可能挂掉
缓存穿透解决方法:
1.给这个数据设置一个空对象放在缓存中,并给这个空对象设置一个过期时间。
缺点:(1)需要缓存层给这些空对象划分存储空间,当这些空对象过多时就很浪费存储空间。
(2) 即使给这些空对象设置了一个很短的过期时间,还是会导致这一段时间内数据库和缓存中存储的数据不一致
2.使用布隆过滤器(一种数据结构)
布隆过滤器是一种数据结构用于快速检查一个元素是否属于某个集合中。它可以快速判断一个元素是否在一个大型集合中,且判断速度很快且不占用太多内存空间。
布隆过滤器原理:
布隆过滤器的主要原理是使用一组哈希函数,将元素映射成一组位数组中的索引位置。当要检查一个元素是否在集合中时,将该元素进行哈希处理(使用哈希函数计算出3个值,这3个值即索引),然后查看哈希值(索引)对应的位数组的值是否为1。如果哈希值对应的位数组的值都为1,那么这个元素可能在集合中,否则这个元素肯定不在集合中。
例子:
比如我们一共有3个key,我们对这3个key分别进行3次hash运算,key1经过三次hash运算后的结果分别为2/6/10,那么就把布隆过滤器中下标为2/6/10的元素值更新为1,然后再分别对key2和key3做同样操作,结果如下图:
这样,当客户端查询时,也对查询的key做3次hash运算得到3个位置,然后看布隆过滤器中对应位置元素的值是否为1,如果所有对应位置元素的值都为1,就证明key在库中存在,则继续向下查询;如果3个位置中有任意一个位置的值不为1,那么就证明key在库中不存在,直接返回客户端空即可。如下图:
当客户端查询key4时,key4的3次hash运算中,有一个位置8的值为0,就说明key4在库中不存在,直接返回客户端空即可。
所以,布隆过滤器就相当于一个位于客户端与缓存层中间的拦截器一样,负责判断key是否在集合中存在。如下图:
使用布隆过滤器的好处:
布隆过滤器的好处就是解决了第一种缓存空值的不足,但布隆过滤器也存在缺陷,首先,它有误判的可能,比如在上面客户端查询key4的图中,假如key4经过3次hash运算得到的位置分别是2/4/6,由于这3个位置的值都是1,所以,布隆过滤器就认为key4在库中存在,进而继续向下查询了。所以,布隆过滤器判断存在的key实际上可能是不存在的,但布隆过滤器判断不存在的key是一定不存在的。它的第二个缺点就是删除元素比较难,比如现在要删除key2这个元素,那么需要将2/7/11三个位置的元素值改为0,但这样就会影响到key1和key3的判断。
布隆过滤器优缺点:
布隆过滤器的优点包括:
1.时间和空间效率高:布隆过滤器的时间复杂度和空间复杂度都是O(k),其中k为哈希函数的数量。因此,它可以在较小的空间内快速判断某个元素是否在集合中。
2.误判率低:布隆过滤器虽然可能出现误判,但是误判率可以通过调整哈希函数数量和位数组大小来控制,可以根据实际需求进行调整。
3.支持高并发:布隆过滤器支持并发查询和添加数据,可以在多线程环境下使用。
4.易于实现:布隆过滤器的实现比较简单,只需要实现几个哈希函数和一个位数组即可。
布隆过滤器的缺点包括:
1.无法删除已添加的数据:由于布隆过滤器的哈希函数不具有逆向性,所以无法删除已添加的数据。
2.误判率无法避免:由于布隆过滤器的设计原理,误判率无法避免。当哈希函数的数量不足或位数组的大小不够时,误判率可能会很高。
3.无法精确判断元素是否存在:由于布隆过滤器的设计原理,无法精确判断某个元素是否在集合中,只能判断它可能存在或一定不存在。
减少布隆过滤器的误判:
布隆过滤器的误判率是根据哈希函数的数量和位数组大小来确定的。如果哈希函数的数量太少或者位数组太小,那么误判率会增加。反之,如果哈希函数的数量太多或者位数组太大,那么可能会导致空间浪费和查询效率降低。因此,在实际使用中,需要根据具体的应用场景来确定哈希函数数量和位数组大小,以达到误判率和空间利用率的平衡。
1.使用多个布隆过滤器:将同一个元素添加到多个布隆过滤器中,查询时需要在所有布隆过滤器中查询。这种方法可以显著降低误判率,但是会增加存储空间和查询时间。
2.使用加密哈希函数:加密哈希函数可以使哈希值更难以预测,从而减少哈希冲突的概率。常见的加密哈希函数包括MD5、SHA-1等。
3.使用高质量的哈希函数:使用高质量的哈希函数可以减少哈希冲突的概率。常见的高质量哈希函数包括MurmurHash、CityHash等。
4.对于数据量较小的情况,可以使用简单的线性查找代替布隆过滤器,这样可以避免误判率过高的问题。
需要注意的是,误判率是布隆过滤器的本质限制,无法完全避免。因此,在使用布隆过滤器时,需要根据实际需求来平衡误判率和空间利用率,同时采用多个布隆过滤器、使用高质量的哈希函数等方法来尽量减少误判率。
缓存击穿是什么:
缓存击穿是指当缓存中某个热点数据过期了,在该热点数据重新载入缓存之前,有大