Redis基本知识

一、什么是Redis

Redis是一种基于内存的数据库,对数据的读写操作都是在内存中完成,因此读写速度非常快,用于存储键值对、缓存、消息队列、分布式锁等。

二、Redis和mencached的区别

相同:都是基于内存的数据库,读写都很快

不同:

1.Redis支持的数据类型更丰富(string、list、hash、set、zset);而mencached只支持string

2.Redis支持数据的持久化,可以将内存中数据保存在磁盘中,重启的时候可以重新加载使用;mencached没有持久化功能

3.Redis原生支持集群模式

三、Redis实现持久化

1.AOF日志:Redis在执行完一条写操作命令后,把该命令以追加的方式写入到一个文件里面(先执行后写入),重启Redis时会读取该文件里的命令逐一操作来进行数据恢复

2.AOF重写机制:当AOF日志过大时,读取每一条键值对最新的操作命令记录到新的AOF文件中。相当于压缩了AOF日志。

3.RDB快照:每次执行把内存中所有的数据都记录到磁盘中,这样恢复数据的效率会比AOF高些。用save(主线程里执行)和bgsave命令。

4.混合持久化:工作在AOF日志重写的过程。新的AOF文件前半部分是RDB格式的全量数据,后半部分是AOF格式的增量数据。重启时由于前半部分是RDB全量数据所以加载速度会很快,后半部分的增量数据会使丢失的数据更少。

四、Redis实现服务高可用

1.主从复制:主服务器进行读写操作;从服务器只进行读操作;主服务器将写操作同步到从服务器

2.哨兵模式:哨兵群进行监控,当主服务器发生故障,选举出新的主服务器

五、Redis过期删除策略

1.惰性删除:数据库访问key时才检测key是否过期

2.定期删除:每隔一段时间随机从数据库中取出一定数量的key进行检查

六、Redis内存淘汰算法

1.LRU(least recently used,最近最少使用算法):最新操作的键会被移动到表头

2.Redis采用的近似LRU算法:在Redis对象结构体中添加一个额外字段来记录此数据的最后一次访问时间,使用随机采样的方式淘汰数据

3.缓存污染问题:应用一次读取了大量的数据,而这些数据只会被读取这一次,那么这些数据会留存在 Redis 缓存中很长一段时间,造成缓存污染。

解决:用LFU(least frequently used,最近最不常用)算法,根据访问次数而不是访问时间来淘汰

ps:过期删除策略,是删除已过期的 key,而当 Redis 的运行内存已经超过 Redis 设置的最大内存之后,则会使用内存淘汰策略删除符合条件的 key

七、Redis的三大缓存问题

1.缓存雪崩:大量数据同时过期,或Redis故障宕机,大量请求直接访问数据库导致数据库压力骤增

解决方法:

(1)均匀设置过期时间

(2)设置互斥锁。访问到过期数据,在对其进行缓存重构时加锁(锁要设置超时时间避免阻塞)。未能获得互斥锁的要么等待要么返回默认值或空值

(3)后台更新缓存

(4)服务器熔断或请求限流

(5)构建高可用的Redis主从集群

2.缓存击穿:频繁被访问的热点数据过期了,也会导致大量请求直接访问数据库

解决方法:

(1)互斥锁

(2)后台更新缓存

3.缓存穿透:数据在缓存和数据库里都没有。缓存里找不到->访问数据库->数据库找不到无法重构缓存

解决方法:

(1)限制非法请求

(2)设置空值或默认值,后续请求得到该值后不会继续访问数据库

(3)使用布隆过滤器(位图+哈希函数)。写入数据库数据时用布隆过滤器做标记,缓存失效后去布隆过滤器里快速判断数据是否存在。这样请求只会访问混存和布隆过滤器

八、Redis保证数据库和缓存一致性

先更新数据库,再删除缓存。并用以下两种方法异步操作缓存

1.重试机制:引入消息队列记录删除缓存的操作。删除缓存失败的话可以从消息队列中读数据重试删除操作

2.订阅MySQL binlog:更新数据库的时候产生一条日志记录在binlog里,通过订阅binlog日志拿到具体要操作的数据再去删除缓存

参考文档:小林coding图解Redis

相关推荐
CoderJia程序员甲3 小时前
重学SpringBoot3-集成Redis(一)
java·redis·缓存·springboot
speop3 小时前
408笔记|随笔记录|自用|2
java·redis·笔记
王维诗里的代码i4 小时前
Redis基础二(spring整合redis)
java·数据库·redis·spring
技术卷4 小时前
Redis数据库与GO完结篇:redis操作总结与GO使用redis
数据库·redis·golang
盒马盒马4 小时前
Redis:list类型
数据库·redis
wclass-zhengge6 小时前
Redis篇(Redis原理 - 网络模型)
网络·数据库·redis
周周写不完的代码6 小时前
redis-数据类型
数据库·redis·缓存
JarvisO9 小时前
SpringBoot+Redis+RabbitMQ完成增删改查
spring boot·redis·java-rabbitmq
weixin_4381973811 小时前
linux部署redis,整合ansible和redis
linux·redis·git
周周写不完的代码16 小时前
Redis-持久化机制
数据库·redis·缓存