阿里云服务器的网站备案流程图h5动画网站
阿里云服务器的网站备案流程图,h5动画网站,wordpress git编辑器,wordpress用户中心模板类型检查与命令多态
概述
redis中用于操作键的命令基本上可以分为两种类型。其中一种命令可以对任何类型的键执行#xff0c;比如说DEL命令、EXPIRE命令、RENAME命令、TYPE命令、OBJECT命令等.
而另一种命令只能对特定类型的键执行#xff0c;比如说
1.SET、GET、APPEND、…类型检查与命令多态
概述
redis中用于操作键的命令基本上可以分为两种类型。其中一种命令可以对任何类型的键执行比如说DEL命令、EXPIRE命令、RENAME命令、TYPE命令、OBJECT命令等.
而另一种命令只能对特定类型的键执行比如说
1.SET、GET、APPEND、STRLEN等命令只能对字符串键执行;2.HDEL、HSET、HGET、HLEN等命令只能对哈希键执行3.RPUSH、LPOP、LINSERT、LLEN等命令只能对列表键执行4.SADD、SPOP、SINTER、SCARD等命令只能对集合键执行5.ZADD、ZCARD、ZRANK、ZSCORE等命令只能对有序集合键执行
例子
举个例子以下代码就展示了使用DEL命令来删除三种不同类型的键:
// 字符串键
127.0.0.1:6379 SET msg hello
OK
// 列表键
127.0.0.1:6379 RPUSH numbers 1 2 3
(integer) 3
// 集合键
127.0.0.1:6379 SADD fruits apple banana cherry
(integer) 3127.0.0.1:6379 DEL msg
(integer) 1
127.0.0.1:6379 DEL numbers
(integer) 1
127.0.0.1:6379 DEL fruits
(integer) 1举个例子我们可以用SET命令创建一个字符串键然后用GET命令和APPEND命令操作这个键但如果我们试图对这个键执行只有列表键才能执行的LLEN命令那么Redis将向我们返回一个类型错误
127.0.0.1:6379 SET msg hello world
OK
127.0.0.1:6379 GET msg
hello world
127.0.0.1:6379 APPEND msg again!
(integer) 18
127.0.0.1:6379 GET msg
hello world again!
127.0.0.1:6379 LLEN msg
(error) WRONGTYPE Operation against a key holding the wrong kind of value类型检查的实现
Redis为了确保只有指定类型的键可以执行某些特定的命令在执行一个类型特定的命令之前,Redis会先检查输入键的类型是否正确然后再决定是否执行给定的命令。类型特定命令所进行的类型检查是通过redisObject结构的type属性来实现的:
1.在执行一个类型特定命令之前服务器会先检查输入数据库键的值对象是否为执行命令所需的类型如果是的话服务器就对键执行指定的命令;2.否则服务器将拒绝执行命令并向客户端返回一个类型错误
例子
举个例子对于LLEN命令来说: 1.在执行LLEN命令之前服务器会先检查输入数据库键的之对象是否为列表类型也即是检查值对象redisObject结构type属性的值是否为REDIS_LIST.如果是的话服务器就对键执行LLEN命令 2.否则的话服务器就拒绝执行命令并向客户端返回一个类型错误。 检查过程如图
多态命令的实现
Redis除了会根据值对象的类型来判断是否能够执行指定命令之外还会根据值对象的编码方式选择正确的命令实现代码来执行命令。
现在考虑这样一个情况如果对一个键执行LLEN命令那么服务器除了要确保执行命令的是列表键之外还需要根据键的值对象所使用的编码来选择正确的LLEN命令实现:
1.如果列表对象的编码为ziplist那么说明列表对象的实现为压缩列表程序将使用ziplistLen函数来返回列表的长度2.如果列表对象的编码为linkedlist那么说明列表对象的实现为双端链表程序将使用listLength函数来返回双端链表的长度
用面向对象的术语来说可以认为LLEN命令是多态的只要执行LLEN命令的是列表键那么无论值对象使用的是ziplist编码还是linkedlist编码命令都可以正常执行
实际上可以将DEL、EXPIRE、TYPE等命令也称多态命令因为无论输入的键是什么类型这些命令都可以正确地执行。
DEL、EXPIRE等命令和LLEN等命令地区别在于前者是基于类型地多态——一个命令可以同时用于处理多种不同类型地键而后者是基于编码的多态——一个命令可以同时用于处理多种不同编码
例子
举个例子列表对象有ziplist和linkedlist两种编码可用其中前者使用压缩列表API来实现列表命令而后者则使用双端链表API来实现列表命令。 如图展示了LLEN命令从类型检查到根据编码选择实现函数的整个执行过程其他类型特定命令的执行过程也是类似
内存回收
概述
因为C语言并不具备自动内存回收功能所以Redis在自己的对象系统中构建了一个引用计数(reference counting)技术实现的内存回收机制通过这一机制程序可以通过跟踪对象的引用计数信息在适当的时候自动释放对象并进行内存回收。每个对象的引用计数信息由redisObject结构的refcount属性记录:
typedef struct redisObject {// ...// 引用计数int refcount;// ...
} robj;对象的引用计数信息会随着对象的使用状态而不断变化:
1.在创建一个新对象时引用计数的值会被初始化为12.当对象被一个新程序使用时它的引用计数值会被增一3.当对象不再被一个程序使用时它的引用计数值会被减一4.当对象的引用计数值变为0时对象所占用的内存会被释放
对象的整个生命周期可以划分为创建对象、操作对象、释放对象三个阶段。
例子
举个例子以下代码展示了一个字符串对象从创建到释放的整个过程
// 创建一个字符串对象s对象的引用计数为1
robj *s createStringObject(....);// 对象s执行各种操作...// 将对象s的引用计数减一使得对象的引用计数变为0
// 导致对象s被释放
decrRefCount(s);其他不同类型的对象也会经历类似的过程
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/92481.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!