一、缓存设计理念
目前所有key采用双key绑定模式
【自创】新的redis缓存使用方式。该使用方式也参考了angularJs双key绑定实时更新数据模式、也可等同于db的映射模式。
二、redis缓存防止缓存穿透的普遍性难题
1、目前市场上已知的解决方式有
(1)布隆过滤器模式
代码繁琐、适合大量key进行节约缓存空间,非透明化、不适用于当前项目中量数据
1
(2)edis对key的频率控制
该做法无异于剥夺了redis的高并发属性,假如控制redis对key访问频率一万qps,访问数据库直接挂掉,假如控制不能直接挂掉数据库,访问频率必然不大,无参考意义
1
(3)采用java二次缓存方式
该类做法适用于单机项目,假如redis缓存1G、到时候每次部署每台服务器占用内存就最少要1G,不适用于分布式集群项目
1
(4)设置默认值
设置默认值方式在业务代码中处理,过于繁琐
1
(5)更改序列化方式
此类方式弊端是与序列化方式相互依赖,缓存穿透问题应该是与序列化方式关系脱离,限制了序列化方式的自由选择
1
**网易的做法,是所有的key全都预先设置默认值,猜测是游戏领域,有点是保证高并发的安全性、缺点体现在维护key的预处理阶段及内存的合理利用方面
2、该做法的优点
(1)缓存代价可接受
双key绑定适用于总缓存代价在可接受范围内,多出的缓存空间为key=空字符串产生的空间,假如一个key空间=10b,1M便可以存放10w个冗余key,1G可以存放1亿个冗余key
1
(2)失效key的透明化
哪些key绝对不可能存在穿透,可直接查询出来
1
(3)实现简单
直接在业务层多写一个key
1
(4)替换简单
采用新的bind类,可随时去掉或替换其他方式
1
3、 该做法不足的地方
目前只适用于中型应用,不适合大量key键、或者数十万并发的大型应用
1
三、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】类进行使用