在项目中使用redis做缓存的一些思路


Posted in Redis onSeptember 14, 2021

在项目中redis做缓存的一些思路

首先,缓存的对象有三种

1、数据库中单条的的数据(以表名跟id作为key永久保存到redis),在有更新的地方都要更新缓存(不适用于需要经常更新的数据);

2、对于一些不分页,不需要实时(需要多表查询)的列表,我们可以将列表结果缓存到redis中,设定一定缓存时间作为该数据的存活时间。用获取该列表的方法名作为key,列表结果为value;这种情况只试用于不经常更新且不需要实时的情况下。

3、不需要实时的,需要分页的列表:可以把分页的结果列表放到一个map(key为分页标识,value为分页结果)中,然后将该map存到redis的list中(用该方法名为key)。然后给该list设置一个缓存存活时间(用expire)。这样通过方法名lrange出来就能获取存有分页列表的数据,遍历该list,通过遍历list中map的key判断该分页数据是否在缓存内,是则返回,不存在则rpush进去。这种做法能解决比如1-5页的数据已经重新加载,而6-10页的数据依然是缓存的数据而导致脏数据的情况。

本人走过的一些弯路

1、对于数据缓存不是所有东西都缓存到redis就是好的,而是要针对一些改动不大或者访问率大的数据进行缓存来减少关系型数据库的压力。

2、不要试图在拦截器或者过滤器中判断是否有缓存的存在,因为每个请求(不管该请求对应的方法是否做了缓存)它都会去redis中请求数据并判断,这样会浪费一定的内存资源跟响应时间。所以应该针对需要缓存的方法进行判断。

3、一个方法中使用多个get或者set的方法,我们需要尽可能的减少去jedispool中获取jedis对象,所以在一个方法中应该只获取一次jedis对象,在方法结束的时候把该对象return还给连接池,这样才能做到尽可能的高效。

4、在设置连接池中参数的时候要考虑到自身系统需求,不然会经常出现连接池中无可用对象获取,spring时不时发起连接请求到redis等不必要的错误和资源浪费。

为什么没用Redis做缓存

都知道用Redis作缓存非常的快,但事实上有些时候我们并没有使用Redis来做缓存,而是采用本地缓存的方式。就比如我所接触的一个项目,就没有采用Redis作缓存,而是使用谷歌工具包中的Table来作的缓存。

这个Table其实就是一个数据结构,你可以把它当做Map来看待。现在我们来画两幅图,分别是使用Table做缓存和使用Redid做缓存的两种情况

使用Table作本地缓存

在项目中使用redis做缓存的一些思路

使用Redis作缓存

在项目中使用redis做缓存的一些思路

公司采用本地缓存的方式,那么为什么没有采用Redis呢

让我们来思考一下下面几个问题

1、访问本地服务缓存快还是远程服务Redis快?

毫无疑问是访问本地服务的缓存要更快一些,Redis毕竟是在远程服务上。假设我们访问本地服务缓存的延迟为50ms,那么访问远程Redis的验证可能会达到58ms。这是使用本地缓存服务的优势所在

2、Reids事务

在Redis中,虽然Redis的操作都能够保证原子性,但是Redis中的事务不能够保证原子性。比如说A用户想B用户转账,怎么保证它的事务呢

3、Redis会多一次IO

尽管Redis数据存放在内存上,但Redis持久化操作还是会将数据写在磁盘上,IO操作会增加耗时。而本地缓存使用的只是一个数据结构来存储数据,不存在IO

那么使用本地缓存的问题是什么呢?

比如说A用户的数据存放在exchange1节点上,而B用户的数据存放在exchange2节点上。现在A用户想向B用户转账,那么就会比较麻烦,要做一些其他的操作,这是使用本地缓存的一个很大的弊端

什么时候使用Redis?

由于公司的项目是一个证券交易所,对延迟的要求比较高,想尽可能的做到低延迟,所以最终舍弃使用Redis。对于一些不太注重延迟的项目,使用Redis做缓存是非常不错的

