使用Redis需要注意的几点
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需要注意的几点的更多相关文章
- 使用redis构建可靠分布式锁
关于分布式锁的概念,具体实现方式,直接参阅下面两个帖子,这里就不多介绍了. 分布式锁的多种实现方式 分布式锁总结 对于分布式锁的几种实现方式的优劣,这里再列举下 1. 数据库实现方式 优点:易理解 缺 ...
- Ignite性能测试以及对redis的对比
测试方法 为了对Ignite做一个基本了解,做了一个性能测试,测试方法也比较简单主要是针对client模式,因为这种方法和使用redis的方式特别像.测试方法很简单主要是下面几点: 不作参数优化,默认 ...
- mac osx 安装redis扩展
1 php -v查看php版本 2 brew search php|grep redis 搜索对应的redis ps:如果没有brew 就根据http://brew.sh安装 3 brew ins ...
- Redis/HBase/Tair比较
KV系统对比表 对比维度 Redis Redis Cluster Medis Hbase Tair 访问模式 支持Value大小 理论上不超过1GB(建议不超过1MB) 理论上可配置(默认配置1 ...
- Redis数据库
Redis是k-v型数据库的典范,设计思想及数据结构实现都值得学习. 1.数据类型 value支持五种数据类型:1.字符串(strings)2.字符串列表(lists)3.字符串集合(sets)4.有 ...
- redis 学习笔记(2)
redis-cluster 简介 redis-cluster是一个分布式.容错的redis实现,redis-cluster通过将各个单独的redis实例通过特定的协议连接到一起实现了分布式.集群化的目 ...
- redis 学习笔记(1)
redis持久化 snapshot数据快照(rdb) 这是一种定时将redis内存中的数据写入磁盘文件的一种方案,这样保留这一时刻redis中的数据镜像,用于意外回滚.redis的snapshot的格 ...
- python+uwsgi导致redis无法长链接引起性能下降问题记录
今天在部署python代码到预生产环境时,web站老是出现redis链接未初始化,无法连接到服务的提示,比对了一下开发环境与测试环境代码,完全一致,然后就是查看各种日志,排查了半天也没有查明是什么原因 ...
- nginx+iis+redis+Task.MainForm构建分布式架构 之 (redis存储分布式共享的session及共享session运作流程)
本次要分享的是利用windows+nginx+iis+redis+Task.MainForm组建分布式架构,上一篇分享文章制作是在windows上使用的nginx,一般正式发布的时候是在linux来配 ...
- windows+nginx+iis+redis+Task.MainForm构建分布式架构 之 (nginx+iis构建服务集群)
本次要分享的是利用windows+nginx+iis+redis+Task.MainForm组建分布式架构,由标题就能看出此内容不是一篇分享文章能说完的,所以我打算分几篇分享文章来讲解,一步一步实现分 ...
随机推荐
- cannot open git-upload-pack,cannot open git-receive-pack,Can't connect to any URI错误解决方法eclipse
cannot open git-upload-pack,cannot open git-receive-pack,Can't connect to any URI错误解决方法eclipse 解决ecl ...
- ENS 域名注册表智能合约(ENSRegistry.sol)解析
ENS 注册表合约是 ENS 系统中的核心合约,了解这个合约可以敲开我们理解 ENS 域名系统的大门. 打开下面的折叠区域可以查看用 Solidity 语言编写的详细代码.当前部署在以太坊中的 ENS ...
- 【记】创建 VirtualBoxClient COM 对象失败. 应用程序将被中断
1. 在本地64位win7系统安装VirtualBox完,启动时提示错误 原因:兼容性造成的 按照下图显示修改VirtualBox快捷方式的兼容性 2. 启动虚拟机时,提示 点击弹出框的确定按钮后,接 ...
- AES中ECB模式的加密与解密(Python3.7)
本文主要解决的问题 本文主要是讲解AES加密算法中的ECB模式的加密解密的Python3.7实现.具体AES加密算法的原理这里不做过多介绍,想了解的可以参考文末的参考链接. 主要解决了两个问题: 在P ...
- ArcGIS Desktop直连PostgreSQL安装及配置图解(windows)
目录 1 PostgreSQL 11.0安装及配置 2 psqlODBC安装及配置 3 PostGIS安装及配置 4 pgAdmin4使用入门 5 空间数据导入 5.1 将PostgreSQL的bin ...
- TensorFlow——LinearRegression简单模型代码
代码函数详解 tf.random.truncated_normal()函数 tf.truncated_normal函数随机生成正态分布的数据,生成的数据是截断的正态分布,截断的标准是2倍的stddev ...
- Spark集群-Standalone 模式
Spark 集群相关 table td{ width: 15% } 来源于官方, 可以理解为是官方译文, 外加一点自己的理解. 版本是2.4.4 本篇文章涉及到: 集群概述 master, worke ...
- PHP-FPM 远程代码执行漏洞(CVE-2019-11043)的简单复现学习
1.概述 漏洞主要由于 PHP-FPM 中 sapi/ fpm/ fpm/ fpm_main.c 文件内的 env_path_info 下溢导致,攻击者可以使用换行符 %0a 破坏 Nginx 中 f ...
- cogs 826. [Tyvj Feb11] GF打dota 次短路详细原创讲解! dijkstra
826. [Tyvj Feb11] GF打dota ★★☆ 输入文件:dota.in 输出文件:dota.out 简单对比时间限制:1 s 内存限制:128 MB 众所周知,GF同学喜 ...
- dp - 求连续区间异或的最大值
For an array b of length m we define the function f as f(b)={b[1]if m=1f(b[1]⊕b[2],b[2]⊕b[3],…,b[m−1 ...