Redis基本原理

简介: Redis是C语言开发的一个开源的(遵从BSD协议)高性能键值对(key-value)的内存数据库,可以用作数据库、缓存、消息中间件等。它是一种NoSQL(not-only sql,泛指非关系型数据库)的数据库。


Redis的特点

性能优秀,数据在内存中,读写速度非常快,支持并发10W QPS;

单进程单线程,是线程安全的,采用IO多路复用机制;

丰富的数据类型,支持字符串(strings)、散列(hashes)、列表(lists)、集合(sets)、有序集合(sorted sets)等;

支持数据持久化。可以将内存中数据保存在磁盘中,重启时加载;

主从复制,哨兵,高可用;

可以用作分布式锁;

可以作为消息中间件使用,支持发布订阅。

Redis的五种数据类型

1. String

String是Redis最基本的数据类型,一个key对应一个value。value是二进制安全的,可以存储jpg图片或者序列化对象,最大可存储512M。

set键值对:setkeyvalueget键值对:getkey

2. Hash

hash类型存储键值对集合,类似于Java中的HashMap类型。hash类型特别适合存储对象,而且可以只修改对象中的某一个属性值。

set单个键值对:hsetkeyfield1value1set多个键值对:hmsetkeyfield1value1field2value2get单个键值对:hgetkeyfield1get多个键值对:hmgetkeyfield1field2get所有的键值对:hgetallkey获取所有的key:hkeyskey删除一个或多个字段:hdelkeyfield1field2查看哈希表中key中field是否存在:hexistskeyfield1为哈希表指定字段的整数值加上增量:hincrbykeyfield2increment获取哈希表中字段的数量:hlenkey

3. List

List是字符串列表,本质实现方式是双向链表,插入的时候可以选择插入到队头或者队尾。在进行增删操作的时候效率很高,一般用于消息队列等场景。


往列表头push元素:lpushkeyvalue1value2往列表尾push元素:rpushkeyvalue3value4获取从左起列表范围内元素(右侧同理):lrangekey010从列表左侧pop元素(右侧同理):lpopkeyvalue1获取列表长度:llenkey

4. Set

Set是String的无序类型,本质是通过哈希表实现的,所以添加,删除,查找的复杂度都是 O(1)。Set可以用于判断共同好友、访问网站IP等需要去重的场合。


添加一个或多个成员:saddkeymember1member2获取集合的成员数:scardkey获取集合中的所有成员:smemberskey移除并返回集合中一个随即元素:spopkey返回所有给定集合的交集:sinterkey1key2返回所有给定集合的并集:sunionkey1key2


5. ZSet

ZSet指的是有序集合,和Set一样是String类型元素的集合,且不允许重复的元素。不同的是每个元素都会关联一个double类型的分数score,Redis根据这个score来对集合中的元素进行排序,当你插入之后就会自动根据score排序。


ZSet内部根据HashMap和跳跃表来保证数据的存储和有序,HashMap里放的是成员到score的映射,而跳跃表里存放的是所有的成员,排序依据是HashMap里存的score,使用跳跃表的结构可以获得比较高的查找效率,并且在实现上比较简单。ZSet可用于计算排行榜、带权重的消息队列等。


跳表顾名思义,就是跳跃了一些元素,可以抽象多层。如下图所示,比如我们要查找8,先在最上层L2查找,发现在1和9之间;然后去L1层查找,发现在5和9之间;然后去L0查找,发现在7和9之间,然后找到8。当元素比较多时,使用跳表可以显著减少查找的次数。

同list类似,Redis内部也不是直接使用的跳表,而是使用了一个自定义的数据结构来持有跳表。下图左边蓝色部分是skiplist,右边是4个zskiplistNode。zskiplistNode内部有很多层L1、L2等,指针指向这一层的下一个结点。BW是回退指针(backward),用于查找的时候回退。然后下面是score和对象本身object。

向zset中添加一个或多个成员,或者更新成员分数:zaddkeyscore1member1score2member2获取有序集合的成员数:zcardkey通过索引区间返回有序集合指定区间的成员:zrangekeystartstop
目录
相关文章
|
存储 缓存 NoSQL
Redis 服务器全方位介绍:从入门到核心原理
Redis是一款高性能内存键值数据库,支持字符串、哈希、列表等多种数据结构,广泛用于缓存、会话存储、排行榜及消息队列。其单线程事件循环架构保障高并发与低延迟,结合RDB和AOF持久化机制兼顾性能与数据安全。通过主从复制、哨兵及集群模式实现高可用与横向扩展,适用于现代应用的多样化场景。合理配置与优化可显著提升系统性能与稳定性。
400 0
|
3月前
|
存储 缓存 监控
Redis分区的核心原理与应用实践
Redis分区通过将数据分散存储于多个节点,提升系统处理高并发与大规模数据的能力。本文详解分区原理、策略及应用实践,涵盖哈希、范围、一致性哈希等分片方式,分析其适用场景与性能优势,并探讨电商秒杀、物联网等典型用例,为构建高性能、可扩展的Redis集群提供参考。
198 0
|
NoSQL Redis
Redis 执行 Lua保证原子性原理
Redis 执行 Lua 保证原子性原理
1022 1
|
10月前
|
消息中间件 缓存 NoSQL
Redis原理—5.性能和使用总结
本文详细探讨了Redis的阻塞原因、性能优化、缓存相关问题及数据库与缓存的一致性问题。同时还列举了不同缓存操作方案下的并发情况,帮助读者理解并选择合适的缓存管理策略。最终得出结论,在实际应用中应尽量采用“先更新数据库再删除缓存”的方案,并结合异步重试机制来保证数据的一致性和系统的高性能。
Redis原理—5.性能和使用总结
|
监控 NoSQL Redis
看完这篇就能弄懂Redis的集群的原理了
看完这篇就能弄懂Redis的集群的原理了
686 0
|
10月前
|
NoSQL 算法 安全
Redis原理—1.Redis数据结构
本文介绍了Redis 的主要数据结构及应用。
Redis原理—1.Redis数据结构
|
10月前
|
缓存 NoSQL Redis
Redis原理—2.单机数据库的实现
本文概述了Redis数据库的核心结构和操作机制。
Redis原理—2.单机数据库的实现
|
10月前
|
存储 缓存 NoSQL
Redis原理—4.核心原理摘要
Redis 是一个基于内存的高性能NoSQL数据库,支持分布式集群和持久化。其网络通信模型采用多路复用监听与文件事件机制,通过单线程串行化处理大量并发请求,确保高效运行。本文主要简单介绍了 Redis 的核心特性。
|
10月前
|
缓存 NoSQL Redis
Redis原理—3.复制、哨兵和集群
详细介绍了Redis的复制原理、哨兵原理和集群原理。
|
10月前
|
运维 NoSQL 算法
【📕分布式锁通关指南 04】redis分布式锁的细节问题以及RedLock算法原理
本文深入探讨了基于Redis实现分布式锁时遇到的细节问题及解决方案。首先,针对锁续期问题,提出了通过独立服务、获取锁进程自己续期和异步线程三种方式,并详细介绍了如何利用Lua脚本和守护线程实现自动续期。接着,解决了锁阻塞问题,引入了带超时时间的`tryLock`机制,确保在高并发场景下不会无限等待锁。最后,作为知识扩展,讲解了RedLock算法原理及其在实际业务中的局限性。文章强调,在并发量不高的场景中手写分布式锁可行,但推荐使用更成熟的Redisson框架来实现分布式锁,以保证系统的稳定性和可靠性。
606 0
【📕分布式锁通关指南 04】redis分布式锁的细节问题以及RedLock算法原理