Redis基本原理

本文涉及的产品
云数据库 Redis 版,标准版 2GB
推荐场景:
搭建游戏排行榜
云原生内存数据库 Tair,内存型 2GB
简介: 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
相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore     ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
目录
相关文章
|
25天前
|
NoSQL Redis
Redis 执行 Lua保证原子性原理
Redis 执行 Lua 保证原子性原理
87 1
|
28天前
|
监控 NoSQL Redis
看完这篇就能弄懂Redis的集群的原理了
看完这篇就能弄懂Redis的集群的原理了
48 0
|
3月前
|
存储 NoSQL Redis
Redis系列学习文章分享---第十六篇(Redis原理1篇--Redis数据结构-动态字符串,insert,Dict,ZipList,QuickList,SkipList,RedisObject)
Redis系列学习文章分享---第十六篇(Redis原理1篇--Redis数据结构-动态字符串,insert,Dict,ZipList,QuickList,SkipList,RedisObject)
71 1
|
3月前
|
NoSQL Java Redis
Redis系列学习文章分享---第十八篇(Redis原理篇--网络模型,通讯协议,内存回收)
Redis系列学习文章分享---第十八篇(Redis原理篇--网络模型,通讯协议,内存回收)
63 0
|
3月前
|
存储 消息中间件 缓存
Redis系列学习文章分享---第十七篇(Redis原理篇--数据结构,网络模型)
Redis系列学习文章分享---第十七篇(Redis原理篇--数据结构,网络模型)
70 0
|
1月前
|
存储 NoSQL Java
深入理解Redis数据类型Hashes原理
本文深入分析了Redis中的hashes数据类型,这是一种用于存储行记录的数据结构,允许一个key下存储多条记录。
深入理解Redis数据类型Hashes原理
|
1月前
|
存储 NoSQL 算法
深入理解Redis分片Cluster原理
本文深入探讨了Redis Cluster的分片原理,作为Redis官方提供的高可用性和高性能解决方案,Redis Cluster通过数据分片和横向扩展能力,有效降低单个主节点的压力。
深入理解Redis分片Cluster原理
|
1月前
|
存储 NoSQL 算法
深入理解Redis数据类型Zset原理
本文深入探讨了Redis中的Zset(有序集合)数据类型,它是一种可以存储排序功能的集合,其中每个元素都具有一个浮点型的score属性,用于根据score进行排序。
深入理解Redis数据类型Zset原理
|
21天前
|
运维 监控 NoSQL
【Redis】哨兵(Sentinel)原理与实战全解~炒鸡简单啊
Redis 的哨兵模式(Sentinel)是一种用于实现高可用性的机制。它通过监控主节点和从节点,并在主节点故障时自动进行切换,确保集群持续提供服务。哨兵模式包括主节点、从节点和哨兵实例,具备监控、通知、自动故障转移等功能,能显著提高系统的稳定性和可靠性。本文详细介绍了哨兵模式的组成、功能、工作机制以及其优势和局限性,并提供了单实例的安装和配置步骤,包括系统优化、安装、配置、启停管理和性能监控等。此外,还介绍了如何配置主从复制和哨兵,确保在故障时能够自动切换并恢复服务。