一、redis和缓存相关概念
redis是C语言开发的一个开源的高性能key-value键值对的内存数据库。单进程单线程,线程安全,采用IO多路复用机制。
缓存击穿
:大量请求同一个key,当这个key在失效的瞬间,大并发请求直接打到DB上缓存穿透
:频繁请求缓存和数据库中都不存在的数据。缓存雪崩
:缓存大面积同一时间点失效,所有请求直接打到DB上。二级缓存
:当需要缓存大量数据的时候可以使用Redis缓存数据库来保存Mybatis的二级缓存数据。原子性
:
在单线程中,能够在单条指令中完成的操作都可以认为是原子操作,因为中断只 能发生在指令之间。
在多线程中,不能被其他进程(线程)打断的操作就叫原子操作。
二、redis的2种持久化策略
Redis支持数据的持久化。为了保证效率,数据缓存在了内存中,但是会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件中,以保证数据的持久化。
- RDB:快照形式是直接把内存中的数据保存到一个 dump 的文件中,定时保存。如果你非常关心你的数据,但仍然可以承受数分钟内的数据丢失,那么可以只使用
RDB
持久。 - AOF:把所有的对 Redis 的服务器进行修改的命令都存到一个文件里(命令的集合)。
AOF
的默认策略是每秒钟 Fsync 一次,在这种配置下,就算发生故障停机,也最多丢失一秒钟的数据,但处理巨大的写入会降低Redis的性能,且AOF
的文件体积通常要大于RDB
文件的体积。
Redis 默认是快照 RDB
的持久化方式,但Redis 支持同时开启 RDB
和 AOF
,系统重启后,Redis 会优先使用 AOF
来恢复数据,因为 AOF
文件保存的数据集通常比 RDB
文件所保存的数据集更完整,这样丢失的数据会最少。
三、redis的3种集群方式
- 主从复制:Redis支持数据的备份,即master-slave模式的数据备份,可以一主多从。缺点:主机从机的宕机都会导致前端部分读写请求失败,需要等待机器重启或者手动切换前端的IP才能恢复。
- 哨兵模式:哨兵模式是基于主从模式的,所有主从的优点,哨兵模式都具有。哨兵的作用就是监控Redis系统的运行状况。它的功能包括两个:(1)监控主服务器和从服务器是否正常运行。(2)主服务器出现故障时自动将从服务器转换为主服务器。
集群:redis的哨兵模式基本已经可以实现高可用,读写分离 ,但是在这种模式下每台redis服务器都存储相同的数据,很浪费内存,所以在redis3.0上加入了cluster模式,实现的redis的分布式存储,也就是说每台redis节点上存储不同的内容。Redis-Cluster采用无中心结构,它的特点如下:
所有的redis节点彼此互联(PING-PONG机制),内部使用二进制协议优化传输速度和带宽。
- 节点的fail是通过集群中超过半数的节点检测失效时才生效。
- 客户端与redis节点直连,不需要中间代理层.客户端不需要连接集群所有节点,连接集群中任何一个可用节点即可。
四、redis的5种数据类型及内存存储方式
redis内部使用redisObject类型表示Key和Value对象。
如上图所示:type表示一个value对象是何种数据类型,encoding表示不同数据类型再redis内部的存储方式。比如:type=string encoding=raw or int
string
Value 可以是字符串,也可以是数字。String 类型是二进制安全的,意思是 Redis 的 String 类型可以包含任何数据,比如 jpg 图片或者序列化的对象。String 类型的值最大能存储 512M。
hash
是一张 String 的 Key 和 Value 的映射表,Hash 特别适合存储对象。常用命令:hget,hset,hgetall 等。
list
string类型的列表,按照插入顺序排序,可以用做消息队列。可以添加元素到头部或尾部。常用命令:lpush、rpush、lpop、rpop、lrange(获取列表片段)。
set
string类型的无序集合,自动去重,且提供了判断某个元素是否在set中。常用命令:sadd、spop、smembers、suion等。
zset(sotred set)
string类型的有序集合,自动去重,自动排序。通过用户提供的double类型的score参数来为成员排序。
五、redis的6种淘汰策略
从已设置过期时间的KV集中选择(3种)
- 最近最少用
- 剩余时间最短
- 随机选择
从所有KV集中选择(2种)
- 最近最少用
- 随机选择
- 不淘汰