Redis基本原理

本文涉及的产品
云数据库 Tair(兼容Redis),内存型 2GB
Redis 开源版,标准版 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
目录
相关文章
|
3月前
|
NoSQL Redis
Redis 执行 Lua保证原子性原理
Redis 执行 Lua 保证原子性原理
350 1
|
3月前
|
监控 NoSQL Redis
看完这篇就能弄懂Redis的集群的原理了
看完这篇就能弄懂Redis的集群的原理了
134 0
|
2月前
|
缓存 NoSQL Linux
redis的原理(三)
redis的原理(三)
redis的原理(三)
|
1月前
|
设计模式 NoSQL 网络协议
大数据-48 Redis 通信协议原理RESP 事件处理机制原理 文件事件 时间事件 Reactor多路复用
大数据-48 Redis 通信协议原理RESP 事件处理机制原理 文件事件 时间事件 Reactor多路复用
37 2
|
1月前
|
存储 缓存 NoSQL
大数据-46 Redis 持久化 RDB AOF 配置参数 混合模式 具体原理 触发方式 优点与缺点
大数据-46 Redis 持久化 RDB AOF 配置参数 混合模式 具体原理 触发方式 优点与缺点
59 1
|
1月前
|
NoSQL 关系型数据库 MySQL
Redis 事务特性、原理、具体命令操作全方位诠释 —— 零基础可学习
本文全面阐述了Redis事务的特性、原理、具体命令操作,指出Redis事务具有原子性但不保证一致性、持久性和隔离性,并解释了Redis事务的适用场景和WATCH命令的乐观锁机制。
234 0
Redis 事务特性、原理、具体命令操作全方位诠释 —— 零基础可学习
|
2月前
|
存储 缓存 NoSQL
redis的原理(四)
redis的原理(四)
|
2月前
|
存储 缓存 NoSQL
redis的原理(二)
redis的原理(二)
|
2月前
|
缓存 NoSQL 安全
Redis的原理(一)
Redis的原理(一)
|
1月前
|
消息中间件 NoSQL Kafka
大数据-116 - Flink DataStream Sink 原理、概念、常见Sink类型 配置与使用 附带案例1:消费Kafka写到Redis
大数据-116 - Flink DataStream Sink 原理、概念、常见Sink类型 配置与使用 附带案例1:消费Kafka写到Redis
134 0
下一篇
无影云桌面