在项目中使用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配置文件中常用配置详解
Apr 14 Redis
Redis高级数据类型Hyperloglog、Bitmap的使用
May 24 Redis
浅谈Redis的keys命令到底有多慢
Oct 05 Redis
Redis的字符串是如何实现的
Oct 24 Redis
基于Redis zSet实现滑动窗口对短信进行防刷限流的问题
Feb 12 Redis
Redis+Lua脚本实现计数器接口防刷功能(升级版)
Feb 12 Redis
解决linux下redis数据库overcommit_memory问题
Feb 24 Redis
Redis之RedisTemplate配置方式(序列和反序列化)
Mar 13 Redis
使用Redis做预定库存缓存功能
Apr 02 Redis
浅谈Redis 中的过期删除策略和内存淘汰机制
Apr 03 Redis
Redis官方可视化工具RedisInsight安装使用教程
Apr 19 Redis
Redis 异步机制
May 15 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初学者常见问题集合 修正版(21问答)
2010/03/23 PHP
php中突破基于HTTP_REFERER的防盗链措施(stream_context_create)
2011/03/29 PHP
PHP实现获取并生成数据库字典的方法
2016/05/04 PHP
php 5.4 全新的代码复用Trait详解
2017/01/05 PHP
JavaScript 高效运行代码分析
2010/03/18 Javascript
js function定义函数的几种不错方法
2014/02/27 Javascript
jquery简单图片切换显示效果实现方法
2015/01/14 Javascript
JavaScript实现添加、查找、删除元素
2015/07/02 Javascript
JavaScript知识点总结(十六)之Javascript闭包(Closure)代码详解
2016/05/31 Javascript
BootStrap.css 在手机端滑动时右侧出现空白的原因及解决办法
2016/06/07 Javascript
详解使用Vue.Js结合Jquery Ajax加载数据的两种方式
2017/01/10 Javascript
JS实现线性表的顺序表示方法示例【经典数据结构】
2017/04/11 Javascript
基于vue-ssr服务端渲染入门详解
2018/01/08 Javascript
页面点击小红心js实现代码
2018/05/26 Javascript
使用Node.js写一个代码生成器的方法步骤
2019/05/10 Javascript
详解VUE中的插值( Interpolation)语法
2020/10/18 Javascript
微信小程序实现多行文字滚动
2020/11/18 Javascript
python缩进区别分析
2014/02/15 Python
python实现从一组颜色中找出与给定颜色最接近颜色的方法
2015/03/19 Python
Python中一些自然语言工具的使用的入门教程
2015/04/13 Python
在Django的模板中使用认证数据的方法
2015/07/23 Python
使用sklearn之LabelEncoder将Label标准化的方法
2018/07/11 Python
python使用tkinter库实现五子棋游戏
2019/06/18 Python
Python3 requests模块如何模仿浏览器及代理
2020/06/15 Python
全面总结使用CSS实现水平垂直居中效果的方法
2016/03/10 HTML / CSS
台湾乐天市场:日本No.1的网路购物网站
2017/03/22 全球购物
波兰数码相机及配件网上商店: Cyfrowe.pl
2017/06/19 全球购物
理肤泉美国官网:La Roche-Posay
2018/01/17 全球购物
电子商务专业求职信
2014/03/08 职场文书
房地产活动策划方案
2014/05/14 职场文书
关于读书的活动方案
2014/08/14 职场文书
学习焦裕禄同志为人民服务思想汇报
2014/09/10 职场文书
证劵公司反洗钱宣传活动总结
2015/05/08 职场文书
家长会开场白和结束语
2015/05/29 职场文书
《蜜蜂引路》教学反思
2016/02/22 职场文书
2016年优秀党务工作者先进事迹材料
2016/02/29 职场文书