Redis【简介&安装篇】 - 知乎 (zhihu.com)
【1】什么是redis,谈谈你对redis的理解
redis 就是一个数据库,不过与传统数据库不同的是, redis 的数据是key-value存储在内存中的,所以读写速度非常快,因此 redis 被广泛应用于缓存方向。redis 提供了五种数据类型来支持不同的业务场景。
【2】redis常见数据结构以及使用场景分析
-
String,常规计数场景:微博数,粉丝数,页面访问次数等,涉及命令:incr、decr、incrby、decrby。
-
List,列表场景:微博的关注列表,粉丝列表,消息列表,涉及指令:lrange(进行分页查询)
-
Hash,存储对象信息:用户信息,商品信息。
-
Set,求交集场景:共同关注、共同粉丝、共同喜好,涉及指令:sinterstore。
-
SortedSet,排行榜场景:网易云音乐歌曲排行榜、在线用户列表,直播弹幕消息。
【3】redis设置过期时间了解吗
redis中有个设置时间过期的功能,即对存储在 redis 数据库中的key可以设置一个过期时间。作为一个缓存数据库,这是非常实用的。如我们一般项目中的token或者一些登录信息以及短信验证码都是有时间限制的,按照传统的数据库处理方式,一般都是自己判断过期,这样无疑会严重影响项目性能。使用redis的expire指令可以很好的完成这个需求。
【4】redis是怎么对过期的key进行删除的?
定期删除+惰性删除。
定期删除:redis默认是每隔 100ms 就随机抽取一些设置了过期时间的key,检查其是否过期,如果过期就删除。注意这里是随机抽取的。为什么要随机呢?你想一想假如 redis 存了几十万个 key ,每隔100ms就遍历所有的设置过期时间的 key 的话,就会给 CPU 带来很大的负载!
惰性删除 :定期删除可能会导致很多过期 key 到了时间并没有被删除掉。所以就有了惰性删除。假如你的过期 key,靠定期删除没有被删除掉,还停留在内存里,除非你的系统去查一下那个 key,才会被redis给删除掉。这就是所谓的惰性删除,也是够懒的哈!
【5】redis 持久化机制
RDB、AOF。
RDB方式:创建数据库快照来持久化redis服务器的数据,将数据保存到rdb文件中。
AOF方式:开启AOF持久化后每执行一条会更改Redis中的数据的命令,Redis就会将该命令写入硬盘中的AOF文件,从而实现redis的持久化,并且还会定时的重写AOF文件,以免文件过大。
【6】AOF 重写
AOF重写机制并不是对原AOF文件进行重写,而是创建一个临时的AOF文件,然后根据redis的键值对来实现数据持久化,最后再覆盖原AOF文件。重写后的AOF文件和原AOF文件存储的数据一样,但是大小会更轻。
redis基础
- Redis是一个开源的,使用ANSI C 编写的,高性能Key-Value的NoSQL数据库。所以很有必要了解了解redis的key和value。
- key只能是字符串,value常用的数据结构类型:String(点赞)、List(评论楼层)、Hash(常用)、Set(共同关注)、SortedSet(排行榜)
redis持久化
- redis是一款基于内存的NoSQL数据库,数据都存储在内存中,一旦机器出现宕机,或者突发意外断电等,导致机器无法正常工作的情况下,那么redis中的数据就丢失了,面对这种问题,redis提供了持久化机制将数据保存到本地磁盘中,以便在服务器宕机之后,可以对数据进行恢复。
- Redis持久化,就是将内存中的数据,永久保存到磁盘上。
Redis持久化有两种方式:RDB(快照模式)、AOF(追加模式、命令重演)。 - RDB(快照模式):在默认情况下,Redis 将数据库快照保存在名字为dump.rdb的二进制文件中,可以在redis.conf配置文件中修改持久化信息。
- AOF(追加模式、命令重演):采用追加的方式保存,默认文件为appendonly.aof;记录所有的写操作命令,在服务启动的时候重演这些命令就可以还原数据库;AOF默认关闭,需要在配置文件中手动开启。
redis集群
- 所谓的集群,就是通过添加服务器的数量,提供相同的服务,从而让服务器达到一个稳定、高效的状态(高可用)。
- 单个redis存在不稳定性。当redis服务宕机了,就没有可用的服务了。单个redis的读写能力是有限的。redis集群是为了强化redis的读写能力、确保服务的高可用。
- redis集群中,每一个redis称之为一个节点。redis集群中,有两种类型的节点:主节点(master)、从节点(slave)。redis集群,是基于redis主从复制模式实现的。
- redis主从复制模式:主从复制模式中,有多个redis节点。其中,有且仅有一个为Master,而Slave可以有多个。并且只要网络连接正常,Master会一直将自己的数据同步更新给Slaves,保持主从同步。
- 主从模式下,当Master宕机了,整个集群就没有可写的节点了。显然主从模式不是我们想要的集群方式。因为Slave上备份了Master的所有数据,那在Master宕机的情况下,如果能够将Slave变成一个Master,是不是就可以解决这个问题了呢?这个就是哨兵Sentinel的作用
- Sentinel哨兵模式:
- **监控(Monitoring):Sentinel会不断地检查Master和Slave是否运作正常。
**提醒(Notification):当被监控的某个Redis服务器出现问题时,Sentinel可以通过API向管理员或者其他应用程序发送通知。
**自动故障迁移(Automatic failover): 当Master不能正常工作时,Sentinel会开始一次自动故障迁移操作,它会进行选举,将其中一个Slave升级为新的Master,其他的Slave改为新Master的Slave;当客户端试图连接失效的Master时,集群会向客户端返回新Master的地址,使得集群可以使用新Master代替失效Master。