1. 什么是Redis
Redis,英文全称是Remote Dictionary Server(远程字典服务),是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。
2.Redis的基本数据结构类型
Redis 提供了丰富的数据类型,常见的有五种:String(字符串),Hash(哈希),List(列表),Set(集合)、Zset(有序集合)。
随着 Redis 版本的更新,后面又支持了四种数据类型: BitMap(2.2 版新增)、HyperLogLog(2.8 版新增)、GEO(3.2 版新增)、Stream(5.0 版新增)。
redis内部使用一个redisObject对象来表示所有的key和value,redisObject最主要的信息如上图所示:type表示一个value对象具体是何种数据类型,encoding是不同数据类型在redis内部的存储方式。比如:type=string表示value存储的是一个普通字符串,那么encoding可以是raw或者int。
3.Redis 的相关技术
3.1 数据怕丢失 -> 持久化(RDB/AOF)
redis 提供了两种持久化的方式,分别是RDB(Redis DataBase)和AOF(Append Only File)。
RDB,简而言之,就是在不同的时间点,将 redis 存储的数据生成快照并存储到磁盘等介质上;
AOF,则是换了一个角度来实现持久化,那就是将 redis 执行过的所有写指令记录下来,在下次 redis 重新启动时,只要把这些写指令从前到后再重复执行一遍,就可以实现数据恢复了。
持久化方案的选择:
- 业务对于数据丢失不敏感,选 RDB
- 业务对数据完整性要求比较高,选 AOF
其实 RDB 和 AOF 两种方式也可以同时使用,即混合持久化。在这种情况下,如果 redis 重启的话,则会优先采用 AOF 方式来进行数据恢复,这是因为 AOF 方式的数据恢复完整度更高。
3.2 恢复时间久 -> 主从副本(副本随时可切)
在采用持久化恢复数据时依旧是需要时间的,在这期间你的业务应用无法提供服务,这怎么办?
一个实例宕机,只能用恢复数据来解决,那我们是否可以部署多个 Redis 实例,然后让这些实例数据保持实时同步,这样当一个实例宕机时,我们在剩下的实例中选择一个继续提供服务就好了。,这个方案就是【主从复制:多副本】。
读存在压力 -> 扩容副本(读写分离)
3.3 故障手动切换慢 -> 哨兵集群(自动切换)
主从复制存在问题在于:当 master 宕机时,我们需要「手动」把 slave 提升为 master,这个过程也是需要花费时间的。此时,可以引入一个【观察者】,让这个观察者去实时监测 master 的健康状态,这个观察者就是「哨兵」。
具体做法:
- 哨兵每间隔一段时间,询问 master 是否正常
- master 正常回复,表示状态正常,回复超时表示异常
- 哨兵发现异常,发起主从切换
3.4 写存在压力/容量瓶颈 -> 分片集群
3.4.1 redis 数据分片方案
3.4.2 redis分布式存储方案
4. Redis 内存淘汰策略
- noeviction:默认策略,当内存不足以容纳新写入数据时,新写入操作会报错。
- volatile-random:当内存不足以容纳新写入数据时,从设置了过期时间的key中,随机淘汰数据;
- volatile-lru:当内存不足以容纳新写入数据时,从设置了过期时间的key中使用LRU(最近最少使用)算法进行淘汰;
- volatile-ttl:当内存不足以容纳新写入数据时,在设置了过期时间的key中,根据过期时间进行淘汰,越早过期的优先被淘汰;
- volatile-lfu:4.0版本新增,当内存不足以容纳新写入数据时,在过期的key中,使用LFU算法进行删除key。
- allkeys-random:当内存不足以容纳新写入数据时,从所有key中随机淘汰数据。
- allkeys-lru:当内存不足以容纳新写入数据时,从所有key中使用LRU(最近最少使用)算法进行淘汰。
- allkeys-lfu:4.0版本新增,当内存不足以容纳新写入数据时,从所有key中使用LFU算法进行淘汰;