Redis底层原理剖析

本文涉及的产品
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
云数据库 Tair(兼容Redis),内存型 2GB
简介: Redis是一个开源的使用ANSIC语言编码的、支持网络、可以基于内存的可持久化的日志型、Key-Value数据库,并且提供多种语言的API。

Redis是什么

Redis=Remote Dictionary Server,远程字典服务

Redis是一个开源的使用ANSIC语言编码的、支持网络、可以基于内存的可持久化的日志型、Key-Value数据库,并且提供多种语言的API。与memcache一样,为了保证效率,数据都是缓存在内存中。区别是Redis会周期性的吧更新的数据写入到磁盘或者把修改操作写入追加记录文件,并且在此基础上实现了master-slave(主从同步)

Redis五大基本类型

Redis是一个开源、内存存储的数据结构服务器,可用做数据库,高速缓存和消息队列代理。它支持字符串、哈希表、列表、集合、有序集合、位图等数据类型。内置复制、Lua脚本、LRU收回事务以及不同级别磁盘持久化功能,同时通过Redis Sentinnel提供高可用,通过Redis Cluster提供自动分区

由于Redis类型大家很熟悉,并且指令的介绍比较多,下面主要介绍一下常用的

String字符串

String类型是Redis的最基础的数据结构,也是最经常使用的类型,而且其他的四种类型多多少少都在字符串类型的基础上构建的,所以String类型是Redis的基础。String类型的值最大能存储512MB,这里的String类型可以是简单的字符串、复杂的xml、json字符串,二进制图像或者音频的字符串,以及可以是数字的字符串。

应用场景

缓存功能,String字符串是最常用的数据类型、不仅仅是Redis,各个语言都是基本类型,因此,利用Redis作为缓存,配合其他数据库作为存储层,利用Redis支持高并发的特点,可以大大加快系统的读写速度,以及降低后端数据库的压力

计数器,许多系统都会使用Redis作为系统的实时计数器,可以快速实现计数和查询的功能。而且最终的数据结果可以按照特定的时间落地到数据库或者其他存储介质当中进行永久保存

统计多单位的数量,eg、uid、gongming、count:0,根据不同的uid更新count数量

共享用户session,用户重新刷新一次界面,可以需要访问一下数据进行重新登录,或者访问页面缓存cookie,这两种方式做有一定的缺点

每次都是重新登录效率低下

cookie保存在客户端,有安全隐患

可以使用Redis将用户的session集中管理,在这种模式只需要保证Redis的高可用,每次用户session的更新和获取都可以快速完成,可以大大的提高效率

List列表

List类型是用来存储多个有序的字符串,列表当中的每一个字符看作一个元素,一个列表当中可以存储有一个或者多个元素,Redis的list支持存储2的32次方-1个元素。

Redis可以从列表的两端进行插入Pubsh和弹出pop元素,支持读取指定范围的元素集,或者读取指定下标的元素等操作。Redis列表是一种比较灵活的链表数据结构,它可以充当队列或者栈的角色

Redis列表是链表型的数据结构,所以它的元素是有序的,而且列表内的元素是可以重复的,意味着他可以根据链表的下标获取指定的元素和某个范围内的元素集

应用场景

消息队列,Redis的链表结构,可以轻松实现阻塞队列,可以使用左进右出的命令组成来完成队列的设计。比如:数据的生产者可以通过Lpush命令从左边插入数据,多个数据消费者,可以使用BRpop命令阻塞的“抢”列表尾部的数据

文章列表或者数据分页展示的应用,举例:博客网站的文章,当用户量越来越多的时候,而且每一个用户都有自己的文章时,都需要分页展示,这时可以考虑使用Redis的列表,列表不但有序同时还支持按照范围内获取元素,可以完美解决分页查询功能,大大提高查询效率。

Set集合

Redis集合,Set类型和和列表类型类似,都可以用来存储多个字符串元素集合。但是和List不同的是Set集合当中不允许重复的元素。而且Set集合当中元素是没有顺序的,不存在元素的下标。

Redis的Set类型是使用哈希表构造的,因此复杂度是O(1),它支持集合内的增删改查,并且支持多个集合间的交集、并集、差集的操作。可以利用这些集合操作,解决程序开发当中很多数据集合间的问题。

应用场景

标签,博客网站经常使用到的兴趣标签,把有着相同爱好,关注类似内容的用户利用标签把他们进行归并。

共同好友功能,共同爱好,或者好友之类的扩展应用

统计网站的独立IP,利用Set集合当中元素不唯一性,可以快速实现统计访问网站的独立IP

数据结构,Set的底层结构相对复杂,使用Intset和hashtable两种数据结构存储,intset可以理解为数组。

Sorted set有序集合

Redis有序集合也是集合类型的一部分,所以保留了集合中元素不能重复的特性,但是不同的是,有序集合给每个元素多设置了一个分数

Redis有序集合也是集合类型的一部分,所以它保留了集合中元素不能重复的特性,但是不同的是,有序集合给每个元素多设置了一个分数,利用该分数作为排序的依据

应用场景

排行榜,有序集合使用场景,例如视频网站需要用户上传视频做排行榜,榜单维护可能是多方面:按照时间、按照播放量、按照获得的点赞数等

用Sorted Set做带权重的队列,比如说普通消息的source为2,然后工作线程可以选择按score的倒叙来获取工作任务,让重要的工作优先执行

hash(哈希)

Redis hash数据结构是一个键值对(key-value)集合,它是一个String类型的field和value的映射表,Redis本身是一个key-value类型的数据库,因此hash数据结构相当于在value中套用了一个key-value类型的数据,所以Redis数据结构特别适合存储关系型对象。

应用场景

由于hash数据类型的key-value的特性,用来存储关系型数据库中表记录,是Redis中哈希类型中最常见的场景,一条记录作为一个key-value,把每个列属性值对应成field-value存储在哈希表当中,然后通过key值来区分表当中的主键。

经常被用来存储用户相关信息,优化用户信息的获取,不需要重复从数据库当中读取,提供系统性能

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