前言

聊起 redis 咱们大部分后端猿应该都不陌生,或多或少都用过。甚至大部分前端猿都知道。

数据结构: string、 hash、 list、 set (无序集合)、 setsorted(有序集合),

运维方面 : 持久化,主从复制,集群,故障恢复 ,

园子里已经由大佬科普过了,官方文档也能查到, 这里就不细说 redis的“发展起家史”。

咱们今天就聊聊redis的缓存应用场景(不推荐用redis做分布式锁),redis常见操作(击穿,雪崩,缓存数据量过大等),常见问题及处理方式。怎么用到咱们项目中,提升产品体验。结合我实际项目来解释这里面得思路。(saas,企业级应用)

类型
 
  公共缓存 

    数据极少变动:可使用本机内存缓存,单例模式。(如预制分类、城市、配置,首页布局等)

    数据会有变动:加载慢,但是用户经常点击的数据,可使用分布式缓存。(如热点数据,评论,项目工作讨论)

  用户相关缓存

    跟登陆账户相关,集群化部署需要使用分布式缓存
    用户登陆后的首屏数据,如,常用统计,分类权限菜单,待办事项,工作台等

加载方式
  预加载:系统初始化即加载数据进入缓存(比如相关静态数据)

延迟加载:有请求才做缓存,无请求则不进行缓存(动态数据)

时间设置
    不过期
  固定过期时间(几小时,哪一天)
  非固定过期时间(做过期时间的更新,获取redis数据时同步更新缓存时间, 如下流程图示意)

失效带来的问题

  穿透
    大量无效的Key访问,数据并不存在
    解决:Key做验证过滤;无数据也进行缓存(空对象,非null)
  击穿
    1个Key失效,但这个Key有大量并发请求,特别是公共缓存
    解决:失效时间点设置在非高峰时间段;主动做缓存更新(过期之前操作),而不是清理在重建
  雪崩
    大量key设置了相似过期时间(前后几分钟),导致数据库请求瞬间增加。或者缓存服务器挂了
    解决:大量Key不要设置相同时间点过期或者过期时间比较接近,可以进行相对时间设置

项目使用思考

  下面结合我自己项目,各位看官可酌情参考,骚操作开始

反向操作
  缓存部分数据

    有些数据太多,如果一直都是全部缓存,可能会带来一些问题,内存会爆掉,我们可以缓存部分数据, 比如id(id和权限有关,通过权限去取链路太长,而权限的变更不频繁)

  让实体无数据被缓存。数据可被缓存,但引起该缓存失效点众多难以全部覆盖

    让数据持续有效,提升缓存命中率

    当Get数据有缓存之时,重置缓存有效时间

    利用队列、事件总线、发布订阅、任务管理等进行异步缓存预处理

  设置缓存版本时间,进行对比(适用于主从关系的数据)

    什么意思呢,清理缓存的地方太多,无法覆盖,我们可以设置版本缓存时间。让相关缓存和这个缓存版本时间进行对比 属性缓存时间> 缓存版本时间=有效

   (举个例子)一个项目下由多个工单, 工单设置了缓存,如果项目的基础信息修改,没法及时清理所有工单的缓存(其实这样也不科学,可能导致连接数过高)可以为这个项目设置缓存的时间,获取工单信息的时候如果工单的缓存的时间大于项目缓存的时间。有               效直接返回数据,如果无效,则获取DB更新相关缓存即可

这反手一波波操作很骚,咱们说下正常操作(其实也不算骚,反过来思考)

正常操作
  常用数据加入缓存
  请求数量庞大的请求加入缓存
  查询较慢(通常是数据量基数庞大)的请求加入缓存

  举个例子,像下列基本都可以做缓存(根据自己的业务来,也可不做,一种方案)

    首页列表(或常用列表)

    置顶内容标题

    未读计数(也可用消息队列)

    常用协作目标联系人搜索

    常用统计周视图日程

    首屏数据

    统计

整体操作
  数据完整的置入缓存
  用户信息  
  权限信息 
  缓存组
    让具备缓存失效关联关系的可将关键置入缓存组,失效则同时进行失效,关系可存放于内存或者Redis支持结构里面

 

善用redis,合理利用二级缓存,合理利用Redis所支持的结构,以提升项目整体性能,redis虽好,不可”贪杯“,否则影响稳定性就得不偿失了(redis只是一个方面,还可以分表,分库,数据库拆分,kafka,ElasticSearch,Solr等,技术都是手段,提供给用户好的体验,解决问题才是最重要的)

谢谢!

如果您觉得阅读本文对您有帮助,请点一下“推荐”按钮,您的“推荐”将是我最大的写作动力!

本文版权归作者和博客园共有,来源网址:https://www.cnblogs.com/DanielYao/欢迎各位转载,但是未经作者本人同意,转载文章之后必须在文章页面明显位置给出作者和原文连接,否则保留追究法律责任的权利

