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

相关推荐
煎饼小狗1 小时前
Redis五大基本类型——Zset有序集合命令详解(命令用法详解+思维导图详解)
数据库·redis·缓存
秋意钟3 小时前
缓存雪崩、缓存穿透【Redis】
redis
简 洁 冬冬3 小时前
046 购物车
redis·购物车
soulteary3 小时前
突破内存限制:Mac Mini M2 服务器化实践指南
运维·服务器·redis·macos·arm·pika
wkj0014 小时前
php操作redis
开发语言·redis·php
菠萝咕噜肉i5 小时前
超详细:Redis分布式锁
数据库·redis·分布式·缓存·分布式锁
登云时刻6 小时前
Kubernetes集群外连接redis集群和使用redis-shake工具迁移数据(二)
redis·容器·kubernetes
Dlwyz9 小时前
redis-击穿、穿透、雪崩
数据库·redis·缓存
工业甲酰苯胺11 小时前
Redis性能优化的18招
数据库·redis·性能优化
Oak Zhang14 小时前
sharding-jdbc自定义分片算法,表对应关系存储在mysql中,缓存到redis或者本地
redis·mysql·缓存