• Redis缓存优化


    在使用redis作为缓存时,为提供查询数据和效率,优化也是必不可少的。

    1.强化开发规范

    1)不使用bigkey:即key对应的value的值不能太大。对于String类型,value超过10KB即为bigkey;对于非字符串类型,其元素超过5000个即为bigkey。

    2)key命名优化:所有的key尽量以业务名为前缀,使用冒号分隔,但要保持简洁,同时不能包含特殊字符(空格,单引号,转义符,换行等)。示例

    product:stock:1001

     表示产品为1001的库存。

    2.设置过期时间

    比如商品数据,在创建时会根据商品ID存入到redis,当修改时也会同步更新到redis,那么在查询时先会根据商品ID去redis查询,若存在就直接返回,若不存在就从数据库查询后返回,与此同时会存入redis。因此也就提高了查询速度,降低了数据库的压力。但对于上千万的数据,全部都存如redis是不现实的。

    其实很简单,只需在加入缓存时,都设置一个过期时间,如24小时。这样一来,redis中的商品数据便是热点商品。另外,在查询时,若直接从缓存中获取,建议给其进行续期处理(再设置一次过期时间),避免后期在查询时因过期而从数据库查询。

    3.缓存击穿

    当大量的缓存在同一时刻失效或过期,压力会同时转向数据库,这种现象叫做缓存击穿。

    那么如何解决这种问题呢?分析其原因,在同一时刻失效,那么只要保证大量的数据不在同一时刻过期就可以了呗。因此,低于非精确的过期时间,在设置过期时间时,在设置固定时间外,在范围内再补充一个随机时间。

    如设置24个小时过期,则可设置30分钟内的一个随机时间过期。过期时间生成如下,仅供参考:

    Integer times = 24*60*60 + new Random().nextInt(30)*60;

    在允许范围内添加随机时间,可使得大量的key不在同一时刻失效,减轻访问数据库的压力

    4.缓存穿透

    指查询一个一定不存在的数据,由于缓存是不命中时需要从数据库查询,查不到数据则不写入缓存,导致这个不存在的数据每次请求都要到数据库去查询,进而给数据库带来压力。

    那么如何解决这种问题呢?既然是因为缓存中不存在商品信息进而转向数据库查询,那么就从根源开始,当第一次查询到数据库中不存在该商品时,将商品ID作为key,value为一个特定的值来标明是空数据(如isEmpty,当然也需要设置过期时间)。那么后续的请求在查询时,若查询到缓存中有数据,先判断是否是空数据(isEmpty),若是空数据则直接返回null或以实际场景未知进行无数据返回,若有数据则返回数据即可。

  • 相关阅读:
    阶乘
    资金账号,手机号等中间添加*(星号),脱敏
    对象深拷贝
    前端简易服务器
    Codeforces Round #603 (Div. 2) C. Everyone is a Winner! (数学)
    Codeforces Round #603 (Div. 2) B. PIN Codes
    Codeforces Round #603 (Div. 2) A. Sweet Problem(数学)
    Codeforces Round #605 (Div. 3) E. Nearest Opposite Parity(最短路)
    Codeforces Round #605 (Div. 3) D. Remove One Element(DP)
    Codeforces Round #605 (Div. 3) C. Yet Another Broken Keyboard
  • 原文地址:https://www.cnblogs.com/zys2019/p/16405387.html
Copyright © 2020-2023  润新知