东莞市主营网站建设服务机构,青岛建站公司电话,网络系统结构与综合布线系统结构的关系,做标书需要用到哪些网站查资料1. 前言
我们前面了解了redis的数据结构#xff0c;对象。但是redis对于这些对象的使用和管理策略需要也熟记于心#xff0c;这篇文章我们就了解一下吧。
2. 类型检查和命令多态 DEL,EXPIRE,RENAME,TYPE,OBJECT 可以对任何数据类型执行SET,GET,APPEND,STRLEN#xff0c;等…1. 前言
我们前面了解了redis的数据结构对象。但是redis对于这些对象的使用和管理策略需要也熟记于心这篇文章我们就了解一下吧。
2. 类型检查和命令多态 DEL,EXPIRE,RENAME,TYPE,OBJECT 可以对任何数据类型执行SET,GET,APPEND,STRLEN等只能对字符串执行HDEL,HSET,HGET,HLEN等只能对哈希键执行RPUSH,LPOP,LINSERT,LLEN等只能对列表键执行SADD,SPOP,SINTER,SCARD,等只能对集合键执行ZADD,ZCARD,ZRANK,ZSCORE等只能对有序集合键执行
如何实现的类型检查? 在执行llen命令之前确保对象内type是不是命令对应类型如果是的话就执行否则就返回上图类型错误 如何实现通用命令多态?
实际上不仅是通用命令是多态像llen也是多态实现由于列表底层可以是压缩列表或者或链表所以获取元素数量的内置操作是不同的。所以内部会进行if操作如果是ziplist就执行ziplistLen如果是链表就使用listlength获取长度
而这些通用命令也是一样的思路。
3. 内存回收策略
c 语言不具备内存回收功能所以redis自行实现了内存回收。使用的策略是引用计数策略和 jvm 的可达性分析不一样。 当创建一个对象的时候引用数设置为1当被一个新程序使用的时候引用数加1不被一个程序使用的时候引用数减1 对象的生命周期包括创建对象操作对象和释放对象 4. 对象共享
对象共享的目的是节约内存实际上和 java 语言类似。
redis内部已经实现了这些但是我们理解内部过程对于熟练使用redis极为重要。
redis 在初始化的时候会创建1w0-9999个整数字符串 我们可以看到1这个证书字符串居然整数1被引用率2147483647之多。这种思路在java中integer有点类似integer在创建之初就有-128-127的缓存。 另外这些共享对象不单单只有字符串键可以使用那些在数据结构中嵌套了字符串对象的对象(linkedlist编码的列表对象、hashtable编码的哈希对象、hashtable编码的集合对象以及zset编码的有序集合对象)都可以使用这些共享对象。 5. 对象空转时长
redisObject中还有最后一个属性lru长度为22字节 这个属性记录了上次使用时间当前之间减去lru可以计算出空转时长 如果服务器打开了maxmemory选项并且服务器用于回收内存的算法为volatile-lru或者allkeys-lru那么当服务器占用的内存数超过了maxmemory选项所设置的上限值时空转时长较高的那部分键会优先被服务器释放从而回收内存 6. 数据库
redisDb *d保存着redis中所有数据库 redis会根据dbnum决定数据库创建的数量默认是16. 通过select可以选择数据库 redisClient中*db记录了当前数据库 reids 全数据字典 redis所有的数据都是key-valueredisDb数据结构中dict中保存了所有数据的key-value。如果添加数据就是向dict中添加值。
6.1. 过期键的删除策略 过期时间并非保存在对象内而是另外开了一个字典exoires专门用于保存对象的生存时间。好处是集中处理更便捷。
定时删除 使用定时器定期对对象删除惰性删除 等读取时进行过期判断定期删除 使用定时器不过限制删除的时间相当于降低了延迟降低了吞吐是一个中庸的方法。
6.2. rdb和aof对过期键的处理
rdb不保存处理 如果rdb存储键值的时候会对过期键进行过期检查只有非过期的键才会保存持久化。aof的不理睬处理
aof一般情况下并不会关系键是否过期因为aof跟踪数据库状态除非系统处理过期键然后aof会追加和系统相同的删除命令。当然如果aof进行了重写这时候的思路就和rdb类似会对过期键理睬只保存不过期的键因为aof重写本身就是一个类rdb的行为。