聊聊redis实际运用及骚操作的更多相关文章

  1. Redis 数据结构之字符串的那些骚操作

    Redis 字符串底层用的是 sds 结构,该结构同 c 语言的字符串相比,其优点是可以节省内存分配的次数,还可以... 这样写是不是读起来很无聊?这些都是别人咀嚼过后,经过一轮两轮三轮的再次咀嚼,吐 ...

  2. Github 骚操作

    GitHub 竟然有这些骚操作,真是涨姿势 GitHub,不用过多介绍.一个面向开源及私有软件项目的托管平台,因为只支持 git 作为唯一的版本库格式进行托管,故名 GitHub. 作为「全球最大的程 ...

  3. 阿里面试官:HashMap 熟悉吧?好的,那就来聊聊 Redis 字典吧!

    最近,小黑哥的一个朋友出去面试,回来跟小黑哥抱怨,面试官不按套路出牌,直接打乱了他的节奏. 事情是这样的,前面面试问了几个 Java 的相关问题,我朋友回答还不错,接下来面试官就问了一句:看来 Jav ...

  4. Guava中这些Map的骚操作,让我的代码量减少了50%

    原创:微信公众号 码农参上,欢迎分享,转载请保留出处. Guava是google公司开发的一款Java类库扩展工具包,内含了丰富的API,涵盖了集合.缓存.并发.I/O等多个方面.使用这些API一方面 ...

  5. Redis 对String数据类型的操作

    Redis的 Strings 数据结构是简单的key-value类型,value其实不仅是String,也可以是数字.使用Strings类型,你可以完全实现目前 Memcached 的功能,并且效率更 ...

  6. Typescript骚操作,在TS里面直接插入HTML

    Typescript骚操作,在TS里面直接插入HTML,还有语法提示 先给大家看一个图 因为我不喜欢用很重的框架,主要是并非专业UI,但是偶尔会用到,还是觉得直接element组装受不了,想想能在ts ...

  7. 闪电侠 Netty 小册里的骚操作

    前言 即使这是一本小册,但基于"不提笔不读书"的理念,仍然有必要总结一下.此小册对于那些"硬杠 Netty 源码 却不曾在千万级生产环境上使用实操"的用户非常有 ...

  8. awk骚操作

    一.awk自加 [root@168web3 ~]# head /data/logs/cloud_monitor_rds_cpu.log |awk '{sum+=$NF}END{print sum}' ...

  9. Redis系列(二):Redis的数据类型及命令操作

    原文链接(转载请注明出处):Redis系列(二):Redis的数据类型及命令操作 Redis 中常用命令 Redis 官方的文档是英文版的,当然网上也有大量的中文翻译版,例如:Redis 命令参考.这 ...

随机推荐

  1. Codeforces 492E Vanya and Field

    E. Vanya and Field time limit per test 2 seconds memory limit per test 256 megabytes input standard ...

  2. Java开发者职业生涯要看的200+本书

    作者:老刘链接:https://www.zhihu.com/question/29581524/answer/684872838来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明 ...

  3. Codeforces 1100E 拓扑排序

    题意及思路:https://blog.csdn.net/mitsuha_/article/details/86482347 如果一条边(u, v),v的拓扑序小于u, 那么(u, v)会形成环,要反向 ...

  4. python 环境变量的配置

    1. 打开python安装目录 2.将python.exe重名为python3.exe 3.在环境变量的path中,添加python3的目录 4.将pip.exe的目录页添加到path中,即可完成环境 ...

  5. webpack第一节(3)

    模块化加载 上一节进行了一个简单的模块化加载,复杂点 新建一个js文件 名为 world.js 依旧在根目录下 在hello.js中引入world.js 模块化加载,world.js是一个模块 引入的 ...

  6. InnoDB事务之redo log工作原理

    Reference:https://time.geekbang.org/column/article/121710 InnoDB是一个事务性的存储引擎,而InnoDB的事务实现是基于事务日志redo ...

  7. activemq消息中间件的依赖

    <dependencies> <dependency> <groupId>org.apache.activemq</groupId> <artif ...

  8. jekins—持续集成

    json转换为Python的字典形式 Martin fowler:通过自动化的构建,编译-发布-自动化测试,尽早的发现集成的错误 持续集成的要素: 统一的代码库 自动构建编译 自动测试(单元测试) 每 ...

  9. 51NOD 1005

    1005 大数加法  基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题  收藏  关注 给出2个大整数A,B,计算A+B的结果.   Input 第1行:大数A 第2行:大 ...

  10. linux(centos6) 常用操作

    目录 一.开机关机 1.Linux centos重启命令: 2.Linux centos关机命令: 二.图形界面与命令界面的切换 1.修改/etc/inittab文件,文件中,最后一行id:5:ini ...