
课程咨询: 400-996-5531
投诉建议: 400-111-8989
认真做教育 专心促就业
Redis数据库的学习和应用是大多数软件编程开发程序员都需要熟练掌握的一个编程知识点,而本文我们就再来了解一下,Redis数据库基础知识分享。
1)string
当你保存64位有符号整数时,String类型会把它保存为一个8字节的Long类型整数,这种保存方式通常也叫作int编码方式。
但是,当你保存的数据中包含字符时,String类型就会用简单动态字符串(SimpleDynamicString,SDS)结构体来保存,
buf:字节数组,保存实际数据。为了表示字节数组的结束,Redis会自动在数组后加一个“\0”,这就会额外占用1个字节的开销。
len:占4个字节,表示buf的已用长度。
alloc:也占个4字节,表示buf的实际分配长度,一般大于len。
另外,对于String类型来说,除了SDS的额外开销,还有一个来自于RedisObject结构体的开销。一个RedisObject包含了8字节的元数据和一个8字节指针。
当字符串大于44字节时,SDS的数据量就开始变多了,Redis就不再把SDS和RedisObject布局在一起了,而是会给SDS分配独立的空间,并用指针指向SDS结构。
2)统计模式
聚合统计,就是指统计多个集合元素的聚合结果,包括:统计多个集合的共有元素(交集统计);把两个集合相比,统计其中一个集合独有的元素(差集统计);统计多个集合的所有元素(并集统计)。
Set的差集、并集和交集的计算复杂度较高,在数据量较大的情况下,如果直接执行这些计算,会导致Redis实例阻塞。小建议:你可以从主从集群中选择一个从库,让它专门负责聚合计算,或者是把数据读取到客户端,在客户端来完成聚合统计。
在面对需要展示新列表、排行榜等场景时,如果数据更新频繁或者需要分页显示,建议你优先考虑使用SortedSet。
二值状态就是指集合元素的取值就只有0和1两种。Bitmap本身是用String类型作为底层数据结构实现的一种统计二值状态的数据类型。
基数统计就是指统计一个集合中不重复的元素个数。
3)GEO
GEO类型的底层数据结构就是用SortedSet来实现的。
Redis采用了业界广泛使用的GeoHash编码方法,这个方法的基本原理就是“二分区间,区间编码”。
对于一个地理位置信息来说,它的经度范围是[-180,180]。GeoHash编码会把一个经度值编码成一个N位的二进制值,我们来对经度范围[-180,180]做N次的二分区操作,其中N可以自定义。
4)异步机制
和客户端交互时的阻塞点。复杂度高的增删改查操作肯定会阻塞Redis。
一个阻塞点:集合全量查询和聚合操作。
二个阻塞点:bigkey删除操作。
三个阻塞点:清空数据库。
和磁盘交互时的阻塞点。Redis开发者早已认识到磁盘IO会带来阻塞,所以就把Redis进一步设计为采用子进程的方式生成RDB快照文件,以及执行AOF日志重写操作。
四个阻塞点了:AOF日志同步写。
主从节点交互时的阻塞点。在主从集群中,主库需要生成RDB文件,并传输给从库。主库在复制的过程中,创建和传输RDB文件都是由子进程来完成的,不会阻塞主线程。
五个阻塞点:加载RDB文件。
Redis主线程启动后,会使用操作系统提供的pthread_create函数创建3个子线程,分别由它们负责AOF日志写操作、键值对删除以及文件关闭的异步执行。
5)内存碎片
Redis释放的内存空间可能并不是连续的,那么,这些不连续的内存空间很有可能处于一种闲置的状态。
这就会导致一个问题:虽然有空闲空间,Redis却无法用来保存数据,不仅会减少Redis能够实际保存的数据量,还会降低Redis运行机器的成本回报率。
内存碎片的形成有内因和外因两个层面的原因。简单来说,内因是操作系统的内存分配机制,外因是Redis的负载特征。
Redis是内存数据库,内存利用率的高低直接关系到Redis运行效率的高低。为了让用户能监控到实时的内存使用情况,Redis自身提供了INFO命令。
这里有一个mem_fragmentation_ratio的指标,它表示的就是Redis当前的内存碎片率。mem_fragmentation_ratio大于1但小于1.5。这种情况是合理的。
6)替换策略
“八二原理”,有20%的数据贡献了80%的访问了,而剩余的数据虽然体量很大,但只贡献了20%的访问量。
volatile-ttl在筛选时,会针对设置了过期时间的键值对,根据过期时间的先后进行删除,越早过期的越先被删除。
volatile-random就像它的名称一样,在设置了过期时间的键值对中,进行随机删除。
volatile-lru会使用LRU算法筛选设置了过期时间的键值对。
volatile-lfu会使用LFU算法选择设置了过期时间的键值对。
allkeys-random策略,从所有键值对中随机选择并删除数据;
allkeys-lru策略,使用LRU算法在所有数据中进行筛选。
allkeys-lfu策略,使用LFU算法在所有数据中进行筛选。
7)原子操作
原子操作是指执行过程保持原子性的操作,而且原子操作执行时并不需要再加锁,实现了无锁操作。
Redis的原子操作采用了两种方法:
把多个操作在Redis中实现成一个操作,也就是单命令操作;
把多个操作写到一个Lua脚本中,以原子性方式执行单个Lua脚本。
【免责声明】:本内容转载于网络,转载目的在于传递信息。文章内容为作者个人意见,本平台对文中陈述、观点保持中立,不对所包含内容的准确性、可靠性与完整性提供形式地保证。请读者仅作参考。更多内容请加抖音太原达内IT培训学习了解。