以上为个人经验,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Redis 相关文章推荐
redis通过6379端口无法连接服务器(redis-server.exe闪退)
May 08 Redis
基于Redis过期事件实现订单超时取消
May 08 Redis
详解Redis主从复制实践
May 19 Redis
详解Redis瘦身指南
May 26 Redis
Windows下redis下载、redis安装及使用教程
Jun 02 Redis
Redis 哨兵集群的实现
Jun 18 Redis
浅析Redis Sentinel 与 Redis Cluster
Jun 24 Redis
Jedis操作Redis实现模拟验证码发送功能
Sep 25 Redis
关于使用Redisson订阅数问题
Jan 18 Redis
聊聊redis-dump工具安装问题
Jan 18 Redis
Redis命令处理过程源码解析
Feb 12 Redis
Redis特殊数据类型Geospatial地理空间
Jun 01 Redis
Redis RDB技术底层原理详解
Sep 04 #Redis
使用redis实现延迟通知功能(Redis过期键通知)
Redis集群新增、删除节点以及动态增加内存的方法
Sep 04 #Redis
Redis字典实现、Hash键冲突及渐进式rehash详解
Sep 04 #Redis
基于Redis的List实现特价商品列表功能
Aug 30 #Redis
Redis 常见使用场景
Aug 30 #Redis
Redis入门教程详解
You might like
PHP json_decode函数详细解析
2014/02/17 PHP
PHP 闭包详解及实例代码
2016/09/28 PHP
php脚本守护进程原理与实现方法详解
2017/07/20 PHP
Laravel框架自定义验证过程实例分析
2019/02/01 PHP
javascript 简练的几个函数
2009/08/29 Javascript
Javascript开发之三数组对象实例介绍
2012/11/12 Javascript
关于scrollLeft,scrollTop的浏览器兼容性测试
2013/03/19 Javascript
JS阻止事件冒泡行为和闭包的方法
2016/06/16 Javascript
JavaScript获取服务器端时间的方法
2016/11/29 Javascript
AngularJS的Filter的示例详解
2017/03/07 Javascript
JavaScript实现跟随滚动缓冲运动广告框
2017/07/15 Javascript
vue封装第三方插件并发布到npm的方法
2017/09/25 Javascript
对VUE中的对象添加属性
2018/09/18 Javascript
Vue批量图片显示时遇到的路径被解析问题
2019/03/28 Javascript
vue图片加载失败时用默认图片替换的方法
2019/08/29 Javascript
layui监听工具栏的实例(操作列表按钮)
2019/09/10 Javascript
JS实现页面鼠标点击出现图片特效
2020/08/19 Javascript
python创建关联数组(字典)的方法
2015/05/04 Python
numpy判断数值类型、过滤出数值型数据的方法
2018/06/09 Python
Django框架使用内置方法实现登录功能详解
2019/06/12 Python
Python 字符串类型列表转换成真正列表类型过程解析
2019/08/26 Python
django2.2安装错误最全的解决方案(小结)
2019/09/24 Python
用Python制作音乐海报
2021/01/26 Python
CSS3中线性颜色渐变的一些实现方法
2015/07/14 HTML / CSS
日本著名的服饰鞋帽综合类购物网站:MAGASEEK
2019/01/09 全球购物
证婚人搞笑证婚词
2014/01/10 职场文书
党校学习心得体会范文
2014/09/09 职场文书
四查四看整改措施
2014/09/19 职场文书
党的群众路线教育实践活动整改落实情况自查报告
2014/10/28 职场文书
前台岗位职责范本
2015/04/16 职场文书
个人廉政承诺书
2015/04/28 职场文书
用人单位聘用意向书
2015/05/11 职场文书
教学反思怎么写
2016/02/24 职场文书
Python中使用Lambda函数的5种用法
2021/04/01 Python
如何通过一篇文章了解Python中的生成器
2022/04/02 Python
5个pandas调用函数的方法让数据处理更加灵活自如
2022/04/24 Python