目录
1、介绍一下redis?
2、memcache和redis的区别?
3、redis是单进程单线程的吗?
4、一个字符串类型能够存储的最大容量是多少?
5、redis的持久化机制?各自的优缺点?
6、缓存穿透、缓存击穿、缓存雪崩的定义及解决办法
7、redis为什么这么快?
8、redis的过期策略及内存淘汰机制
9、redis的同步机制了解吗?
10、redis如何以指令形式设置密码和验证密码?
11、怎么理解redis的事务?
12、redis事务相关的命令有哪几个?
13、如何测试redis的连通性
14、redis如何做内存优化?
15、一个 Redis 实例最多能存放多少的 keys?List、Set、Sorted Set 他们最多能存放多少元素?
16、MySQL 里有 2000w 数据,redis 中只存 20w 的数据,如何保证 redis 中的数据都是热点数据?
17、如果有大量的 key 需要设置同一时间过期,一般需要注意什么?
18、redis的常用场景?
19、使用过 Redis 做异步队列么,你是怎么用的?
20、redis分布式锁使用原理?
1、介绍一下redis?
1、redis是一个免费开源、遵循bsd协议的高性能的key-value数据库
2、redis运行在内存中,但支持持久化到磁盘,重启的时候可以再次加载使用
3、具有丰富的数据类型。支持String、list、set、zset、hash5种常用类型及hyperloglog、geo、pub/sub等复杂类型
4、性能极高,支持11万/秒的读取速度及8万/秒的写速度。查找和操作的时间复杂度都是 O(1)
5、redis的所有操作都是原子的
6、支持事务
2、memcache和redis的区别?
1、memcacahe将数据全部存储在内存中,不能持久化,redis可以将数据持久化到磁盘。
2、memcache只支持简单的字符串类型,redis具有丰富的数据类型
3、redis的速度比memory更快
4、使用的底层模型及客户端使用的通信协议不同。
3、redis是单进程单线程的吗?
是,redis利用队列技术将并发访问变为串行访问,消除了传统数据库串行访问的开销。
4、一个字符串类型能够存储的最大容量是多少?
512M
5、redis的持久化机制?各自的优缺点?
redis的持久化机制有两种:rdb和aof,默认为rdb
rdb: 单独创建 fork一个子进程,将当前的父进程的数据库数据复制到子进程的内存中,然后由子进程写入临时文件中,持久化结束后,再让这个临时文件替换上次的快照文件,然后子进程退出,内存释放。
优点:
1、只有一个文件dump.rdb,方便持久化。
2、容灾性好,一个文件可以保存到安全的磁盘
3、性能好。fork()一个子进程来完成写操作,主进程继续处理命令,io最大化。
4、数据集大时,启动速度高于aof
缺点:
1、数据安全低。rdb是间隔一段时间进行持久化。如果在持久化过程中redis发生故障,会发生数据丢失。适合对数据完整性要求不高的情况
2、fork子进程的时候也会使主进程有短暂的阻塞,当数据集大或fork频率高时,也会使redis发生
阻塞。
aof: redis会将每一个收到的写命令通过write函数写入到文件中,类似于mysql的binlog.当重启的时候,redis会重新执行这些命令在内存中重建整个数据库的内容。
优点:
1、数据安全。aof持久化可以配置appendfsync属性为always,每执行一次命令就记录一次
2、这种记录执行命令的方式,及时宕机,也可以redis-check-aof解决数据一致性问题
3、aof的rewrite机制。
缺点:
1、aof比rdb文件大,且恢复速度慢。
2、数据集大的时候,比rdb启动效率低。
当两种方式同时开启,redis会优先选择aof
6、缓存穿透、缓存击穿、缓存雪崩的定义及解决办法
1、缓存雪崩
缓存中的大量key集中失效,致使高并发情况下,大量请求同时访问数据库。
解决办法:1、加锁 2、分散key的失效时间 3、缓存预热
2、缓存击穿
热点key突然失效,致使高并发情况下对该key的访问同时访问数据库,
解决办法:1、加锁 2、热点数据不过期
3、缓存穿透
大量请求访问一个数据库和缓存中都没有的数据,致使每次都去查询数据库
解决办法:1、布隆过滤器 2、存null
3、接口层做用户鉴权:这种大量请求数据库及缓存中没有的数据的行为不常见,可能是恶意的攻击行为,因此可以通过鉴权的方式在接口层过滤掉非法请求。
7、redis为什么这么快?
1、纯内存操作
2、单线程操作。避免了频繁的上下文切换
3、采用了非阻塞的io多路复用机制
8、redis的过期策略及内存淘汰机制
redis的过期策略: 定期删除+惰性删除
什么是定期删除+惰性删除?
定期删除,redis默认每隔100ms对key进行随机抽取检查,发现过期key则删除。
因为是随机抽样,所以必定有部分过期key没有及时删除,redis在用户每次获取key的时候会进行检查,如果key设置了过期时间并且已过期了,才会删除。这就是惰性删除
为什么不使用定时删除策略?
定时删除就是设置一个定时器,过期则将key进行删除,这样的确具有能够及时释放内存的好处。但是这会严重的消耗cpu性能,在高并发的情况下,redis要将时间应用在处理请求而不是删除操作上。而且在今天,内存的成本越来越低的情况下,以空间换时间的做法尤为普遍。
这种定期删除+惰性删除的过期策略有什么坏处?
这种随机抽取+用户请求key删除的方法必然导致 一些已经过期但未被抽取到也没被用户请求的数据在内存中激增,造成内存占用越来越高。
针对上述情况,redis的内存淘汰策略是什么呢?
redis提供了6种内存不足时的 内存淘汰策略,在redis.conf中通过以下形式设置
maxmemory-policy + 策略名称
1、 volatile-lru 在设置了过期时间的key中,挑选最近最少使用的数据进行删除
2、 volatile-ttl 在设置了过期时间的key中,挑选将要过期或已经过期的数据进行删除
3、 volatile-random 在设置了过期时间的key中,随机挑选数据进行删除
4、 allkeys-lru 在所有key中,挑选最近最少使用的数据进行删除、
5、 allkeys-random 在所有key中,随机挑选数据进行删除
6、 no-enviction 禁止驱逐数据,新写入操作将会直接报错
备注:倘若所有key都没有设置过期时间,则设置了1、2、3、策略等同于设置了 no-enviction
一般情况下使用策略的规则?
如果数据呈现幂率分布,也就是一部分数据访问高,一部分数据访问低,则采用allkeys-lru
如果数据呈现平等分布,所有数据的访问频率相同,则采用allkeys-random
9、redis的同步机制了解吗?
1、redis可以主从同步,从从同步。
第一次同步时,主节点做一次bgsave,并同时将后续修改操作记录到内存buffer,待完成后,将rdb文件全量同步到复制节点,复制节点接收后将rdb镜像加载到内存。加载完成后,在通知主节点将期间修改的记录同步到复制节点进行重放就完成了同步过程。
10、redis如何以指令形式设置密码和验证密码?
1、设置密码:config set requirepass 123456
2、验证密码:auth 123456
11、怎么理解redis的事务?
Redis
事务功能是通过
MULTI
、
EXEC
、
DISCARD
和
WATCH
四个原语实现的
Redis
会将一个事务中的所有命令序列化,然后按顺序执行。
1.redis
不支持回滚
“Redis
在事务失败时不进行回滚,而是继续执行余下的命令
”
, 所以
Redis
的内部可以保持简单且快速。
2.
如果在一个事务中的命令出现错误,那么所有的命令都不会执行;
3.
如果在一个事务中出现运行错误,那么正确的命令会被执行。
1
)
MULTI
命令用于开启一个事务,它总是返回
OK
。
MULTI
执行之后,客户端可以继续向服务器发送任意多条命令,这些命令不会立即被执
行,而是被放到一个队列中,当
EXEC
命令被调用时,所有队列中的命令才会被执行。
2
)
EXEC
:执行所有事务块内的命令。返回事务块内所有命令的返回值,按命令执行的先后顺序排列。当操作被打断时,返回空值
nil
。
3
)通过调用
DISCARD
,客户端可以清空事务队列,并放弃执行事务, 并且客户端会从事务状态中退出。
4
)
WATCH
命令可以为
Redis
事务提供
check-and-set
(
CAS
)行为。 可以监控一个或多个键,一旦其中有一个键被修改(或删除),之
后的事务就不会执行,监控一直持续到
EXEC
命令
12、redis事务相关的命令有哪几个?
multi、exec、discard、watch
13、如何测试redis的连通性
ping
14、redis如何做内存优化?
(问内存优化而不是内存不足时的处理策略)
内存优化方法:主要是在存储层面,如对于一些对象类型,尽量使用hash类型存储。而不是为对象的每一个属性都设置一个单独的key.
15、一个 Redis 实例最多能存放多少的 keys?List、Set、Sorted Set 他们最多能存放多少元素?
理论上可以存储2^32,因此实际上是取决内存的大小
16、MySQL 里有 2000w 数据,redis 中只存 20w 的数据,如何保证 redis 中的数据都是热点数据?
(共2000w,只能存20w, 这个问题是想问redis的内存淘汰策略怎么选)
选择 allkeys-lru 作为内存淘汰策略。
17、如果有大量的 key 需要设置同一时间过期,一般需要注意什么?
redis中大量key集中过期,在那个情况下,可能会出现卡顿现象.,高并发情况下,有可能出现缓存雪崩,可以设置时间的时候加一下随机值,使得过期时间分散一些。
18、redis的常用场景?
1、会话缓存
2、全页缓存
3、队列
4、排行榜/计分器
5、发布订阅



