Redis作为缓存中间件,被广泛应用在各类系统,用来提升系统性能和吞吐,下面总结几点开发人员在使用Redis时需要考虑的几个关键点:

一. key的设计

1. key命名规范:为了避免不必要的麻烦,我们要给系统定义一套key的设计规范。通俗点举个例子,我们在电脑上写好了一篇文章,需要保存起来,这时候我们会找个合适目录并且取个合适的文件名,以便后续要找它的时候,能想起它的名字并找到它,key的命名就好比给你要保存的文件命名和选目录,好的命名,能让你很容易想起它、找到它。大多缓存场景,是将需高频读取低频变更的数据从数据库中加载到redis,比较常用的key命名规范是:表名:主键名:主键值:存储列名,存储列名可根据下面第2点提到的粒度问题来自行定义。比如,缓存用户信息表user,set user:id:1:name 张三,缓存了用户id为1的用户的名字叫张三。

2. 粒度的把握:需要根据不同应用场景来设定。粒度越大,操作越简单,通用性好,但空间占用大,重建缓存需要的资源也越多;粒度越小,控制越复杂,通用性差,但空间占用小,重建缓存时需要的资源就越少。缓存粒度设计不当,可能会造成很多无用空间的浪费、网络带宽的浪费,也可能会造成代码通用性较差等情况,如何权衡缓存的粒度控制,需要根据实际业务提前设计好。

二. 缓存更新策略

缓存中的数据会和数据源有一段时间窗口的不一致,需要利用某些策略更新,下面介绍几种主要的缓存更新策略。

1. LRU/LFU/FIFO:剔除算法通常用于,当缓存使用量超过预设的最大值,如何对现有的数据进行剔除。

2. 超时剔除:给缓存数据设置过期时间,过期后自动删除,例如Redis提供的expire命令。如果业务可以容忍一段时间内,缓存层数据和存储层数据不一致,那么可以为其设置过期时间。在数据过期后,再从真实数据源获取数据,重新放到缓存并设置过期时间。

3. 主动更新:对数据一致性要求高,当源数据更新后,立即更新缓存,可通过MQ来实现触发。

三. 缓存穿透

缓存穿透是指查询一个根本不存在的数据,缓存层和存储层都不会命中。解决缓存穿透,一般的方法有:

1. 缓存空对象。即当某个key从缓存和db都查不到时,为这个key缓存一个空对象,这样下次来就不会击穿到db。这样做,会有2个隐患,一个是,如果被攻击,则可能造成缓存大量的空对象,导致占用大量内存,可以设置比较短的过期时间来应对。另一个隐患是,如果db新增这个key的值,就会有一段时间不一致,当然这个也是数据一致性问题,通过主动更新的策略可避免。

2. 布隆过滤器。利用布隆过滤器保存在redis中存在的key,在击穿缓存时,先查一下布隆过滤器,如果不存在,则不查db,一定程度保护了db层。

四. 热点key重建问题

这个问题是指,某个key高并发读,如果刚好碰上到期更新,会导致多个线程重建key,导致db负载过大,应用雪崩。要解决这个隐患,可以给重建key设置互斥锁,确保同一时间只有一个线程重建缓存。另外,还有一个办法就是,不设置过期时间,然后在逻辑上去控制,即逻辑上记录一个过期时间,如果到了这个过期时间,缓存还能用,只是要通知缓存重建线程去重建。

五. 查缓存要注意

1. 使用连接池来管理连接。
2. 一个业务多次查询,考虑用Pipeline,将多次查询合并为一次,虽然命令会被执行多次,但节省IO,能有效提高响应速度。
3. 多次String查询,使用mget,将多次请求合并为一次,命令也会被合并为一次,能有效提高响应速度,对于Hash内多个Field查询,使用hmget,起到和mget同样的效果。
4. Redis是单线程执行的,如果一条命令执行时间较长,其他线程在此期间会被阻塞,所以在操作Redis时要注意操作指令的涉及的数据量,尽量降低单次操作的执行耗时,比如要慎用模糊匹配。

