自创Redis防穿透防击穿方式--双key绑定详解

一、缓存设计理念

目前所有key采用双key绑定模式

【自创】新的redis缓存使用方式。该使用方式也参考了angularJs双key绑定实时更新数据模式、也可等同于db的映射模式。

二、redis缓存防止缓存穿透的普遍性难题

1、目前市场上已知的解决方式有

(1)布隆过滤器模式

    代码繁琐、适合大量key进行节约缓存空间,非透明化、不适用于当前项目中量数据

(2)edis对key的频率控制

   该做法无异于剥夺了redis的高并发属性,假如控制redis对key访问频率一万qps,访问数据库直接挂掉,假如控制不能直接挂掉数据库,访问频率必然不大,无参考意义

(3)采用java二次缓存方式

     该类做法适用于单机项目,假如redis缓存1G、到时候每次部署每台服务器占用内存就最少要1G,不适用于分布式集群项目

(4)设置默认值

     设置默认值方式在业务代码中处理,过于繁琐

(5)更改序列化方式

    此类方式弊端是与序列化方式相互依赖,缓存穿透问题应该是与序列化方式关系脱离,限制了序列化方式的自由选择

**网易的做法,是所有的key全都预先设置默认值,猜测是游戏领域,有点是保证高并发的安全性、缺点体现在维护key的预处理阶段及内存的合理利用方面

2、该做法的优点

(1)缓存代价可接受

     双key绑定适用于总缓存代价在可接受范围内,多出的缓存空间为key=空字符串产生的空间,假如一个key空间=10b,1M便可以存放10w个冗余key,1G可以存放1亿个冗余key

(2)失效key的透明化

     哪些key绝对不可能存在穿透,可直接查询出来

(3)实现简单

     直接在业务层多写一个key

(4)替换简单

     采用新的bind类,可随时去掉或替换其他方式

3、 该做法不足的地方

目前只适用于中型应用,不适合大量key键、或者数十万并发的大型应用

三、redis缓存好处

(1)快速响应

Redis 响应非常快,每秒可以执行大约 110 000 个写入操作,或者 81 000 个读操作,其速度远超数据库。如果存入一些常用的数据,就能有效提高系统的性能。

(2)支持 6 种数据类型

它们是字符串、哈希结构、列表、集合、可排序集合和基数。比如对于字符串可以存入一些 Java 基础数据类型,哈希可以存储对象,列表可以存储 List 对象等。这使得在应用中很容易根据自己的需要选择存储的数据类型,方便开发。

对于 Redis 而言,虽然只有 6 种数据类型,但是有两大好处:一方面可以满足存储各种数据结构体的需要;另外一方面数据类型少,使得规则就少,需要的判断和逻辑就少,这样读/写的速度就更快。

(3)操作都是原子的

所有 Redis 的操作都是原子的,从而确保当两个客户同时访问 Redis 服务器时,得到的是更新后的值(最新值)。在需要高并发的场合可以考虑使用 Redis 的事务,处理一些需要锁的业务。

(4)MultiUtility 工具

Redis 可以在如缓存、消息传递队列中使用(Redis 支持“发布+订阅”的消息模式),在应用程序如 Web 应用程序会话、网站页面点击数等任何短暂的数据中使用。

四、基础使用

基础操作 和日常使用redis一样,底层使用redisson插件。

为了防止技术会随着时间迭代,从而导致要大幅度更改我们项目的框架。 项目中对redisson sdk的使用,做了封装,使用【RedisUtils】类进行使用

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

无限架构

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值