小编带你了解Redis内部是运作机制

本文涉及的产品
云数据库 Tair(兼容Redis),内存型 2GB
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
简介:   Redis数据库的结构:  typeof struct redisDb{  int id ; // 数据库的id  dict *dict ; // 保存着该数据库的所有键值对 也被称为键空间  dict *expires ; // 保存着键的过期时间  …..  } redisDb ;  Redis 是一个键值对 字典表,同样Redis数据库存储形式也是键值对 字典表

  Redis数据库的结构:

  typeof struct redisDb{

  int id ; // 数据库的id

  dict *dict ; // 保存着该数据库的所有键值对 也被称为键空间

  dict *expires ; // 保存着键的过期时间

  …..

  } redisDb ;

  Redis 是一个键值对 字典表,同样Redis数据库存储形式也是键值对 字典表

  键是字符串

  值可以是字符型、list 列表、 hash、集合以及 有序集合其中之一

  Redis 数据库增、删、改、查等操作的键空间操作:

  新增:

  Redis会在键空间字典中增加一个键-值对,其中键为一个字符串,值为任意一个值类型。

  删除:

  Redis会在键空间字典中删去对应键的键-值对

  更新:

  Redis会在键空间字典中释放之前对应键的值对象,并让键指向新的值对象

  查询:

  Redis会在键空间字典中查询二手手机号码拍卖平台对应键的值对象:

  键不存在,返回NULL

  键存在,且类型正确,返回正确的值

  键存在,但类型不正确,返回类型错误

  其他操作:

  除了上面展示的键值操作之外,还有很多针对数据库本身的命令,也是通过对键空间进行处理 来完成的:

  FLUSHDB 删除键空间中的所有键值对

  RANDOMKEY 从键空间中随机返回一个键

  DBSIZE 返回键空间中键值对的数量

  EXISTS 检查给定键是否存在于键空间中

  RENAME 在键空间中,对给定键进行改名

  键的过期时间

  在Redis数据库中,所有键的过期时间都保存在RedisDb结构体的expires字典中,其中键为一个指向dict 字典(键空间)里某个键的指针,值为改建的过期时间,用long long型表示。

  Redis 有四个命令可以设置键的生存时间(可以存活多久)和过期时间(什么时候到期):

  EXPIRE 以秒为单位设置键的生存时间;

  PEXPIRE 以毫秒为单位设置键的生存时间;

  EXPIREAT 以秒为单位,设置键的过期 UNIX 时间戳;

  PEXPIREAT 以毫秒为单位,设置键的过期 UNIX 时间戳。

  虽然有那么多种不同单位和不同形式的设置方式,但是 expires 字典的值只保存“以毫秒为单 位的过期 UNIX 时间戳” ,这就是说,通过进行转换,所有命令的效果最后都和 PEXPIREAT 命令的效果一样。

  过期键的清除

  定时清除:

  在创建KEY的时候创建一个定时任务,在KEY到期时定时任务会被触发,第一时间清除过期KEY。

  此种操作对内存最友好,不会有垃圾数据占用内存情况存在

  缺点是会造成很大的服务器负载,特别是CPU负载高的时候,CPU很大一部分负载用在了删除不必要的KEY上了

  惰性清除:

  放任键空间的键不管,每次查询KEY的时候先去校验KEY是否过期,过期则删除,不过期则正常返回相应的VALUE。

  此种操作对CPU最友好,这种策略仅限于当前KEY,相关不必要的KEY不会造成CPU负载

  缺点是:容易造成内存空间浪费,特别是当系统中存在大量过期KEY且很少被用到,这十分影响非常依赖于内存大小Redis的性能

  定期删除:

  由定时脚本cron定时对expires的键扫描判断是否有过期的KEY存在,如存在,将其删除掉。

  这是一种折中方案,既不会过多消耗CPU,又可以定时清楚惰性删除忽略到的不必要的内存消耗

  Redis采用的“惰性清除”和“定期清楚”相结合的方式,其中定期删除模式是在规定的时间限制内,尽 可能地遍历各个数据库的 expires 字典,随机地检查一部分键的过期时间,并删除其中的过期键。

相关实践学习
基于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 Java Redis
实现基于Redis的分布式锁机制
实现基于Redis的分布式锁机制
|
14天前
|
存储 缓存 NoSQL
大数据-45 Redis 持久化概念 RDB AOF机制 持久化原因和对比
大数据-45 Redis 持久化概念 RDB AOF机制 持久化原因和对比
31 2
大数据-45 Redis 持久化概念 RDB AOF机制 持久化原因和对比
|
14天前
|
设计模式 NoSQL 网络协议
大数据-48 Redis 通信协议原理RESP 事件处理机制原理 文件事件 时间事件 Reactor多路复用
大数据-48 Redis 通信协议原理RESP 事件处理机制原理 文件事件 时间事件 Reactor多路复用
32 2
|
4月前
|
消息中间件 NoSQL Java
Redis系列学习文章分享---第六篇(Redis实战篇--Redis分布式锁+实现思路+误删问题+原子性+lua脚本+Redisson功能介绍+可重入锁+WatchDog机制+multiLock)
Redis系列学习文章分享---第六篇(Redis实战篇--Redis分布式锁+实现思路+误删问题+原子性+lua脚本+Redisson功能介绍+可重入锁+WatchDog机制+multiLock)
221 0
|
2月前
|
NoSQL 关系型数据库 Redis
Redis6入门到实战------ 九、10. Redis_事务_锁机制_秒杀
这篇文章深入探讨了Redis事务的概念、命令使用、错误处理机制以及乐观锁和悲观锁的应用,并通过WATCH/UNWATCH命令展示了事务中的锁机制。
Redis6入门到实战------ 九、10. Redis_事务_锁机制_秒杀
|
27天前
|
存储 NoSQL Redis
Redis的RDB快照:保障数据持久性的关键机制
Redis的RDB快照:保障数据持久性的关键机制
36 0
|
27天前
|
存储 缓存 NoSQL
深入探究Redis的AOF持久化:保障数据安全与恢复性能的关键机制
深入探究Redis的AOF持久化:保障数据安全与恢复性能的关键机制
57 0
|
3月前
|
NoSQL Redis 开发工具
Redis性能优化问题之检查 Redis 实例是否启用了透明大页机制,如何解决
Redis性能优化问题之检查 Redis 实例是否启用了透明大页机制,如何解决
|
3月前
|
NoSQL Redis
Redis性能优化问题之禁用内存大页,如何解决
Redis性能优化问题之禁用内存大页,如何解决