什么是redis?
redis是一个高性能的非关系型数据库,使用c语言编写,与传统数据的不同是,它存在于内存中。读写速率非常快,每秒可以处理超过10万次的读写操作(QPS是每秒读写),常常被用作缓存
Redis的优缺点
优点:
- 读写性能好,读的速度可以达到110000次/s,写的速度可以达到81000次/s
- 支持数据持久化,有AOF跟RDB两种持久化方式,数据结构丰富,支持String,List,Set,Hash等结构
- 支持事务,Redis所有的操作都是原子性的。并且还支持几个操作合并后的原子执行,(要么都执行成功执行,要么都失败不执行)
- 支持主从复制,主机自动将数据复制给从机,进行读写分
缺点:
- Redis是将数据存在内存中,受到内存大小的限制,不能做海量数据的读写
- Redis不具备自动容错和恢复功能,主机或者从机宕机会到前端部分请求读写失败,需要重启机器或者手动切换前段的IP才能切换
Redis为什么这么快?为什么Redis6.0之前采用单线程而不采用多线程?
Redis快的原因: 1.运行在内存中 2.数据结构简单 3.实现多路I/O复用技术 4.单线程实现,单线程避免了线程的切换、锁等造成性能的开销 Redis6.0之前是单线程的,为什么Redis6.0之前采用单线程而不采用多线程? 单线程的Redis的瓶颈通常存在CPU的IO,几乎不会存在CPU成为瓶颈的情况。使用Redis主要瓶颈在内存和网络上面。单线程也有它的优点:系统的复杂度较低,维护性高,避免了并发读写所带来的问题。
Redis为什么6.0之后引入多线程?
Redis的瓶颈主要存在于内存和网络,引入多线程的问题为了解决网络IO的瓶颈,执行命令依旧是单线程,不存在线程安全问题。Redis不是默认开启单线程,需要修改配置文件redis.conf:io-threads-do-reads no,将no改为yes。
Redis的数据类型
Redis的常用数据类型:String,Hash,Set,List,Zset。不常用的数据类型:Bitmap,HyperLogLog,Geospatial Bitmap:位图,一个以位为单位的数组,数组中只能存在0或1,数组的下标在Bitmap中叫做偏移量。布隆过滤器就用到这种数据结构。布隆过滤器可以判断哪些数据一定不在数据库中,用来解决redis缓存穿透的问题。 Hyperloglog:统计基数的数据集合类型。缺点统计规则基于概率完成,给出的统计结果是有一定误差的,标准误差率是0.81%。优点:输入元素数量或者体积非常大时,计算基数所用的空间总是固定的、并且是很小的。应用场景:统计网站的UV。 Geospatial:主要存储地理位置信息。
Redis的主要数据结构
Redis的数据结构有简单动态字符串、链表、字典、跳跃表、整数集合、压缩列表等
- 简单动态字符串:Redis底层使用C语言编写,Redis并没有采用C语言传统的字符串表示,构建出一种名为简单动态字符串的抽象类型
- 链表:提供高效的节点重拍能力,以顺序性的节点访问方式,可以通过增删节点的方式灵活调整链表的长度。
- 字典:又称符号表,关联数组,映射,用于保存键值对(key-value pair)的抽象数据结构。Redis数据库使用字典来实现的,对数据库的增删改查也是基于对字典的操作上的
- 整数集合:当一个集合只包含整数值元素时,并且这个集合的元素数量不多时,Redis采用整数集合作为集合键的底层实现。
- 压缩列表:压缩列表是Redis为了节约内存开发的,是由一系列特殊编码的连续内存块组成的顺序型数据结构
- 对象:Redis没有直接使用这些数据结构创造对象,基于这些数据结构创建了一个对象系统。这个系统包括字符串对象、列表对象、哈希对象、集合对象和有序集合对象,每种对象都至少使用一种所介绍的数据结构
对象系统的优点:
- 通过五种不同的对象,Redis可以在执行命令之前,根据对象的类型来判断一个对象是否可以执行给定的命令
- 针对不同的使用场景,为对象设置多种不同的数据结构实现,从而优化对象在不同场景下的使用效率
- 实现了基于引用计数技术的内存回收机制
- Redis通过引用计数技术实现了对象共享机制,在适当的条件下,通过多个数据库键共享一个对象节约内存。
底层数据结构与对象系统的对应关系:
跳跃表详解 跳跃表是一种有序的数据结构,通过每个节点中维持多个指向其他节点的指针,从而达到快速访问节点的目的。跳跃表支持平均O(logN)和最坏O(N)复杂度的节点查找。可以通过顺序型来批量处理节点。可以进行二分查找的有序链表,跳表在原有的有序链表中添加了多级索引。通过索引提高了搜索的性能,也提高了插入和删除的性能。
Redis只在两个地方用到了跳跃表:实现有序集合键和集群节点中用作内部数据结构。
理想的跳表,上一层的索引节点的数量都是下一层的1/2,跳表的时间复杂度是O(logN),空间复杂度O(N),是一个空间换时间的策略,图中是用存储数字举例,如果存储较大的对象,所浪费的空间可以忽略不记,索引节点中只存储关键值和几个指针,并不存储对象。
跳表相比较于红黑树的优点:
- 内存占用少,使用自定义化参数决定使用多少内存
- 查询性能至少不必红黑数差
- 简单更容易实现和维护
Redis中的跳表和普通跳表有什么区别
- Redis中的跳表score允许重复,即跳表中的key允许重复,如果分数重复,需要根据数据内容进行字典排序。普通跳跃表不支持
- 第一层中的链表是一个双向链表,方便以一个倒序的方式获取一个范围内的元素
- Redis跳表中可以很方便的计算出每个元素的排名
一个字符串类型的值最大能存储的最大容量是多少?
一个字符串类型键的允许存储的数据最大容量是512MB
注意:本文归作者所有,未经作者允许,不得转载