redis是一种基于内存的数据库,读写速度快,常用于缓存、消息队列等场景。 remote dictonary service,远程字典服务器 使用c语言进行编写的
Redis的特性
- 支持持久化,RDB、AOF
- 支持丰富的数据类型,string、list、hash、set、zset
- 支持数据的备份,也就是主从复制
Redis的优点
- 性能极高,操作redis就是操作内存、单线程避免了多线程之间的竞争、采用IO多路复用机制,用一个线程监听多个socket。
- 具备高并发,QPS可以轻松破10w
- 原子操作,执行命令由单线程负责,不存在并发竞争问题
- 丰富的特性
Redis的基本命令
select indesx
获取子串命令 getrange key strat end
设置子串 setrange key offset newvalue
累加的命令
Redis的数据类型
string:缓存对象、常规计数。
使用SDS(简单动态字符串)进行实现
- SDS是二进制安全的,可以包含任何数据(图片、音频、视频),包括空字符‘\0’,根据len属性值而不是空字符来判断字符串是否结束。
- SDS获取字符串长度的时间复杂度为O(1)
- SDS拼接字符串不会导致缓冲区溢出,会进行检查并在不足时进行扩容
list:消息队列
- 如果元素个数小于512个,每个元素值小于64字节,会使用压缩列表作为底层数据结构
- 否则使用双向链表作为底层数据结构
- 3.2版本之后使用quicklist来实现
hash:缓存对象、购物车
- 如果元素个数小于512个,每个元素值小于64字节,会使用压缩列表作为底层数据结构
- 否则使用哈希表作为底层数据结构
- 7.0版本后,使用listpack数据结构来实现
set:聚合计算场景,点赞、共同关注、抽奖活动
- 如果元素个数小于512个,每个元素值小于64字节,会使用整数集合作为底层数据结构
- 否则使用哈希表作为底层数据结构
zset:排序场景,排行榜、电话、姓名排序
- 如果元素个数小于128个,每个元素值小于64字节,会使用压缩列表作为底层数据结构
- 否则使用跳表作为底层数据结构
- 7.0版本后采用listpack数据结构来实现
持久化
定义 redis的读写操作都是在内存中,所以redis的性能才会高,但当redis重启后,内存中的数据就会丢失,未来保证内存中的数据不会丢失,redis就实现了数据持久化,把数据存储到磁盘。
RDB持久化 RDB 快照就是记录某一个瞬间的内存数据,记录的是实际数据
优点
- 适合大规模数据的恢复,恢复速率比较快
- 数据的完整性和一致性不高,可以使用RDB
- 数据恢复的文件是二进制的
缺点:
- 数据完整性和一致性不高,有可能丢失更多的数据
- 采用子进程的形式
AOF持久化 Redis 在执行完一条写操作命令后,就会把该命令以追加的方式写入到一个文件里,然后 Redis 重启时,会读取该文件记录的命令,然后逐一执行命令的方式来进行数据恢复。
优点 数据的完整性与一致性更高
缺点 数据的恢复速率比较慢,导致文件的大小比较大
该如何选择持久化的方式?
- 数据恢复速率快选择RDB,如果比较完整选择AOF
- 两种持久化的方式是可以同时使用的
单独使用任何一种持久化的方式都可以启动服务器,如果AOF持久化的方式是唯一的持久化方式,并且AOF文件损坏了,那么服务器是无法启动的。
Redis集群
主从赋值 是Redis高可用服务的最基本的保证,实现方案就是将从前的一台Redis服务器,同步数据到多台从Redis服务器上,且主从服务器之间采用的是读写分离的方式。 主服务器可以进行读写操作,当发生写操作时自动将写操作同步给从服务器,而且从服务器一般只是只读,并且接收主服务器同步过来的写操作命令,然后执行这条命令。
哨兵模式 哨兵模式可以监控主从服务器,并且提供主从节点故障转移的功能。
切片集群模式 当Redis缓存数据量达到一台服务器无法缓存时,就需要使用切片集群,将数据分布在不同的服务器上,来降低系统对单节点的依赖,从而提高redis服务器的读写性能。
Redis过期删除与内存淘汰
过期删除 redis可以对key设置过期时间,因此需要有对应的机制来将已过期的键值对删除。
删除策略:惰性删除+定期删除
- 惰性删除:不主动删除过期键,每次从数据库访问 key 时,都检测 key 是否过期,如果过期则删除该 key。
- 定期删除:每隔一段时间「随机」从数据库中取出一定数量的 key 进行检查,并删除其中的过期key。
内存淘汰 当redis的运行内存达到了某个阈值时,就会触发内存淘汰机制。
- 不进行数据淘汰的策略
- noeviction,不淘汰任何数据,直接返回错误
- 进行数据淘汰的策略
- 范围:设置了过期时间内的数据
- volatile-random,随机淘汰设置了过期时间的任意键值
- volatile-ttl,优先淘汰更早过期的键值
- volatile-lru,淘汰所有设置过期时间的键值中,最久未使用的键值
- volatile-lfu,淘汰所有设置过期时间的键值中,最少使用的键值
- 范围:所有数据
- allkeys-random,随机淘汰任意键值
- allkeys-lru,淘汰整个键值中最久未使用的键值
- allkeys-lfu,淘汰整个键值中最少使用的键值
- 范围:设置了过期时间内的数据