基本原则

  • 只应将热数据放到缓存中

  • 所有缓存信息都应设置过期时间

  • 缓存过期时间应当分散以避免集中过期

  • 缓存key应具备可读性

  • 应避免不同业务出现同名缓存key

  • --->解决方法:  保证键名不冲突,也夹杂了一般在一个项目中怎样使用缓存,有几个供参考的方式:

      1. 当前参数,可以有几个拼接几个,这里只举了个uid,假如还有name, age等等,可以都放在后面,具体怎么弄看个人喜好或者代码规范;

      2. 当前方法名称,尽量接近当前方法名称,拼在缓存key中间;

      3. 当前项目名称作为前缀(可选),更安全;

      4. 所在项目组名称,再次作为前缀拼进来(一般用不到)。

      然后就是,在Model模型类中,先取缓存,取不到则读数据库,读到后不要忘了写入缓存,设置好过期时间等细节,就这么一个流程。

  • 可对key进行适当的缩写以节省内存空间

  • 选择合适的数据结构

  • 确保写入缓存中的数据是完整且正确的

  • 避免使用耗时较长的操作命令,如:keys *

    • Redis默认配置中操作耗时超过10ms即视为慢查询
  • 一个key对应的数据不应过大

    • 对于string类型,一个key对应的value大小应控制在10K以内,1K左右更优
    • hash类型,不应超过5000行
  • 避免缓存穿透

    • 数据库中未查询到的数据,可在Redis中设置特殊标识,以避免因缓存中无数据而导致每次请求均达到数据库
  • 缓存层不应抛出异常

    • 缓存应有降级处理方案,缓存出了问题要能回源到数据库进行处理
  • 可以进行适当的缓存预热

    • 对于上线后可能会有大量读请求的应用,在上线之前可预先将数据写入缓存中
  • 读的顺序是先缓存,后数据库;写的顺序是先数据库,后缓存

  • 数据一致性问题

    • 数据源发生变更时可能导致缓存中数据与数据源中数据不一致,应根据实际业务需求来选择适当的缓存更新策略:

      • 主动更新:在数据源发生变更时同步更新缓存数据或将缓存数据过期。一致性高,维护成本较高。

      • 被动删除:根据缓存设置的过期时间有Redis负责数据的过期删除。一致性较低,维护成本较低。

缓存过期算法

  • LRU

    • 淘汰最后使用时间距当前时间较长的数据
  • LFU

    • 淘汰某段时间内的使用频次较低的数据
  • FIFO

    • 淘汰先写入的数据

作者:雪飞鸿
链接:https://www.jianshu.com/p/7b0bf1cb59e2
来源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

redis设计原则的更多相关文章

  1. MySQL三层结构、用户权限、索引设计原则

    一.守护进程是什么? Linux Daemon(守护进程)是运行在后台的一种特殊进程.它独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件.它不需要用户输入就能运行而且提供某种服务,不是对 ...

  2. C#设计模式(0)——设计原则

    设计原则 使用设计模式的根本原因是适应变化,提高代码复用率,使软件更具有可维护性和可扩展性.在进行设计的时候,我们需要遵循以下几个原则:单一职责原则.开闭原则.里氏替代原则.依赖倒置原则.接口隔离原则 ...

  3. 探索Redis设计与实现2:Redis内部数据结构详解——dict

    本文转自互联网 本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 https://github.com/h2pl/Java-Tutorial ...

  4. 设计原则:开闭原则(OCP)

    1.什么是开闭原则 开闭原则的英文是Open Closed Principle,缩写就是OCP.其定义如下: 软件实体(模块.类.方法等)应该"对扩展开放.对修改关闭". 从定义上 ...

  5. 设计原则:里式替换原则(LSP)

    系列文章 设计原则:单一职责(SRP) 设计原则:开闭原则(OCP) 设计原则:里式替换原则(LSP) 设计原则:接口隔离原则(ISP) 设计原则:依赖倒置原则(DIP) 何谓高质量代码? 理解RES ...

  6. 「 MySQL高级篇 」MySQL索引原理,设计原则

    大家好,我是melo,一名大二后台练习生,大年初三,我又来充当反内卷第一人了!!! 专栏引言 MySQL,一个熟悉又陌生的名词,早在学习Javaweb的时候,我们就用到了MySQL数据库,在那个阶段, ...

  7. Redis设计与实现

    简述Redis设计与实现 Redis是一个高性能的key-value的非关系型数据库,Redis是运行在内存中的一种数据库,但是它也可以持久化到磁盘中,Redis的实现有着更为复杂的数据结构并且提供对 ...

  8. 「MySQL高级篇」MySQL索引原理,设计原则

    大家好,我是melo,一名大二后台练习生,大年初三,我又来充当反内卷第一人了!!! 专栏引言 MySQL,一个熟悉又陌生的名词,早在学习Javaweb的时候,我们就用到了MySQL数据库,在那个阶段, ...

  9. UML建模语言、设计原则、设计模式

    1.UML统一建模语言 定义:用于软件系统设计与分析的语言工具 目的:帮助开发人员更好的梳理逻辑.思路 学习地址:UML概述_w3cschool 官网:https://www.omg.org/spec ...

随机推荐

  1. CentOS安装Python模块cx_Oracle

    在线安装 $ wget https://bootstrap.pypa.io/get-pip.py$ python get-pip.py$ pip -V #查看pip版本 或者将网页中的代码复制到get ...

  2. python大法好——ython GUI编程(Tkinter)

    Python GUI编程(Tkinter) Python 提供了多个图形开发界面的库,几个常用 Python GUI 库如下: Tkinter: Tkinter 模块(Tk 接口)是 Python 的 ...

  3. Spring-内置Resouce

    Spring 内置Resouce Resource: org.springframework.core.io.Resource; 内置方法 public interface Resource exte ...

  4. spring加载配置新旧方式对比

    老方式 1.首先要配置配置文件,如beans.xml,内容如下: <?xml version="1.0" encoding="UTF-8"?> &l ...

  5. Tomcat源码分析 -- Tomcat整体架构

    引用链接:https://blog.csdn.net/w1992wishes/article/details/79242797

  6. 前端页面JS和CSS以及图片加载nginx报错:net::ERR_CONTENT_LENGTH_MISMATCH的解决与检查

    首先检查nginx权限 具体可参考地址https://www.cnblogs.com/hooly/p/9951748.html 或者百度其他方法 还有种情况,之前是可以用的,突然出现这种加载报错的情况 ...

  7. jquery中的globalEval()源码分析

    //20170724 huanhua 定义成全局的变量 // 在谷歌浏览器下运行的: // function fun(){ eval('var a=1'); } 此时 定义的 a 就是局部的变量 // ...

  8. Mongodb数据库学习

    数据库 MongoDB (芒果数据库) 数据存储阶段 文件管理阶段 (.txt .doc .xls)优点 : 数据可以长期保存 可以存储大量的数据 使用简单 缺点 : 数据一致性差 数据查找修改不方便 ...

  9. centos7 tomcat8+jdk1.8

    (1) 下载Tomcat8压缩包进入 http://tomcat.apache.org/download-80.cgi 在binary Distributions下面,选择tar.gz包下载 [tar ...

  10. VirtualBox 休眠恢复后无法联网解决办法

    环境:lubuntu 首先ifconfig查看网卡名,我这里是enp0s3. 接着: sudo ifconfig enp0s3 down sudo ifconfig enp0s3 up sudo dh ...