本文已参与掘金创作者训练营第三期「话题写作」赛道,详情查看:掘力计划|创作者训练营第三期正在进行,「写」出个人影响力。
今天我们来聊聊。关于缓存的那些事儿。
现在大多数的分布式系统中,都会采用缓存。作为一大利器。对于用户来说,可能直观的就是这个网站用起来比较快,刷新比较流畅;用户反馈比较好。本质原因--就是因为快。
高并发,高性能
但是加入缓存中。肯定会有好处,也会有弊端。
先来谈谈他的好处吧。缓存现在作为系统中不可或缺的一部分,在于普通的验证码登录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
表示当前可以增加一个点击数量
- hincrby shopcar lucas 商品ID 1
-
3.商品总数(当前用户下,购物车数量)\
- hlen shopcar Lucas\
-
4.全部选择(清空购物车开始使用)\
- hgetall shopcar lucas\
- 获取在此名称下的所有数据\
-
-
- set\
- zest\
-
-
-
2.新增的数据类型\
- bitMaps 位图\
- hyperloglogs\
- geospatial(地理空间)\
- Stream\
-
缓存的弊端:
既然他有很多的好处,用来支持系统的可用性。
其中也有很多。我们需要解决的问题,第一个就是热点数据的失效问题?
- 缓存穿透。
- 缓存雪崩。
- 缓存击穿。
如果说缓存在服务过程中突然宕机。其中的持久化操作。也是必要的,你需要具体的配置,根据业务。去盯着话的分析。
- 定制化的确定缓存的淘汰策略。
举一个最简单的例子,如果说我现在需要一个唯一的id作为我数据表中主键 其实用redis就可以实现,但是没必要。
缓存的维护。是比较大的开销。如果我们在用的过程中。考虑定制化的需求。以及扩展的要求。我相信那会是更好的。