一.数据类型
1.String,hash,list,set.zset
二.持久化机制
1.避免宕机后数据丢失,redis两种持久化机制:Rob 和Aof
(1)RDB:快照,容易造成数据丢失,他是根据key的更新和时间来决定持久化的
(2)AO:是日志的方式,当有更新操作的时候会写到日志到Aof文件不会造成数据丢失,但是回复数据比较慢,在生产环境中两种持久化方式都是开启,rdb是默认开启的,如果要开启aof我们可以通过修改redis.conf文件
三.常用命令
(1)String的get/set,list的lpush/rpush,keys,bgsave,
我们使用spring-data操作的redis
四.缓存击穿,穿透
缓存穿透:要查询的数据不存在,请求访问时,缓存和数据库都没有值,导致请求都会穿透到数据库,可能是业务不合理,数据误删,非法用户攻击,解决办法的话,对发发请求在网关进行校验,缓存空值和默认值,设置一个恰当的过期时间,还有就是使用布隆过滤器判断数据是否存在。
缓存雪崩:缓存的大量key失效过期,而差耍你的请求量特别大,直接命中数据库,造成数据库宕机的情况,对于大量数据过期,可以在固定过期时间上加一个随机时间,避免同时过期;Redis故障宕机,也能引起雪崩,可以搭建Redis集群
缓存击穿:和缓存雪崩有点相似,击穿针对热点key缓存,雪崩是指多个key,解决办法,可以缓存预热,提前加载热点数据,让数据别过期,再有就是缓存数据操作加锁,互斥,避免db压力
五.缓存一致性问题
无论是事务还是分布式系统的一致性问题,都分为:强一致性,弱一致性,最终一致性,其实要做到强一致性非常难,好多场景使用的都是最终一致性:
解决问题:
同步写:先更新数库,再更新redis,如果redis报异常数据库通过事务可以回滚,如果更新的过程中数据库完成了更新,redis还没更新,有其他线程来查询数据库,也会出现短暂的不一致。
延迟双删:如果对数据要求一致性比较强的时候我们可以使用双删来处理,更新数据之前删除redis中的数据,更新数据只有删除redis的数据,来保证数据的一致性;
六.内存淘汰策略
redis为了保证可用性,当内存不足的时候有响应的淘汰策略,基本原则就是最近最少使用,一个是从有过期时间的key中执行的策略,一个使用没有过期时间的key中执行,他还有随机淘汰但是没有什么价值一般不使用,我们可以通过修改redis.conf文件指定淘汰的策略
.noeviction:当内存使用到达阈值的使用,执行命令直接报错
.allkeys-lru:在所有的key中,优秀移除最近未使用的key
.volatile-lru:在设置了过期时间的键空间中,优先移除最近未使用的key
.allkeys-random:在所有的key中,随机移除某个key
.volatile-random:在设置了过期时间的键空间中,随机移除某个key
.volatile-ttl:在设置了过期时间的键空间中,具有更早过期时间的key优先移除
七.Redis调优
链接:
八.Redis分布式锁
Redis如何实现分布式锁
分布式锁的核心:加锁和释放锁,redis通过setnx加锁,通过超时间避免死锁,当我们执行业务完成之后就会释放锁(删除redis中的key,锁库存:lock商品id=null(可以存所锁的唯一id))
锁超时:会造成无锁状态:系统忙于不忙接口的响应是不一样的,我们无法设置一个恰当的超时时间,需要有现成去监控锁,对锁延时
锁误删:
Redis加锁和设置锁超时是两个命令,保证不了原子性需要通过lua脚本来保证原子性
Redisson框架实现分布式锁
===========================================
//初始化Redissson客户端
DistributedLocker.init("127.0.0.1","6379);
//加锁
DistributedLocker.lock("lock_key");
try{
//执行业务逻辑
//..
}finally{
//解锁
DistributedLocker.unlock("lock_key");
}
====================
九.Redis集群
Redis的集群模式有:主从模式 sentinel 哨兵模式 redis cluster模式