使用Redis需要注意的几点的更多相关文章

  1. 使用redis构建可靠分布式锁

    关于分布式锁的概念,具体实现方式,直接参阅下面两个帖子,这里就不多介绍了. 分布式锁的多种实现方式 分布式锁总结 对于分布式锁的几种实现方式的优劣,这里再列举下 1. 数据库实现方式 优点:易理解 缺 ...

  2. Ignite性能测试以及对redis的对比

    测试方法 为了对Ignite做一个基本了解,做了一个性能测试,测试方法也比较简单主要是针对client模式,因为这种方法和使用redis的方式特别像.测试方法很简单主要是下面几点: 不作参数优化,默认 ...

  3. mac osx 安装redis扩展

    1 php -v查看php版本 2 brew search php|grep redis 搜索对应的redis   ps:如果没有brew 就根据http://brew.sh安装 3 brew ins ...

  4. Redis/HBase/Tair比较

    KV系统对比表 对比维度 Redis Redis Cluster Medis Hbase Tair 访问模式    支持Value大小 理论上不超过1GB(建议不超过1MB) 理论上可配置(默认配置1 ...

  5. Redis数据库

    Redis是k-v型数据库的典范,设计思想及数据结构实现都值得学习. 1.数据类型 value支持五种数据类型:1.字符串(strings)2.字符串列表(lists)3.字符串集合(sets)4.有 ...

  6. redis 学习笔记(2)

    redis-cluster 简介 redis-cluster是一个分布式.容错的redis实现,redis-cluster通过将各个单独的redis实例通过特定的协议连接到一起实现了分布式.集群化的目 ...

  7. redis 学习笔记(1)

    redis持久化 snapshot数据快照(rdb) 这是一种定时将redis内存中的数据写入磁盘文件的一种方案,这样保留这一时刻redis中的数据镜像,用于意外回滚.redis的snapshot的格 ...

  8. python+uwsgi导致redis无法长链接引起性能下降问题记录

    今天在部署python代码到预生产环境时,web站老是出现redis链接未初始化,无法连接到服务的提示,比对了一下开发环境与测试环境代码,完全一致,然后就是查看各种日志,排查了半天也没有查明是什么原因 ...

  9. nginx+iis+redis+Task.MainForm构建分布式架构 之 (redis存储分布式共享的session及共享session运作流程)

    本次要分享的是利用windows+nginx+iis+redis+Task.MainForm组建分布式架构,上一篇分享文章制作是在windows上使用的nginx,一般正式发布的时候是在linux来配 ...

  10. windows+nginx+iis+redis+Task.MainForm构建分布式架构 之 (nginx+iis构建服务集群)

    本次要分享的是利用windows+nginx+iis+redis+Task.MainForm组建分布式架构,由标题就能看出此内容不是一篇分享文章能说完的,所以我打算分几篇分享文章来讲解,一步一步实现分 ...

随机推荐

  1. Java中枚举类型与for、switch语句

    1.枚举类型的声明 格式为: enum 枚举类型名{ 常量1,常量2,常量3 } 如: enum Number{ one,two,three,four,five    //常量} 注意:enum内装的 ...

  2. 天梯 L2 树的遍历(已知后序中序求层序)

    树的遍历 (25 分) 给定一棵二叉树的后序遍历和中序遍历,请你输出其层序遍历的序列.这里假设键值都是互不相等的正整数. 输入格式: 输入第一行给出一个正整数N(≤30),是二叉树中结点的个数.第二行 ...

  3. springboot2 整合redis

    1.添加依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId> ...

  4. Django设置 DEBUG=False后静态文件无法加载解决

    前段时间调试一直是在Debug=True先运行的,没有什么问题.今天关闭了Debug后,出现了一个问题.就是静态文件找不到了,「img.css.js」都提示404,无法准确的访问 static 静态文 ...

  5. Android布局属性与常用控件

    一.Android常用布局属性 1. LinearLayout的特有属性 android:orientation:设置布局排列方式   android:layout_weight:设置所占布局的权重  ...

  6. 「2.0」一个人开发一个App,小程序从0到1,文件剖析

    不知你是不是见到“文件剖析”这4个大字,才点进来看一看的?如果真是的话,那我可以坦诚.真心.负责任地告诉你:你上当了,你上了贼船啦,如果你现在想跳的话,还来得及,反正茫茫大海中,鲨鱼正缺搞程序的人.说 ...

  7. Java入门 - 面向对象 - 05.封装

    原文地址:http://www.work100.net/training/java-encapsulation.html 更多教程:光束云 - 免费课程 封装 序号 文内章节 视频 1 概述 2 封装 ...

  8. Browser Security-同源策略、伪URL的域

    同源策略 同源策略的文档模型 同源策略(Same Origin policy,SOP),也称为单源策略(Single Origin policy),它是一种用于Web浏览器编程语言(如JavaScri ...

  9. allegro使用经验总结(一)

    在用allegro开发flappy bird.游戏虽然小,但是用到了allegro的方方面面,可以说是"麻雀虽小五脏俱全". 1.physfs 这是一个跨平台的读写文件的库,可以直 ...

  10. 超越队西柚考勤系统——beta冲刺1

    这个作业属于哪个课程 http://edu.cnblogs.com/campus/xnsy/GeographicInformationScience 这个作业的要求在哪里 https://www.cn ...