Redis 笔记
2020-01-27 21:41:09 0 举报
AI智能生成
Redis 笔记
作者其他创作
大纲/内容
Redis高可用方案
Redis 单节点
缺点
单个redis并发有限
单个redis接收所有的数据,最终回导致内存太大,内存太大回导致rdb文件过大,从很大的rdb文件中同步恢复数据会很慢。
Redis 主从 Master/Slave
主备模式
一个主节点
至少一个从节点
至少一个从节点
Redis 哨兵 Sentinel
一个主节点
至少一个从节点
一个哨兵节点
至少一个从节点
一个哨兵节点
Redis 集群 Cluster
自动分割数据到不同的节点上
整个集群的部分节点失败或者不可达的情况下能够继续处理命令。
最小的redis集群
需要准备至少6台redis
需要至少3个主节点
每个主节点搭配至少一个从节点
客户端SDK
Jedis
概念
是Redis的Java实现客户端,提供了比较全面的Redis命令的支持,
优点
比较全面的提供了Redis的操作特性
可伸缩
使用阻塞的I/O,且其方法调用都是同步的,程序流需要等到sockets处理完I/O才能执行,不支持异步。Jedis客户端实例不是线程安全的,所以需要通过连接池来使用Jedis。
Redisson
概念
实现了分布式和可扩展的Java数据结构。
优点
促使使用者对Redis的关注分离,提供很多分布式相关操作服务,例如,分布式锁,分布式集合,可通过Redis支持延迟队列
可伸缩
基于Netty框架的事件驱动的通信层,其方法调用是异步的。Redisson的API是线程安全的,所以可以操作单个Redisson连接来完成各种操作
Lettuce
SpringBoot2.0默认
SpringBoot2.0默认
概念
高级Redis客户端,用于线程安全同步,异步和响应使用,支持集群,Sentinel,管道和编码器。
优点
促使使用者对Redis的关注分离,提供很多分布式相关操作服务,例如,分布式锁,分布式集合,可通过Redis支持延迟队列
可伸缩
基于Netty框架的事件驱动的通信层,其方法调用是异步的。Lettuce的API是线程安全的,所以可以操作单个Lettuce连接来完成各种操作
命中计算
查询命中数
查询的命中个数,对应 keyspace_hits 字段。
查询未命中数
查询的未命中个数,对应 keyspace_misses 字段。
查询命中率
查询命中率,对应 keyspace_hits / ( keyspace_hits + keyspace_misses )。
总Key个数
缓存中总的 key 个数,所有 db 的 key 个数总和。
已过期Key个数
缓存中已过期 Key 个数,对应 expired_keys 字段。
被拒绝Key个数
缓存中被拒绝 Key 个数,对应 evicted_keys 字段。当缓存内存不足时,会根据用户配置的 maxmemory-policy 来选择性地删除一些 key 来保护内存不溢出
使用缓存一般流程
正常的使用缓存流程大致是,数据查询先进行缓存查询,如果key不存在或者key已经过期,再对数据库进行查询,并把查询到的对象,放进缓存。如果数据库查询对象为空,则不放进缓存。
技术点
参考
阿里P8技术专家细究分布式缓存问题
缓存击穿
指的是单个key在缓存中查不到,去数据库查询,这样如果数据量不大或者并发不大的话是没有什么问题的。
例如一个key非常热点,在不停的扛着大并发,大并发集中对这一个点进行访问,当这个key在失效的瞬间,持续的大并发就穿破缓存,直接请求数据库,就像在一个屏障上凿开了一个洞。
解决方案
对主打商品的缓存永不过期。即便某些商品自己发酵成了爆款,也是直接设为永不过期就好了。
缓存穿透
是指查询一个数据库一定不存在的数据。
缓存雪崩
是指在某一个时间段,缓存集中过期失效。
缓存失效后访问查询都落到了数据库上,对于数据库而言,就会产生周期性的压力波峰。
原因
多个key同时失效
设置缓存时采用了相同的过期时间
Redis缓存服务器某个节点宕机或断网。
解决方案
比如电商项目,一般可采取不同分类商品,缓存不同周期。在同一分类中的商品,加上一个随机因子。这样能尽可能分散缓存过期时间,而且,热门类目的商品缓存时间长一些,冷门类目的商品缓存时间短一些,也能节省缓存服务的资源。
缓存失效
缓存预热
是指系统上线后,提前将相关的缓存数据直接加载到缓存系统。避免在用户请求的时候,先查询数据库,然后再将数据缓存的问题!用户直接查询事先被预热的缓存数据!
解决方案
直接写个缓存刷新页面,上线时手工操作下
数据量不大,可以在项目启动的时候自动进行加载
定时刷新缓存
缓存更新
除了缓存服务器自带的缓存失效策略之外(Redis默认的有6中策略可供选择),我们还可以根据具体的业务需求进行自定义的缓存淘汰
常见的策略有两种
定时去清理过期的缓存
当有用户请求过来时,再判断这个请求所用到的缓存是否过期,过期的话就去底层系统得到新数据并更新缓存。
缓存降级
分布式锁
互斥锁
内存策略
最大内存
maxmemory
redis.conf
maxmemory 100mb
缓存淘汰策略
maxmemory-policy
maxmemory-policy
noeviction
当内存使用达到阈值的时候,所有引起申请内存的命令会报错
默认策略
voltile-lru
从已设置过期时间的数据集(server.db[i].expires)中挑选最近最少使用的数据淘汰
volatile-ttl
从已设置过期时间的数据集(server.db[i].expires)中挑选将要过期的数据淘汰
volatile-random
从已设置过期时间的数据集(server.db[i].expires)中任意选择数据淘汰
allkeys-lru
从数据集(server.db[i].dict)中挑选最近最少使用的数据淘汰
allkeys-random
从数据集(server.db[i].dict)中任意选择数据淘汰
过期键删除策略
被动删除
当读/写一个已经过期的key时,会触发惰性删除策略,直接删除掉这个过期key
主动删除
由于惰性删除策略无法保证冷数据被及时删掉,所以Redis会定期主动淘汰一批已过期的key
当前已用内存超过maxmemory限定时
触发主动清理策略
持久化策略
快照
RDB
RDB
快照形式是直接把内存中的数据保存到一个dump文件中,定时保存,保存策略
默认策略
redis.conf
save 900 1
save 300 10
save 60 10000
save 300 10
save 60 10000
写命令
AOF
AOF
把所有的对redis的服务器进行修改的命令都存到一个文件里,命令的集合
appendonly no
appendonly yes
分布式缓存
Redis管道模式
Redis缓存与数据库一致性问题
基于Redis实现分布式锁
Redis中AOF和RDB持久化原理
Redis读写分离架构
Redis哨兵架构和数据丢失问题
Redis Cluster 数据分布算法之 Hash Slot
Redis常见问题和性能调优
缓存击穿和缓存雪崩预防策略
Redis批量查询优化
Redis 高性能集群之 twemproxy codis
Redis 数据结构
String 字符串
常用命令
set
设置指定 key 的值
get
获取指定 key 的值。
setnx
只有在 key 不存在时设置 key 的值。
mget
获取所有(一个或多个)给定 key 的值。
incr
将 key 中储存的数字值增一。
decr
将 key 中储存的数字值减一。
应用场景
常规key-value缓存应用。常规计数: 微博数, 粉丝数
Hash 哈希
常用命令
HSET key field value
将哈希表 key 中的字段 field 的值设为 value 。
HGET key field
获取存储在哈希表中指定字段的值。
HGETALL key
获取在哈希表中指定 key 的所有字段和值
应用场景
存储部分变更数据,如用户信息等。
List 列表
常用命令
lpush
将一个或多个值插入到列表头部
lpop
移出并获取列表的第一个元素
rpush
将一个或多个值插入到列表尾部
rpop
移出并获取列表最后一个元素
LLEN key
获取列表长度
lrange
获取列表指定范围内的元素
blpop
移出并获取列表的第一个元素, 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止。
应用场景
最新消息排行等功能(比如朋友圈的时间线)
twitter的关注列表,粉丝列表
消息队列
利用Lists的push的操作,将任务存储在list中,然后工作线程再用pop操作将任务取出进行执行。
Set 集合
常用命令
SADD key member1 [member2]
向集合添加一个或多个成员
SREM key member1 [member2]
移除集合中一个或多个成员
SPOP key
移除并返回集合中的一个随机元素
SMEMBERS key
返回集合中的所有成员
SCARD key
获取集合的成员数
SUNION key1 [key2]
返回所有给定集合的并集
SINTER key1 [key2]
返回给定所有集合的交集
SDIFF key1 [key2]
返回给定所有集合的差集
SISMEMBER key member
判断 member 元素是否是集合 key 的成员
应用场景
set类似list,特殊之处是set可以自动排重。
set还提供了某个成员是否在一个set内的接口,这个也是list没有的。
共同好友
利用唯一性,统计访问网站的所有独立ip
好友推荐时,根据tag求交集,大于某个阈值就可以推荐
Sort Set 有序集合
常用命令
ZADD key score1 member1 [score2 member2]
向有序集合添加一个或多个成员,或者更新已存在成员的分数
ZRANGE key start stop [WITHSCORES]
通过索引区间返回有序集合成指定区间内的成员
ZREM key member [member ...]
移除有序集合中的一个或多个成员
ZCARD key
获取有序集合的成员数
应用场景
sorted set的使用场景与set类似,区别是set不是自动有序的,而sorted set可以通过用户额外提供一个优先级(score)的参数来为成员排序,并且是插入有序的,即自动排序。
比如:twitter 的public timeline可以以发表时间作为score来存储,这样获取时就是自动按时间排好序的。
比如:全班同学成绩的SortedSets,value可以是同学的学号,而score就可以是其考试得分,这样数据插入集合的,就已经进行了天然的排序。
另外还可以用Sorted Sets来做带权重的队列,比如普通消息的score为1,重要消息的score为2,然后工作线程可以选择按score的倒序来获取工作任务。让重要的任务优先执行。
排行榜
带权重的消息队列
0 条评论
下一页