详解redis内部运作机制 (详解人体的升降出入归真医学)

教程大全 2025-07-13 06:42:01 浏览

redis 就是一个数据库,不过与传统数据库不同的是 redis 的数据是存在内存中的,所以读写速度非常快,因此 redis 被广泛应用于缓存方向,本篇文章重点为大家讲解一下redis内部运作机制。

当Redis 服务器 初始化的时候会创建 redis.h/REDIS_DEFAULT_DBNUM(后面简写 N ) 个数据库,且数据库的id是从 0 到 N-1 , 所有的数据库保存到 redis.h/redisServer.db 数组中 。

在客户端可以通过 “SELECT” 命令进行切换,其中程序是直接用 redis.h/redisServer.db[number] 进行切换。 但是,一些内部程序,比如 AOF 程序、复制程序和 RDB 程序,需要知道当前数据库的号码, 如果没有 id 域的话,程序就只能在当前使用的数据库的指针,和 redisServer.db 数组中所 有数据库的指针进行对比,以此来弄清楚自己正在使用的是那个数据库。

typeofstructredisDb{intid;//数据库的iddict*dict;//保存着该数据库的所有键值对也被称为键空间dict*expires;//保存着键的过期时间…..}redisDb;Redis是一个键值对字典表,同样Redis数据库存储形式也是键值对字典表键是字符串值可以是字符型、list列表、、集合以及有序集合其中之一

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 字典,随机地检查一部分键的过期时间,并删除其中的过期键。

代码如下:

defactiveExpireCycle():#遍历数据库(不一定能全部都遍历完,看时间是否足够)dbserver.db:#MAX_KEY_PER_DB是一个DB最大能处理的key个数#它保证时间不会全部用在个别的DB上(避免饥饿)i=0while(i #数据库为空,跳出while,处理下个DBifdb.is_empty():break key_with_ttl=db.expires.get_random_key() #检查键是否过期,如果是的话,将它删除ifis_expired(key_with_ttl): db.deleteExpiredKey(key_with_ttl) #当执行时间到达上限,函数就返回,不再继续#这确保删除操作不会占用太多的CPU时间reach_time_limit(): i+=1 

Redis 过期键删除的主从同步问题(Redis的机制是由主节点统一控制)

如果服务器是主节点,当它删除一个过期键之后,会显式的向所有附属节点发送一条DEL命令 如果服务器是附属节点,当它判断到当前KEY已经过期,会将该键过期的消息发送给主服务器,主服务器删除后向所有的从服务器节点发送DEL命令。

从服务器节点不自主的对键进行删除是为了保持和主服务器数据的绝对一致性,即当一个过期键还存在主服务器上,这个键在所有的从服务器上也不会被删除。

详解人体的升降出入归真医学

Redis有哪些数据结构?

Redis有五种结构:1、String可以是字符串,整数或者浮点数,对整个字符串或者字符串中的一部分执行操作,对整个整数或者浮点执行自增(increment)或者自减(decrement)操作。 字符串命令:①get、获取存储在指定键中的值②set、设置存储在指定键中的值③del、删除存储在指定键中的值(这个命令可以用于所有的类型)2、list一个链表,链表上的每个节点都包含了一个字符串,虫链表的两端推入或者弹出元素,根据偏移量对链表进行修剪(trim),读取单个或者多个元素,根据值查找或者移除元素。 列表命令:①rpush、将给定值推入列表的右端②lrange、获取列表在指定范围上的所有值③lindex、获取列表在指定范围上的单个元素④lpop、从列表的左端弹出一个值,并返回被弹出的值3、set包含字符串的无序收集器(unordered collection)、并且被包含的每个字符串都是独一无二的。 添加,获取,移除单个元素,检查一个元素是否存在于集合中,计算交集,并集,差集,从集合里面随机获取元素。 集合命令:①sadd、将给定元素添加到集合②smembers、返回集合包含的所有元素③sismember、检查指定元素是否存在于集合中④srem、检查指定元素是否存在于集合中,那么移除这个元素4、hash包含键值对无序散列表,添加,获取,移除当键值对,获取所有键值对。 散列命令:①hset、在散列里面关联起指定的键值对②hget、获取指定散列键的值③hgetall、获取散列包含的所有键值对④hdel、如果给定键存在于散列里面,那么移除这个键5、zset字符串成员(member)与浮点数分值(sCore)之间的有序映射,元素的排列顺序由分值的大小决定。 添加,获取,删除单个元素,根据分值范围(range)或者成员来获取元素。 有序集合命令:①zadd、将一个带有给定分值的成员添加到有序集合里面②zrange、根据元素在有序排列中所处的位置,从有序集合里面获取多个元素③zrangebyscore、获取有序集合在给定分值范围内的所有元素④zrem、如果指定成员存在于有序集合中,那么移除这个成员

征途全身灵魂锁链激活有什么技巧?

灵魂锁链里总共的属性有五种:风、电、雨、火、雷而激活的机制则是由雷激活火、火激活雨、雨激活电、电激活风、风激活雷另一方面在装备上也有激活的关系存在:1、戒指激活项链、武器2、项链激活戒指3、护腕激活靴子、衣服4、头盔激活护腕、腰带5、腰带激活头盔要尽可能激活灵魂锁链,只能是全套物防或全套魔防装备。 11件装备(战士)最多可能激活9个灵魂锁链,10件装备最多能激活8个灵魂锁链。 理论根据:项链→戒指→项链这个循环中,2个戒指和1个项链3样装备只能激活其中2样。 假如项链属性为电,搭配雨属性戒指,那么这个雨属性戒指不可能去激活项链,只能由另一个风属性戒指去激活,因此这三件装备只能激活2个。 同理,双护腕和头盔也只能激活2个。 所以激活总数上比装备总件数少2。 最方便快捷激活方法:首先,选择带相同属性的一对护腕、腰带。 为什么要选这些为相同属性的呢?理由很简单,因为这样能选择最大量的你所需要属性的装备。 1、比如护腕及腰带的属性为火2、那配个雷头,马上就有三样闪光的装备了——腰带再加一对护腕3、靴子、衣服都必须选择雨属性的(因为手腕是火属性的,而靴子和衣服都需要手腕来激活的)4、而项链和戒指的关系就比较复杂了,因为是一个相互激活的关系,所以要学会如何取舍。 是牺牲掉一个戒指不发光还是牺牲掉项链不发光。 如果选择一对火属性的戒指,则武器就该是雨属性的,项链则是雷属性的;如果选择火属性的项链和武器,则戒指应该选择雨、雷属性各一个如上选择的结果,你会发现你身上只有两处不发光,一个是头盔,另一个不发光的则是项链或者一个戒指,从个人美学观点来看,我认为选择一对同属性的戒指要更漂亮补充:前面已经说了不能激活全身滴 至少有2个不能激活 先算下怎样才能改造最少的装备 比如两个护腕属性一样了 那就改头的属性去激活 不要改两个护腕的属性去让头来激活

游戏积分竞拍规则介绍

积分竟拍具体规则如下:

1、每件竞品起拍价格不同,可以选择不同积分额度进行加价(如下图)。 加价一次系统会暂时扣除您出价的积分,加价最多不能超过20积分。 如果其他用户出价高于您的出价,系统会返还您暂扣的积分;

2、竞拍剩余时间还剩1秒时,若没有其他用户出价,您以成交价获得竞品,该用户为最终竞拍得主。若此时有其他用户出价,则竞拍剩余时间将延长10秒;

3、若您拍得竞品成功,系统则会扣除您竞拍时出价的积分(即当前竞价+您的加价),成功后请点击我的游戏礼包查看竞品的CDK信息;

4、若竞品为实物,请竞拍成功的用户去个人资料页面完善个人信息,我们将在一个月内将实物竞品寄送给您;由于竞品有限,一个QQ号码只能获得一个竞品。

本文版权声明本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,请联系本站客服,一经查实,本站将立刻删除。

发表评论

热门推荐