缓存的弊端,你了解吗
现在大多数的分布式系统中,都会采用缓存。作为一大利器。对于用户来说,可能直观的就是这个网站用起来比较快,刷新比较流畅;用户反馈比较好。本质原因--就是因为快。
高并发,高性能
但是加入缓存中。肯定会有好处,也会有弊端。
先来谈谈他的好处吧。缓存现在作为系统中不可或缺的一部分,在于普通的验证码登录 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 就可以实现,但是没必要。
缓存的维护。是比较大的开销。如果我们在用的过程中。考虑定制化的需求。以及扩展的要求。我相信那会是更好的。
版权声明: 本文为 InfoQ 作者【卢卡多多】的原创文章。
原文链接:【http://xie.infoq.cn/article/aa23900b1c66d718b086be1ef】。文章转载请联系作者。
评论