redis的数据类型
redis中有5种数据类型
string
list:相当于java中的linkedList,插入删除操作快,查询慢
hash:相当于java中的hashMap
set:相当于java中的hashSet,无序的
zset:相当于sortedSet,有序集合
redis的持久化
redis持久化有两种方式,AOF和RDB
RDB通过创建快照的方式保存某个时间点的全量数据,是redis默认的持久化方式。优点占用空间小,恢复速度快。缺点:不能做到实时的持久化,必定会有数据丢失的问题。
AOF(Append-Only-File)是通过以文件日志的形式来记录所有变更数据库状态的指令,以append形式追加到AOF文件中,在服务下次启动后就可以加载AOF文件来恢复服务器关闭时数据库原来的状态。
优点:相对于RDB来说,支持秒级的持久化,数据丢失很小。缺点:文件占用空间大,恢复速度慢,性能影响较大。
Redis从4.0之后就采用AOF和RDB混合的方式来进行持久化,定期由RDB进行持久化,在两次RDB快照期间内AOF完成数据的备份,尽可能减少数据的丢失,提高性能。缺点是旧版本不支持该混合持久化方式,并且RDB快照备份阅读性差。
缓存穿透、缓存击穿、缓存雪崩问题
缓存穿透
在短时间内,大量请求一个缓存和数据库中都不存在的数据,造成数据库短时间内承受大量请求而崩掉。
解决方案:
1)做接口校验,过滤掉已知的可能发生的这种请求
2)将已知的不存在的key在缓存中设置null值,可已设置过期时间,防止暴力请求
3)设置一个布隆过滤器,将所有可能存在的数据添加到bitMap中,一定不存在的key会被过滤掉,拦截此类请求发送到数据库
缓存击穿
缓存中可能没有数据但是数据库中有数据(也有可能是缓存过期的情况),短时内大量请求该key值,导致数据库压力过大崩掉。
解决方案:
1)延长热点key的过期时间
2)使用互斥锁,给热点key加锁,许多请求发到redis时,需要获取锁,只有一个请求可以获取到锁,没有获取到的进行等待,获取到锁的去访问数据库,查询回来数据并且更新缓存中的数据。
缓存雪崩
同一时间大量的key失效,并且在该时间段内有大量请求访问这些失效的key,导致大量请求转发到数据库致使数据库崩溃。
解决方案:设置缓存过期时间时可以加一个随机数,这样每个key的过期时间重复率就会降低,减少全部失效过期的情况。