前言

聊起 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. 使用自编译的Emacs26.0.50build10版本,helm报错(已解决)

    使用自编译的Emacs26.0.50build10版本,helm报错(已解决) */--> code {color: #FF0000} pre.src {background-color: #0 ...

  2. 用C语言给指定的内存地址赋值(通过指针)

    这两天找工作,做面试题的时候,碰到这样的题:指定了一个地址,比如说0x0012ff7c这样一个地址,要求是给这个指定的地址赋一个确定的值,比如说100,当时就是一个郁闷啊,在汇编里这样用过,在c中还真 ...

  3. Python之随机选择 random

    随机选择:random import random # 从一个序列中随机的抽取一个元素 values=[1,2,3,4,56] # 指定取出N个不同元素 print(random.sample(val ...

  4. js中的script标签属性

    HTML <script> 元素用于嵌入或引用可执行脚本. 在html中插入一个script标签 <script src="index.js" sync cros ...

  5. Nhibernet Get方法获取数据后,修改字段,未保存,但是数据库的数据却同步了

    首先,对象是在session中取得的,所以这个对象已经和数据库同步了,或者说相关联了如果你的session中的对象发生变法,提交事务后,数据库中的数据也会更新未保存更改,不要以为session就不会在 ...

  6. MYSQL全文索引—CONTAINS语法

    我们通常在 WHERE 子句中使用 CONTAINS ,就象这样:SELECT * FROM table_name WHERE CONTAINS(fullText_column,'search con ...

  7. Codeforces 360D Levko and Sets (数论好题)

    题意:有一个长度为n的数组a和一个长度为m的数组b,一个素数p.有n个集合,初始都只有一个1.现在,对(i从1到n)第i个集合执行以下操作: 对所有集合中的元素c,把c * (a[i] ^ b[j]) ...

  8. java 方法的定义与调用

    /* 定义一个方法的格式: public static void 方法名称(){ 方法体 } 方法名称的命名规则和变量一样,使用小驼峰 方法体:也就是大括号里面的可以包含任何语句 注意事项: 1.方法 ...

  9. nmap使用笔记

    扫描全端口判断服务 nmap ip -T4 -Pn -sV -p 1-65535 扫描端口并且标记可以爆破的服务 nmap ip --script=ftp-brute,imap-brute,smtp- ...

  10. LC: 404.左叶子节点

    计算给定二叉树的所有左叶子之和. 示例: / \ 9 20 / \ 15 7 ,所以返回 24 解析 我们需要找到这样的节点 属于叶子节点 属于父节点的左子节点 方法一:用栈,dfs遍历,用全局变量r ...