数据类型
- string :key-value 单个数据
- list :key-value1,value2… 列表 可重复
- set :key-value1,value2… 列表 不可重复
- hash :key-
, … 键值对,filed不可重复 - sortset:key-
, … score必须是数值,member不可重复 - geo :key-<经度,维度,value>,key-<经度,维度,value>… value 唯一
bitmap:key-vlue1,value2… 列表 值只能存储0或1
持久化
RDB :
- redis 会创建一个子进程来进行持久化,主进程不进行任何IO操作(确保了 redis 的极高性能)
- 在不同的时间点将 redis 存储的数据生成快照并存储到磁盘上
- 在持久化过程中会先将数据写道临时文件中,等持久化过程结束后用临时文件替换上次持久化好的文件
- 若两次持久化之间出现故障可能会导致数据丢失
- AOF :
- 将 redis 执行过的所有写操作记录下来,下次 redis 重启时将这些指令从前到后重复执行
- 每秒钟记录一次,即使redis故障最多丢失最近1秒中的数据
-
事务
Redis的事务:命令序列化执行,但没有原子性
- 单独的隔离操作 :事务中的命令会被序列化执行,不会被其他命令插入
- 没有隔离级别的概念 :队列中的命令未被提交前没有预执行(或者说redis事务本身就是最高的隔离级别),也就不存在隔离级别
- 不能保证原子性 :在一个事务中,即使命令报错后续命令也会继续执行,没有回滚操作
在开启事务之前,先通过watch命令去监听一个或多个key,在开启事务之后,如果有其他客户端修改了我监听的key,事务会自动取消。
如果执行了事务,或者取消了事务,watch监听自动消除,一般不需要手动执行unwatch。
过期策略
- 定时删除 :redis会为每一个设置了有效期的key设置一个定时器,当过期时间来临时就会删除key
- 定期删除 :Redis每隔一段时间就去会去查看Redis设置了过期时间的key,会再100ms的间隔中默认查看3个key
惰性删除 :如果当你去查询一个已经过了生存时间的key时,Redis会先查看当前key的生存时间,是否已经到了,直接删除当前key,并且给用户返回一个空值
淘汰机制
在Redis内存已经满的时候,添加了新数据会执行淘汰机制
指定淘汰机制的方式:maxmemory-policy 具体策略
设置Redis的最大内存:maxmemory 字节大小volatile-lru :在设置过了生存时间的key中干掉一个最近最少使用的key
- allkeys-lru :在全部的key中干掉一个最近最少使用的key
- volatile-lfu :在设置过了生存时间的key中干掉一个最近最少频次使用的key
- allkeys-lfu :在全部的key中干掉一个最近最少频次使用的key
- volatile-random :在设置过了生存时间的key中随机干掉一个
- allkeys-random :在全部的key中随机干掉一个
- volatile-ttl :在设置过了生存时间的key中干掉一个剩余生存时间最少的key
-
主从(复制)
Redis 的复制(replication)功能允许用户根据一个 Redis 服务器来创建任意多个该服务器的复制品,其中被复制的服务器为主服务器(master),而通过复制创建出来的服务器复制品则为从服务器(slave)
全量同步 :- 从服务器向主服务器发送SYNC命令
- 主服务器接收SYNC命令,开始执行BGSAVE并记录此后执行的所有写命令
- BGSAVE执行完毕,向所有从服务器发送快照文件,继续记录被执行的写命令
- 从服务器收到快照文件,丢弃所有旧数据,载入快照
- 与此同时,主服务器快照发送完毕后开始向从服务器发送缓冲区的写命令
- 从服务器完成快照载入后开始接收命令请求并执行来自主服务器缓冲区的写命令
增量同步 :
主服务器每执行一个写命令就会向从服务器发送相同的写命令,从服务器接收并执行收到的写命令
哨兵
- 监控
Redis sentinel 是一个分布式系统中监控 redis 主从服务器,并在主服务器下线时自动进行故障转移
其中三个特性:
监控(Monitoring): Sentinel 会不断地检查你的主服务器和从服务器是否运作正常
提醒(Notification): 当被监控的某个 Redis 服务器出现问题时, Sentinel 可以通过 API 向管理员或者其他应用程序发送通知
自动故障迁移(Automatic failover): 当一个主服务器不能正常工作时, Sentinel 会开始一次自动故障迁移操作
特点:
1、保证高可用
2、监控各个节点
3、自动故障迁移
缺点:主从模式,切换需要时间丢数据
没有解决 master 写的压力
集群
穿透
当查询的数据redis中没有,数据库中也没有的时候,大量的访问请求就会落在数据库上(一般为恶意攻击)
解决方案:
- 当在数据库中未查询到时,在redis中添加一个空值
如果是根据id查询,将id的最大值存在redis中,在向数据库查询之前比较一下id
击穿
当redis存储的热点数据过期时,造成大量的请求访问数据库
解决方案:热点数据不设置有效期
当redis中没有时,直接添加锁,让第一个请求去访问数据库并将结果写入redis
倾斜
将热点数据全部存放在一个redis服务器上,造成大量请求访问redis最终导致redis宕机
解决方案 :扩展主从架构,搭建从节点,缓解redis压力
- 在JVM中设置二级缓存
雪崩
当redis中大量的热点数据过期时(或是redis出现问题),造成大量的请求访问数据库并导致数据库宕机
解决方案: