使用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组建分布式架构,由标题就能看出此内容不是一篇分享文章能说完的,所以我打算分几篇分享文章来讲解,一步一步实现分 ...
随机推荐
- spring boot集成jsp
我们在使用spring boot进行web项目开发的时候,可能会选择页面用jsp.spring boot默认使用的html的,现在我们来看下如何集成jsp页面进行开发. 1.pom.xml文件引入所需 ...
- Anaconda----Python的计算环境
由于要用到opencv中的cv2这个module,我会在Anaconda这个Python的计算环境中安装加入opencv. 打开一个终端,输入: conda install opencv 显示: 选择 ...
- python的input()函数
# input()函数 # 作用: 获取用户的输入,返回输入的内容 ,也可以用于暂停程序的运行 # 影响: 调用此函数,程序会立即暂停,等待用户输入 # 注意:input()的返回值是一个字符串 # ...
- bzoj_1036 树链剖分套线段树
bzoj_1036 ★★★★ 输入文件:bzoj_1036.in 输出文件:bzoj_1036.out 简单对比时间限制:1 s 内存限制:162 MB [题目描述] 一棵树上有n个节 ...
- Spring-cloud微服务实战【三】:eureka注册中心(中)
回忆一下,在上一篇文章中,我们创建了两个springboot项目,并且在consumer项目中通过restTemplate进行HTTP通信,成功访问到了producer提供的接口,思考一下这样的实 ...
- AD19覆铜与边框间距设置方法
转载请注明出处,并附带本文网址https://www.cnblogs.com/brianblog/p/9894867.html, 由于高版本AD不能将机械层直接转变为KEPP OUT LAYER层,所 ...
- Identity 4 -1创建一个登录中心
准备知识 官网地址:https://identityserver4.readthedocs.io/ 通过nuget安装 Identity Server4
- 【java面试】算法篇
1.冒泡排序 /** * 冒泡排序 * 比较相邻的元素.如果第一个比第二个大,就交换他们两个. * 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对.在这一点,最后的元素应该会是最大的数. ...
- python,finally的应用
脚本执行过程中可能因为被测试的环境有改变导致中间某一部分无法继续执行下去 可以在最后一行加上finally来执行最后一句脚本 比如 最后执行退出 表示 无论中间过程失败还是成功,最终都会执行退出操作 ...
- php编译完php.ini加载问题-Loaded Configuration File (none)
编译安装php7时指定了--with-config-file-path=/usr/local/php7/etc,修改了 php.ini 的配置后重启,但就是不生效. 出现Loaded Configur ...