Redis是什么
Redis(Remote Dictionary Server ),即远程字典服务,是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。
为什么需要Redis
数据量增长,读写数据的压力不断增大,直接从数据库中读取消耗时间长。Redis由c语言编写,能将数据写入内存,能加快数据读取。
Redis基本工作原理
- 数据从内存中读写
- 数据保存到磁盘上防止重启数据丢失
- 单线程处理所有操作命令
Redis基本操作
安装
从redis.io下载最新版redis-X.Y.Z.tar.gz 然后 进入相应文件夹 执行以下命令完成安装
tar zxvf redis-2.6.9.tar.gz
cd redis-2.6.9
make
启动
启动redis非常简单,直接./redis-server就可以启动服务端了
基本使用
set key value 设置键和值
get key 获取值
del key 删除键
更多基础命令可以去官网查询
注意事项
一、大key,热key
大Key:Value大于10KB就是大Key,使用大Key将导致Redis系统不稳定
消除方法:
- 拆分: 将大key拆分成多个小key
- 压缩: 使用相应算法进行压缩,将压缩后的值写入redis,读取时解压后再使用
热Key:一个Key的QPS特别高,将导致Redis实例出现负载突增,负责均衡流量不均的情况。导致单实例故障
解决方法:
- 设置Localcache: 在本地设置Localcache,将热点数据放入Localcache,以后访问时可以先访问Localcache,未命中再访问redis,降低访问Redis的QPS
- 拆分: 将key:value这一个热Key复制写入多份,例如key1:value,key2:value,访问的时候访问多个key,但value是同一个,以此将qps分散到不同实例上,降低负载。代价是,更新时需要更新多个key,存在数据短暂不一致的风险
- 使用Redis代理的热Key承载能力: 字节跳动的Redis访问代理就具备热Key承载能力。本质上是结合了“热Key发现”、“LocalCache”两个功能
二、缓存穿透、缓存雪崩
缓存穿透: 查询一个一定不存在的数据,如果从存储层查不到数据则不写入缓存,这将导致这个不存在的数据每次请求都要到 DB 去查询,可能导致DB 挂掉。
解决方法:
- 缓存一个空对象: 第一次查询时,如果数据库没有数据,就缓存一个空对象,当下一次访问时,返回一个空对象。
- 布隆过滤器: 将数据库所有数据使用bloomfilter算法来存储,查询时判断是否在数据库中存在,如果存在才去查询数据库 缓存雪崩: 设置缓存时采用了相同的过期时间,导致缓存在某一时刻同时失效,请求全部转发到DB,DB 瞬时压力过重雪崩。
解决方法:
可以将缓存失效时间分散开,比如可以在原有的失效时间基础上增加一个随机值,比如1-5分钟随机,这样每一个缓存的过期时间的重复率就会降低,就很难引发集体失效的事件。