linux怎么查看本机内存大小
291
2022-10-05
redis缓存篇
redis的安装与使用 -Mac
cd 你的安装目录下bin文件夹中
redis-server #启动redis-server
测试连接 bin/
redis-cli
缓存击穿
访问某个非常热的数据 缓存不存在 导致大量的请求发送到数据库 数据库压力暴增缓存击穿经常发生在某个过热数据过期的时候
解决办法:方法一: 既然缓存击穿发生在热点数据过期,那么我们不让缓存失效不就好了 每次查询缓存的时候不使用Exists判断key是否存在,而是使用Expire给缓存续期,返回Expire返回结果判断key是否存在 热点数据通过不断续期就不会过期
方法二: 通过singleflight控制 singleflight的原理是当同时有很多请求同时到来时,最终只有一个请求会最终访问到资源,其他请求都会等待结果然后返回
func (l *ProductLogic) Product(in *product.ProductItemRequest) (*product.ProductItem, error) { v, err, _ := l.svcCtx.SingleGroup.Do(fmt.Sprintf("product:%d", in.ProductId), func() (interface{}, error) { return l.svcCtx.ProductModel.FindOne(l.ctx, in.ProductId) }) if err != nil { return nil, err } p := v.(*model.Product) return &product.ProductItem{ ProductId: p.Id, Name: p.Name, }, nil }
缓存穿透
访问的数据既不在缓存中也不在数据库中,导致访问缓存的时候,发生缓存缺失,再访问数据库时发生数据库没有访问的数据,那么没有办法从数据库读数据写入缓存等后续请求,类似请求多的话会给缓存和数据库带来巨大压力
解决办法: 缓存一个空值 避免每次透传到数据库,缓存的时间可以设置短一点,比如一分钟
缓存雪崩
大量的请求无法在redis缓存中进行处理,接着大量的请求发送到数据库,数据库直接整挂了
原因一: 缓存中大量的数据同时过期 导致大量的请求无法得到正常处理解决办法:要避免大量的数据设置相同的过期时间,如果业务上的确有要求数据要同时失效,那么可以在过期时间上加一个较小的随机数,这样不同的数据过期时间不同,但差别也不大,避免大量数据同时过期,也基本能满足业务的需求。
原因二: Redis出现宕机 无法正常响应请求 导致大量请求直接打到数据库 解决办法:针对这类原因一般我们需要让我们的数据库支持熔断,让数据库压力比较大的时候就触发熔断,丢弃掉部分请求,当然熔断是对业务有损的
//数据库熔断处理 func (db *commonSqlConn) ExecCtx(ctx context.Context, q string, args ...interface{}) ( result sql.Result, err error) { ctx, span := startSpan(ctx, "Exec") defer func() { endSpan(span, err) }() err = db.brk.DoWithAcceptable(func() error { var conn *sql.DB conn, err = db.connProv() if err != nil { db.onError(err) return err } result, err = exec(ctx, conn, q, args...) return err }, db.acceptable) return }
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~