项目实战:关于Redis的使用

1, 缓存穿透,缓存雪崩,缓存击穿问题和解决

**1.缓存穿透:**是指缓存和数据库中都没有的数据,而用户不断发起请求,造成数据库的压力倍增的情况。例:发起为id值为-1的数据或id为特别大不存在的数据。
解决方案:布隆过滤器(Bloom Filter)。/接口鉴权,添加校验/将查询不到的空数据存缓存中,设置过期时间很短(不推荐,内存压力大)
** 2.缓存雪崩:**缓存服务器宕机或者大量缓存集中某个时间段失效,导致请求全部去到数据库,造成数据库压力倍增的情况,这个是针对多个key而言。
解决方案:key值存的时候过期时间都设置成不一样的(可用随机值)
**3.缓存击穿:**redis过期后的一瞬间,有大量用户请求同一个缓存数据,导致这些请求都去请求数据库,造成数据库压力倍增的情,针对一个key而言。
缓存击穿与缓存雪崩的区别是这里针对的是某一热门key缓存,而雪崩针对的是大量缓存的集中失效。
解决方案:设置热点数据永远不过期/添加互斥锁,保证同一时刻只有一个线程可以访问数据库

2, Redis数据持久化方案

RDB:将一段时间内数据快照到rdb文件中,RBD生效是设置save属性,save m n;m秒内n次键值发生变化就自动触发RBD持久化,设置多个save时满足任一个都会触发持久化
AOF:将执行过的命令都存起来,AOF生效是appendonly yes,AOF持久化策略:always每次都持久化(太慢),everysec每秒一次(适合),no操作系统决定(不安全)
一般RBD和AOF结合使用,都生效,先查询AOF,没有的话用RBD

3, Redis为什么快

单线程;基于内存操作;丰富的数据结构;采用了非阻塞 I/O 多路复用机制
Redis在6.0以后支持多线程配置(需要开启),引入多线程主要是为了提高网络 IO 读写性能,虽然,Redis6.0 引入了多线程,但是 Redis 的多线程只是在网络数据的读写这类耗时操作上使用了,执行命令仍然是单线程顺序执行。因此也不需要担心线程安全问题。

4, Redis基本数据类型和应用场景,以及常用命令

通用命令:keys,exists,del,expire,ttl,type
String(缓存数据,配置信息,用户信息):get,set,INCR,DECR
hash(缓存数据,用户信息,商品信息):HEXISTS,HKEYS,HVALS,HMSET,HGETALL
list(消息队列,分页查询),LPUSH,LRANGE,LPOP,
set(去重,交集、并集、差集,用户标签,好友关系),SADD,Smembers
sort set(排行榜)zadd,zrem,zcount

5, Redis缓存数据怎么和数据库保持一致

1。延时双删(可以)
2。先更新数据库再删除缓存(可以)
3。双写一致性,同步更新
4。Redis事务(不太可用,Redis并非严格ACID事务)
5。用 Redisson 实现读锁和写锁

6,Redis删除策略和配置内存淘汰策略

定期删除+惰性删除
定期删除是redis默认每个100ms检查,是否有过期的key,有过期key则删除。但是,redis不是每个100ms将所有的key检查一次,而是随机抽取进行检查;
惰性删除则是在查询key的时候看一下过期时间是否过期,如果过期就删除。
   但是会存在key既没有没定时删除命中,也没有被查询惰性删除掉,内存就越来越高,这时候就应该采用内存淘汰机制
内存淘汰策略:
volatile-lru:从已设置过期时间的数据集中挑选最近最少使用的数据淘汰
volatile-ttl:从已设置过期时间的数据集中挑选将要过期的数据淘汰
volatile-random:从已设置过期时间的数据集中任意选择数据淘汰
allkeys-lru:从数据集中挑选最近最少使用的数据淘汰
allkeys-random:从数据集中任意选择数据淘汰
no-enviction(默认策略)(驱逐):禁止驱逐数据,新写入操作会报错
ps:如果没有设置 expire 的key, 不满足先决条件(prerequisites); 那么 volatile-lru, volatilerandom 和 volatile-ttl 策略的行为, 和 noeviction(不删除) 基本上一致。

7, Redis缓存刷新策略:

内存淘汰策略;超时剔除;主动更新

8, Redis事务实现

Redis支持事务,但不是严格的ACID,保证了一致性(命令失败的时候可以回滚到之前的操作)和隔离性(单线程),但是原子性有待商榷,(Redis解释的事务是原子性的:所有的命令,要么全部执行,要么全部不执行。而不是完全成功。因为Redis语法错误(编译器错误不通过)会回滚,Redis类型错误(运行时的错误),不会回滚,而是继续执行,不保证事务持久化,因为Redis有数据持久化策略
MULTI :开启事务,redis会将后续的命令逐个放入队列中,然后使用EXEC命令来原子化执行这个命令系列。
EXEC:执行事务中的所有操作命令。
DISCARD:取消事务,放弃执行事务块中的所有命令。
WATCH:监视一个或多个key,如果事务在执行前,这个key(或多个key)被其他命令修改,则事务被中断,不会执行事务中的任何命令。
UNWATCH:取消WATCH对所有key的监视。
WATCH 命令可以为 Redis 事务提供 check-and-set (CAS)/乐观锁行为。
watch命令就是用来解决这个问题的,watch在该客户端上监控一组具体的key,在MULTI开启事务后, EXEC 执行之前,如果对watch的key进行修改,就会记录当前key的”版本号”,在真正提交事务的时候,如果发现当前服务器上的key的版本号已经超过了事务开始时的版本号,就会让事务执行失败, 事务中所有的数据都不会发生改变,回滚数据;
watch本质上是给exec加了个判定条件,属于"乐观锁"
EXEC 返回nil-reply来表示事务已经失败,

8. Redis集群:主从同步/复制、哨兵模式、Cluster

9,Redis锁实现分布式锁

10,Redis缓存是怎么用的:

①查询数据的时候先去查缓存;
②缓存未命中,再去查询数据库,
③然后将数据库的数据同步添加、更新到Redis缓存中,
④这样下次查询数据时可以命中缓存。
可以用spring提供的缓存注解**@Cacheable**,也可以手动添加缓存键值,用RedisTemplate或者Jedis
牵扯涉及了数据一致性问题,缓存雪崩,缓存击穿问题,Redis常用数据类型和命令问题

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值