Redis数据类型的使用场景
- String:其value可以储存string以及数字类型,一般用于复杂的技术功能上。
- Hash:其value存放的是结构化的对象,可以方便地操作某个字段,我使用它实现过用户行为数据缓存以及session功能。
- List:类似Python中的list数据类型,我一般使用它做消息队列或者分页功能。
- Set:该数据结构储存的是一系列无序、不重复的数据,还提供差集、交集等功能。我使用它为爬虫去重以及用户阅读过的文章功能。
- Sorted Set:有序集合储存一系列有序、不重复的数据,大多数场景都使用它做一个榜单的功能。
Redis的一些缺点
- Redis将所有数据放在内存中以便加快访问的速度,但这也造成了Redis容量受到物理内存大小的限制,所以Redis对于一些海量数据场景有些乏力。
- Redis的在线扩容比较麻烦。如果Redis集群数量到达上限时,此时在线扩容是一个十分复杂的问题,大大提高了运维的成本。
Redis的过期策略以及内存淘汰机制
- Redis采用了定时删除+惰性删除的方式来删除过期的数据。这里的定时删除,Redis并非将所有设置过期时间的key都遍历一遍,如果这样做将会消耗大量的CPU资源。Redis采用了随机抽样,如果被抽到的key过期了就删除。但如果仅仅是这样,那么有可能一些数据永远不会被抽到。这时Redis引入了惰性删除,在访问KEY的时候检查一下是否过期,过期就删除。
- 如果Redis仅仅采用上面两种方式来删除数据,那么在极端情况下仍然会有数据不会被删除。Redis还有内存淘汰策略,我最常使用的是allkeys-lru。当Redis内存到达上限时,它从所有key中寻找最近最少使用的KEY删除。
大量数据插入Redis应该怎么做?
使用正常模式来插入显然不是一个明智的选择,而使用管道的话某些客户端会被阻塞,导致不能在这期间执行其他的命令。比较好的方案是根据Redis协议生成一个文件,然后使用pipe mode去执行这个文件。参考Redis Mass Insertion。
Redis分区?
- Redis的分区是指将数据分割成多个子集,分别保存到不同的Redis实例中,每一个Redis实例都只保存了KEY的一个子集。
- Redis的分区在涉及多个key操作的时候,多数是不支持的,更别说多key事务操作。对于备份的情况也比较复杂。
- Redis分区有两种类型:
- 按照范围分区,映射一定范围的对象到特定的Redis实例,但这种并不长使用。
- 使用hash分区,其工作原理使用了hash表的原理,类似Python dict。
Redis如何做集群?
推荐使用官方的Redis Cluster,其实现原理是:Redis集群内部有214个哈希槽。当需要插入key时,首先对key使用crc16算法计算出一个数字,在用此数字对214取余,该取余结果就是数据存放的哈希槽位置。而Redis集群的节点管理这使用类似哨兵的机制来实现,集群类节点通过相互ping来判断节点是否能够连接。如果过半数节点都连接不上一个节点,则Redis集群就会认定此节点宕机了。该方案确并不能保证数据的强一致性,所以在使用时一定不要将Redis作为一个高可靠性的存储服务使用!
Redis如何做持久化?
Redis支持两种持久化方案:
- 快照:通过对配置文件的设置,可以使Redis在N秒类M个key被修改时就将内存的数据以快照的方式写入到后缀为’.rdb’文件中。
- AOF: 每一次收到一次写的命令就将此命令追加到后缀为’.aof’文件中,当Redis重启时会通过重新执行文件中保存的写命令来在内存中重建整个数据库的内容。