redis问题总结

1、什么是redis

Redis是一个基于内存的高性能key-value数据库

2、redis与Memcache的区别

1)、存储方式

memcache把数据全部存储到内存中,如果出现断电数据会全部丢失,数据不能超过内存的大小

redis既可以把数据放到内存中,也可以将数据保存到磁盘中,进行持久化

2)、数据类型

Memcache的数据类型比较简单

redis不仅仅支持简单的key-value类型的数据,还提供了list、set、zset,hash、Pub/Sub、HyperLogLog 等数据结构的存储

3)、使用底层模型不同

它们之间底层的实现方式以及与客户端的通信的应用协议不同

4)、value的大小

redis最大可以达到1GB,而Memcache只有1MB

4、为什么redis需要把所有数据放到内存中

Redis为了达到最快的读写速度,将数据都读到内存中,并通过异步的方式将数据写入磁盘。所以redis具有快速和数据持久化的特征。

如果不将数据放到内存中,磁盘I/O速度会严重影响redis性能。如果设置了最大使用内存,则数据量达到内存限制值之后,将不能继续插入新值

5、如果通过Redis实现分布式锁

先用setnx(时间复杂度O(1)、原子性操作)来争抢锁,抢到之后,再用expire给锁加一个过期时间防止忘记释放,导致死锁

注意:如果setnx之后,并且在expire之前,进程意外崩溃或者要重启维护了,这个锁永远得不到释放

解决方法:使用set指令复杂的参数,可以同时把setnx和expire合并成一条指令 (原子性)。

例:

Set key value ex 过期时间 nx   

6、如何在Redis里全部查询出固定前缀开头的key?

使用key命令可以扫出指定模式的key列表。但是,如果redis正在给线上业务提供服务,由于redis是单线程的,所以keys命令会导致线程阻塞一段时间,线上业务会停顿,直到命令执行完毕。

解决方法:可以使用scan命令,scan命令可以无阻塞的提取出指定模式的key列表,会有一定的重复概率,在客户端做一次去重就可以了。

例:

scan 0 match key* count 10

7、如果有大量的key需要设置同一时间过期,需要如何处理?

如果大量的key过期时间设置过于集中,那么到了过期时间那个时间点可能会出现短暂的卡顿。

解决方法:由于expire时间是个long类型,所以在设置过期时间时可以加上一个随机数,使得过期时间分散一些。

8、Redis如何持久化?

使用bgsave做镜像全量持久化,aof做增量持久化

因为bgsave会消耗较长的时间,达不到实时,在停机的时候会丢失最近一次的快照数据,所以需要aof来记录除查询以外的操作命令,然后做日志回放进一步做持久化。

9、Bgsave原理?

1)、检查是否存在IOF或者RDB子进程,防止子进程竞争,如果存在返回错误。

2)、如果不存在触发持久化调用rdbSaveBackground

3)、系统调用fork();创建进程,实现了copy-on-write

4、主进程执行其他操作,子进程执行rdb操作

猜你喜欢

转载自www.cnblogs.com/dasha/p/10857576.html
今日推荐