前言:以下相关内容多为图片,参考链接、附上少量文字解释,以便整理脉络,以作复习巩固之用。若需详细了解,请查阅相关资料或者观看相关课程。如有错误,敬请指出,谢谢。
redis
参考链接:搞懂这些Redis知识点
一、redis简介
Redis 是 C 语言开发的一个开源的(遵从 BSD 协议)高性能键值对(key-value)的内存数据库,可以用作数据库、缓存、消息中间件等。
NoSQL(not-only sql,泛指非关系型数据库)的数据库
1、存储方式上:Memcache 会把数据全部存在内存之中,断电后会挂掉,数据不能超过内存大小。Redis 有部分数据存在硬盘上,这样能保证数据的持久性。
2、数据支持类型上:Memcache 对数据类型的支持简单,只支持简单的 key-value,,而 Redis 支持五种数据类型。
3、使用底层模型不同:它们之间底层实现方式以及与客户端之间通信的应用协议不一样。Redis 直接自己构建了 VM 机制,因为一般的系统调用系统函数的话,会浪费一定的时间去移动和请求。
4、Value 的大小:Redis 可以达到 1GB,而 Memcache 只有 1MB。
二、redis常用数据类型
ping->pong
string二进制安全
incr
Redis 内部使用一个 redisObject 对象来表示所有的 key 和 value
注:hset、hmset却可以一次性写入多个属性值
1、String 是 Redis 最基本的类型,一个 Key 对应一个 Value。Value 不仅是 String,也可以是数字。
String 类型是二进制安全的,意思是 Redis 的 String 类型可以包含任何数据,比如 jpg 图片或者序列化的对象。String 类型的值最大能存储 512M。
2、Hash是一个键值(key-value)的集合。Redis 的 Hash 是一个 String 的 Key 和 Value 的映射表,Hash 特别适合存储对象。
3、List 列表是简单的字符串列表,按照插入顺序排序。
应用场景:List 应用场景非常多,也是 Redis 最重要的数据结构之一,省份列表可以用list
数据结构:List 就是链表,可以用来当消息队列用
4、Set 是 String 类型的无序集合
应用场景:Redis Set 对外提供的功能和 List 一样是一个列表,特殊之处在于 Set 是自动去重的,而且 Set 提供了判断某个成员是否在一个 Set 集合中,返回0表示已经存在
5、Zset 和 Set 一样是 String 类型元素的集合,且不允许重复的元素。
使用场景:Sorted Set 可以通过用户额外提供一个优先级(score)的参数来为成员排序,并且是插入有序的,即自动排序。
实现方式:Redis Sorted Set 的内部使用 HashMap 和跳跃表(skipList)来保证数据的存储和有序,HashMap 里放的是成员到 Score 的映射。
而跳跃表里存放的是所有的成员,排序依据是 HashMap 里存的 Score,使用跳跃表的结构可以获得比较高的查找效率,并且在实现上比较简单。
三、从海量数据里查询某一固定前缀的key
注:keys patten 可能阻塞
四、如何实现分布式锁
分布式锁:
是控制分布式系统或不同系统之间共同访问共享资源的一种锁的实现,利用互斥来防止彼此干扰,进而保证一致性。
分布式锁需要解决的问题:
1、互斥性
2、安全性
3、死锁
4、容错
参考链接:如何解决Redis雪崩、穿透、并发等5大难题
注意:集中过期和缓存雪崩有关
缓存雪崩:
数据未加载到缓存中,或者缓存同一时间大面积的失效,从而导致所有请求都去查数据库,导致数据库CPU和内存负载过高,甚至宕机。
缓存穿透:
缓存穿透是指查询一个一不存在的数据。例如:从缓存redis没有命中,需要从mysql数据库查询,查不到数据则不写入缓存,这将导致这个不存在的数据每次请求都要到数据库去查询,造成缓存穿透。
缓存击穿:
缓存击穿是指一个 Key 非常热点,在不停地扛着大量的请求,大并发集中对这一个点进行访问,当这个 Key 在失效的瞬间,持续的大并发直接落到了数据库上,就在这个 Key 的点上击穿了缓存。
处理缓存雪崩简单,在批量往 Redis 存数据的时候,把每个 Key 的失效时间都加个随机值就好了,这样可以保证数据不会再同一时间大面积失效。
setRedis(key, value, time+Math.random()*10000);
五、如何实现异步队列
六、持久化方式之RDB
参考链接:redis持久化AOF与RDB配置
注意:
redis.conf
src/dump.rdb
持久化备份策略save
stop-writes-on-bgsave-error yes当备份出错,主进程就停止写入,保护持久化数据一致性
rdbcompression yes指定存储至本地数据库时是否压缩数据,默认是yes
七、持久化方式之AOF以及混合模式
appendonly no 默认是不开启aof的,想用设置为yes
appendfilename 'appendonly.aof'
这下面日志重写没看懂
注:
重写AOF文件的操作,并没有读取旧的AOF文件,
而是将整个内存中的数据库内容用命令的方式重写了一个新的AOF文件
RDF和AOF文件共存情况下的恢复流程:
存在AOF则从aof恢复,否则从RDF
RDB-AOF混合持久化:
BGSAVE做镜像全量持久化,AOF做增量持久化