黑马点评
参考文章:
图解Redis介绍 | 小林coding (xiaolincoding.com)
介绍一下你写的这个项目
我做的这个项目是一个以用户点评和商户信息为主的生活服务平台,实现了商户点评、优惠券秒杀、好友关注和粉丝关注博主后,主动推送博主的相关评价等多个模块;用户可以浏览首页的推荐内容,搜索附近商家, 查看商家的详情和评价以及发表探店评价。
在这个项目中你实现了哪些功能
登录注册,缓存一致性问题,缓存穿透、缓存击穿问题的落地解决,商品库存超卖问题,使用Redisson分布式锁解决了一人一单问题。接口手工测试,秒杀接口进行压力测试等功能
为什么要用redis替代session实现登录注册功能,有什么好处?
session的数据是存储于服务器端的,服务端的数据量非常大的时候,就容易造成内存不足
redis是基于内存的高性能数据库,他的读写速率非常快和session相似
如何解决集群的session共享问题?
用redis替代session实现登录注册功能啊,分布式系统下每一个服务器的session都是独立的,就是说你切换到其他服务器,比如你要切换到发布帖子,查看评论什么的,再次调回来登录界面又要重新登录了,多次重复登录多麻烦啊,这得使用redis可以保证多个服务器访问的是同一个redis,则保证了不会再重复登录了,实现了数据的共享;此外redis集群内部的数据一致性也很棒
好了,上面的大部分都是参考文章写的,下面的都是我自己在看完图解Redis介绍之后按照自己的思路总结的哈哈哈。
如何解决了缓存穿透、缓存击穿和缓存雪崩问题?
一,缓存穿透是什么:
表示缓存和数据库里面根没有用户想要请求的数据,但是大量用户还是要来缓存和数 据库里请求,给数据库带来巨大的压力,数据库可能会挂掉
解决方法:
给这个数据一个空对象放在缓存中,并给这个空对象设置一个过期时间
但是这样干也是有缺点的,什么缺点呢,就是需要给这么多空对象换份存储空间吧,过多也是很占内存,即使给这些空对象设置了一个很短的过期时间,还会导致这一段时间内数据库和缓存中数据库数据不一样
要么就是使用布隆过滤器:一种数据结构用来快速判断用户请求的数据是否属于某个集合中,判断速度很快的不会占用多少内存
二,缓存击穿是什么:
就是类似于秒杀这些数据,属于热点数据,大量用户又热衷于这个数据就会来缓存里请求,但是该热点数据都没了,所以他们就会直接去数据库请求,会给数据库造成巨大压力
解决方案:
设置key永不过期,针对性解决问题嘛,要么就是正常给key设置过期时间,后台同时启动一个定时任务去定时更新这个缓存
要么使用互斥锁保证同一时刻只能有一个查询请同一时刻只能有一求加载热点数据到缓存中,(意思就是,使用加锁的方式,锁定的对象key,然后大量用户同时来请求同一个数据,只能有一个请求能获得锁,他带着锁去数据库与读取这个数据,然后写入缓存中,然后释放锁;好,其他正在等着请求这个数据的依次来,因为现在缓存中有了数据,就不会直接跑到数据库里面请求了,从缓存中请求到数据返回)
三,缓存雪崩是什么:
当redis缓存里面的大量数据都是在同一时间过期失效的,同时大量用户来缓存里面请求数据请求不到,就会直接去数据库里面请求数据,会给数据库带来巨大的压力,容易系统奔溃
缓存雪崩解决方案:
1 打散缓存数据的过期时间:这样就不会同时过期失效了
2 数据预热
乐观锁和悲观锁是什么?是用来干什么的?(超卖问题)
乐观锁比较乐观,他认为别人不会同时修改数据,乐观锁就不上锁了,只有在发现别人修改了数据,就放弃执行数据,不再执行操作了
悲观锁比较悲观,他认为别人会同时修改数据,悲观锁就在执行数据的时候加上锁,只有在执行完数据之后,才释放锁,像syn,lock这些就是悲观锁的代表
超卖问题的产生:
超卖的意思就是说明明库存已经没有了,但是居然海卖出去了,比卖出去-1件东西
解决方案:
悲观锁是行不通的了,他会导致秒杀业务变成串行执行严重降低并发性(想想MySQL事务隔离级别解决方案里的串行化就知道了)
得用乐观锁:在更新库存的时候判断一下 是否和查询库存的时候的结果一样,如果一样,说明数据没有被修改