缓存没用是真的吗?

216 阅读5分钟

本文已参与掘金创作者训练营第三期「话题写作」赛道,详情查看:掘力计划|创作者训练营第三期正在进行,「写」出个人影响力

今天我们来聊聊。关于缓存的那些事儿。

现在大多数的分布式系统中,都会采用缓存。作为一大利器。对于用户来说,可能直观的就是这个网站用起来比较快,刷新比较流畅;用户反馈比较好。本质原因--就是因为

高并发,高性能

但是加入缓存中。肯定会有好处,也会有弊端。

先来谈谈他的好处吧。缓存现在作为系统中不可或缺的一部分,在于普通的验证码登录token,

以及数据的暂存。查询数据的存储。对于特定需求。比如说点赞数、评论数、排名、等数字的需求。

我们举一个实例的场景。例如,我现在要做一个。购物系统类似于京东这种特别庞大的分布式系统。

用最简单的方式做出一个比较全面的购物车。你需要怎么做?

我可能有两种方法,第一种购物车的实际场景中。主要要点。有以下几种。

购物车中的商品。排列是不能重复的。但是数量可以增加。也就是说他有一个标准的spu;

又要考虑。购物车中需求商品比较大。而且查询。以及添加的速度。比较迅速,我们可以选用linkedHashmap,LinkHashSet;

主要说的就是第二种。用redis的数据结构。就可以。简单的完成一个购物车的主要功能。

Redis现在的数据结构。有很多是特殊的。而且经过有原则性的命令操作。可以更好地发挥出缓存的高性能。对于查询和访问来说,这是莫大的能力。

  • REDIS6.0.8是目前最稳定的版本 ,缓存中需要可以将业务直接选在,我们需要的过程中\

    • 一、Redis(九大数据类型)\

      • 1.基础数据类型(现在都有公司直接SSR)\

        • String\

          • 命令实战\
          • 1.常用的取值,赋值\

            • set key value\
            • get key\
          • 2.同时设置多个key,value的键值对值\

            • mset k1 v1 k2 v2 k3 v3\
            • mget k1 k2 k3\
          • 3.数值增减\

            • 递增数字(评论,点赞)\

              • INCR key\
            • 增加指定的整数(每次增加整数1,最常用的就是点赞数)\

              • INCRBY key increment\
            • 递减数字(评论,点赞)\

              • DECR key\
            • 减少指定的整数(每次增加整数1,最常用的就是点赞数)\

              • IDECRBY key decrement\
          • 3.获取字符串长度\

            • STRLEN KEY\
          • 4.分布式锁\

            • setnx key value(存在锁不创建了,如果没有就创建)\
            • set key value [ EX SECONDS] [PX SECONDS] [NX|XX]
              EX: KEY在多少秒之后过期
              PX: KEY在多少毫秒之后过期
              NX: 当key不存在的时候,创建key,效果等同于 setnx
              XX: 当key存在时,覆盖key
              ​\

              • 实例: set lock pay ex 10 NX (10秒之后就会创建或者覆盖)\
          • 5.String应用场景\

            • 场景1:用户喜欢的商品,歌曲,饭菜,文章,点赞,踩一下\

              • INCR orderCode increment (给商品,订单编号加1)\
              • 喜欢的文章,阅读数都是INCR命令生成\
        • list\

          • list数据类型,\
        • hash\

          • Redis的hash,在Java相对应的是Map<String,MAP<object,object>>\
          • 命令实战:\

            • 1.一次设置一个字段值\

              • HSET key field value\
              • HGET key field\
            • 2.一次设置多个字段值(hmset lucas id 1 name lucas score 99)\

              • HMSET key field value [field value]\
              • HMGET key field [filed....]\
            • 3.获取所有的字段值 (遍历)(hgetall lucas)\

              • hgetall key\
            • 4.删除某个key内的全部数量\

              • heln\
            • 5.删除一个key\

              • hdel\
            • 6.应用场景\

              • 1.购物车Redis的hash,促销那种,早起可以使用\
              • 购物车中 projectID ,incr number increment(产品数量),最后集中全选,就是hgetall 用户ID /名称\

                • 表示自己名下的所有产品ID 和数量\
                • 对于购物车的实际操作\

                  • 1.新增Lucas用户下的产品,放入购物车\

                    • hset shopcar lucas 10086 3 110110 4\
                    • hest 购物车 用户ID 商品ID 商品数量\
                  • 2.对于当前产品的,点击新增,或者是点击减少\

                    • hincrby shopcar lucas 商品ID 1
                      表示当前可以增加一个点击数量
                  • 3.商品总数(当前用户下,购物车数量)\

                    • hlen shopcar Lucas\
                  • 4.全部选择(清空购物车开始使用)\

                    • hgetall shopcar lucas\
                    • 获取在此名称下的所有数据\
        • set\
        • zest\
    • 2.新增的数据类型\

      • bitMaps 位图\
      • hyperloglogs\
      • geospatial(地理空间)\
      • Stream\

缓存的弊端:

既然他有很多的好处,用来支持系统的可用性。

其中也有很多。我们需要解决的问题,第一个就是热点数据的失效问题?

  • 缓存穿透。
  • 缓存雪崩。
  • 缓存击穿。

如果说缓存在服务过程中突然宕机。其中的持久化操作。也是必要的,你需要具体的配置,根据业务。去盯着话的分析。

  • 定制化的确定缓存的淘汰策略。

举一个最简单的例子,如果说我现在需要一个唯一的id作为我数据表中主键 其实用redis就可以实现,但是没必要。

缓存的维护。是比较大的开销。如果我们在用的过程中。考虑定制化的需求。以及扩展的要求。我相信那会是更好的。