Redis学习思维导图
2023-12-13 18:32:48 0 举报
AI智能生成
11111
作者其他创作
大纲/内容
Redis基础
Redis基础命令
遍历键
keys:全量遍历键,
用来列出所有满足特定正则字符串规则的key,
当redis数据量较大时,性能比较差(单线程)
scan:渐进式遍历键,
不能保证完整的遍历出来所有的键
基本数据结构
String
常用操作
INCR key //将key中储存的数字值加一
DECR key //将key中储存的数字值减一
INCRBY key increment //将key中储存的值加上increment
DECRBY key decrement //将key中储存的值减去decrement
原子加减
SET key value //存入字符串键值对
MSET key value [key value ...] //批量存储字符串键值对SETNX key SETNX key value //存入一个不存在的字符串键值对
GET key //获取一个字符串键值
MGET key [key ...] //批量获取字符串键值
DEL key [key ...] //删除一个键
EXPIRE key seconds //设置一个键的过期时间(秒)
应用场景
单值缓存
对象缓存
分布式锁
SETNX product:10001 true //返回1代表获取锁成功
SETNX product:10001 true //返回0代表获取锁失败
。。。。。。执行业务操作
DEL product:10001 //执行完业务代码释放锁
SET product:10001 true ex 10 nx //防止程序意外终止导致死锁
计数器
INCR article:readcount:{文章id}
Get article:readcount:{文章id}
Web集群Session共享:spring session + redis实现session共享
分布式系统全局序列号:INCRBY orderId 1000 //redis批量生成序列号提升性能
Hash哈希
常用操作
HSET key field value //存储一个哈希表key的键值
HSETNX key field value //存储一个不存在的哈希表key的键值
HMSET key field value [field value .] //在个哈希表key中存储多个键值对
HGET key field //获取哈希表key对应的field键值
HMGET key field [field ...] //批量获取哈希表key中多个field键值
HDEL key field field ...] //删除哈希表key中的field键值
HLEN key //返回哈希表key中field的数量
HGETALL key //返回哈希表key中所有的键值
HINCRBY key field increment //为哈希表key中field键的值加上增量increment
应用场景
对象缓存
电商购物车
优点
1.同类数据归类整合储存,方便数据管理
2.相比string操作消耗内存与cpu更小
3.相比string储存更节省空间
缺点
1.过期功能不能使用在field上,只能用在key上
2.Redis集群架构下不适合大规模使用
List列表
常用操作
LPUSH key value [value ...] //将一个或多个值value插入到key列表的表头(最左边)
RPUSH key value [value ..] //将一个或多个值value插入到key列表的表尾(最右边)
LPOP key //移除并返回key列表的头元素
RPOp key //移除并返回key列表的尾元素
LRANGE key start stop //返回列表key中指定区间内的元素,区间以偏移量start和stop指定
BLPOP key [key ...] timeout //从key列表表头弹出一个元素,若列表中没有元素,阻塞等待timeout秒,如果timeout=0.一直阳塞等待
BRPOP key [key ...] timeout //从key列表表尾弹出一个元素,若列表中没有元素,阻塞等待timeout秒,如果timeout=0,一直阻塞等待
应用场景
常用数据结构
Stack(栈) = LPUSH + LPOP
Queue(队列) = LPUSH + RPOP
Blocking MQ(阻塞队列) = LPUSH + BRPOP
微博消息和微信公众号消息
Set集合
常用操作
SADD key member [member ...] //往集合key中存入元素,元素存在则忽略若key不存在则新建
SREM key member [member ...] //从集合key中删除元素
SMEMBERS key //获取集合key中所有元素
SCARD key //获取集合key的元素个数
SISMEMBER key member //判断member元素是否存在于集合key中
SRANDMEMBER key [count] //从集合key中选出count个元素,元素不从key中删除
SPOP key [count] //从集合key中选出count个元素,元素从key中删除
运算操作
SINTER key [key ...] //交集运算
SINTERSTORE destination key [key .] //将交集结果存入新集合destination中
SUNION key [key ..] //并集运算
SUNIONSTORE destination key [key ...] //将并集结果存入新集合destination中
SDIFF key [key ...] //差集运算
SDIFFSTORE destination key [key ...] //将差集结果存入新集合destination中
应用场景
微信抽奖小程序
1.点击参与抽奖加入集合
SADD key {userID}
2.查看参与抽奖的所有用户
SMEMBERS key
3.抽取count名中奖者
SRANDMEMBER key [count]/SPOP key [count]
微信微博点赞,收藏,标签
集合操作实现微博微信关注模型
集合操作实现电商商品筛选
zset有序集合
常用操作
ZADD key score member [[score member]...] //往有序集合key中加入带分值元素
ZREM key member [member ...] //从有序集合key中删除元素
ZSCORE key member //返回有序集合key中元素member的分值
ZINCRBY key increment member //为有序集合key中元素member的分值加increment
ZCARD key //返回有序集合key中元素个数
ZRANGE key start stop [WITHSCORES] //正序获取有序集合key从start下标到stop下标的元素
ZREVRANGE key start stop [WITHSCORES] //倒序获取有序集合key从start下标到stop下标的元素
Zset集合操作
ZUNIONSTORE destkey numkeys key [key ...] //并集计算ZINTERSTORE destkey numkeys key [key ...] //交集计算
应用场景
Zset集合操作实现排行榜
管道(Pipeline)
Redis Lua脚本
1、减少网络开销:本来5次网络请求的操作,可以用一个请求完成,原先5次请求的逻辑放在redis服务器上完成。使用脚本,减少了网络往返时延,这点跟管道类似。
2、原子操作:Redis会将整个脚本作为一个整体执行,中间不会被其他命令插入。管道不是原子的,不过redis的批量操作命(类似msed是原子的
3、替代redis的事务功能
Lua脚本中出现死循环和耗时的运算,否则Redis会堵塞
Redis持久化
RDB快照(snapshot)
save
bgsave的写时复制(默认):生成快照的同时,依然可以正常处理写命令
save与bgsave对比
缺点:Redis因为某些原因而造成故障宕机,那么服务器将丢失最近写入,且未保存到快照中的那些数据
AOF(append-only file)
AOF持久化的实现
1.命令追加(append):Redis服务器每执行一条写命令,这条命令都会被追加到缓存区aof_buf中。
2.AOF持久化文件写入(write)和文件同步(sync):根据appendfsync参数设置的不同的同步策略,将缓存区中的数据内容同步到硬盘中
持久化三种策略
1.Always:服务器每写入一个命令,就调用一次fdatasync,将缓冲区中的命令写入到磁盘里面。
2.Everysec(默认):服务器每一秒重新调用一次fdatasync,将缓冲区中的命令写入到磁盘里面,在这种模式写
3.NO:服务器不主动调用fdatasync,由操作系统决定任何将缓冲区中的命令写入磁盘里面。
AOF重写:达到压缩的目的,子线程重写
优点:能保证数据安全和完整性,避免丢失数据
缺点:持久化启动子线程,占用资源,速度较慢
Redis4.0混合持久化
Redis的数据备份策略
通过定时调度脚本,每小时都copy一份rdb或aof的备份到一个目录中去,仅仅保留最近48小时的备份
每天都保留一份当日的数据备份到一个目录中去,可以保留最近1个月的备份
每次copy备份的时候,都把太旧的备份给删掉
每天晚上将当前机器上的备份复制一份到其他机器上,防止机器损坏
Redis主从架构
Redis主从工作原理
主从复制(全量复制)流程图
数据部分复制
主从复制(部分复制,断点续传)流程图
Redis分布式锁
缓存穿透
缓存穿透:查询一个不存在的数据,缓存层和储存层都不会命中(缓存和数据库都穿透)
原因
1.自身业务代码或者数据出现问题
2.一些恶意攻击, ;爬虫等造成大量空命中
解决方案
1.缓存空对象
2.布隆过滤器(计算key是否存在)
缓存失效(击穿)
缓存失效(击穿):由于大批量缓存在同一时间失效可能导致大量请求同时穿透缓存直达数据库,可能会造成数据库瞬间压力过大甚至挂掉。
解决方案:将缓存过期时间设置为一个时间段内的不同时间(随机时间)
缓存雪崩
原因:缓存层宕机导致大量请求访问数据库,最终导致数据库也宕机
解决方案
1.保证缓存层服务高可用性,比如使用Redis Sentinel或Redis Cluster
2.依赖隔离组件为后端限流熔断并降级,比如使用Sentinel或Hystrix限流降级组件
热点缓存key重建优化
场景:在缓存失效的瞬间,有大量线程来重建缓存,造成后端负载加大,甚至可能会让应用崩溃
解决方案:利用互斥锁来解决,此方法只允许一个线程重建缓存,其他线程等待重建缓存的进程执行完,重新从缓存获取数据即可
缓存与数据库双写不一致
解决方案(读多写少)
1.对于并发几率很小的数据,很少会发生缓存不一致,可以给缓存数据加上过期时间,每隔一段时间触发读的主动更新即可。
2.就算并发很高,业务上能容忍短时间的缓存数据不一致(如商品名称,商品分类菜单等),缓存加上过期时间依然可以解决大部分业务对于缓存的要求。
3.如果不能容忍缓存数据不一致,可以通过加分布式读写锁保证并发读写或写写的时候按顺序排好队,读读的时候相当于无锁。
4.也可以用阿里开源的canal通过监听数据库的binlog日志及时的去修改缓存,但是引入了新的中间件,增加了系统的复杂程度。
解决方案(读少写多)
1.直接操作数据库
2.把缓存作为数据读写的主存储,异步将数据同步到数据库
Redisson分布式锁
代码实现(解决上述问题)
问题:在redis master实例宕机的时候,可能导致多个客户端同时实现加锁(半数以上加锁成功,redis则认为获取锁成功)
Redis集群
原理分析
槽:将所有数据划分为16384个slots(槽位),每个节点负责其中一部分槽位。槽位的信息储存于每个节点中
槽位定位算法:Cluster默认会对key值使用crc16算法进行hash得到一个整数值,然后用这个整数值对16384进行取模来得到具体槽位
跳转重定位
Redis集群节点间的通信机制
维护集群的元数据
集中式
gossip
解决网络抖动:提供了一种选项cluster-node-timeout,表示当某个节点持续timeout的时间失联时,才可以认定该节点出现故障,需要进行主从切换,如果没有这个选项,网络抖动会导致主从切换频繁(数据的重新复制)。
Redis集群选举原理
Redis哨兵

收藏
0 条评论
下一页