网站数据库是谁提供,乐山市做网站的公司,常用的设计软件有哪些,网络游戏开发基础Redis中用于操作键的命令基本上可以分为两种类型。
其中一种命令可以对任何类型的键执行#xff0c;比如说DEL命令、EXPIRE命令 、RENAME命令、TYPE命令、OBJECT命令等。
举个例子#xff0c;以下代码就展示了使用DEL命令来删除三种不同类型的键:
#
字符串键
redis SE…Redis中用于操作键的命令基本上可以分为两种类型。
其中一种命令可以对任何类型的键执行比如说DEL命令、EXPIRE命令 、RENAME命令、TYPE命令、OBJECT命令等。
举个例子以下代码就展示了使用DEL命令来删除三种不同类型的键:
#
字符串键
redis SET msg he1lo
OK
#
列表键
redis RPUSH numbers 1 2 3
(integer) 3
#
集合键
redis SADD fruits apple banana cherry
(integer) 3
redis DEL msg
(integer) 1
redis DEL numbers
(integer) 1
redis DEL fruits
(integer) 1而另一种命令只能对特定类型的键执行比如说:
SET、GET、APPEND、STRLEN等命令只能对字符串键执行;
HDEL、HSET、HGET、HLEN等命令只能对哈希键执行;
RPUSH、LPOP、LINSERT、LLEN等命令只能对列表键执行;
SADD、SPOP、SINTER、SCARD等命令只能对集合键执行;
ZADD、ZCARD、ZRANK、ZSCORE等命令只能对有序集合键执行; 举个例子我们可以用SET命令创建一个字符串键然后用GET命令和APPEND命令操作这个键但如果我们试图对这个字符串键执行只有列表键才能执行的LLEN命令那么Redis将向我们返回一个类型错误
redis SET msg hello world
OK
redis GET msg
hello world
redis APPEND msg
”again!
(integer) 18
redis GET msg
hello world again!
redis LLEN msg
(error) WRONGTYPE Operation against a key holding the wrong kind of value类型检查的实现
从上面发生类型错误的代码示例可以看出为了确保只有指定类型的键可以执行某些特定的命令在执行一个类型特定的命令之前Redis会先检查输入键的类型是否正确然后再决定是否执行给定的命令。
类型特定命令所进行的类型检查是通过redisObject结构的type属性来实现的
在执行一个类型特定命令之前服务器会先检查输入数据库键的值对象是否为执行命令所需的类型如果是的话服务器就对键执行指定的命令
否则服务器将拒绝执行命令并向客户端返回一个类型错误。 举个例子对于LLEN命令来说
在执行LLEN命令之前服务器会先检查输入数据库键的值对象是否为列表类型也即是检查值对象redisObject结构type属性的值是否为REDIS_LIST如果是的话服务器就对键执行LLEN命令
否则的话服务器就拒绝执行命令并向客户端返回一个类型错误下图展示了这一类型检查过程。 其他类型特定命令的类型检查过程也和这里展示的LLEN命令的类型检查过程类似。 多态命令的实现
Redis除了会根据值对象的类型来判断键是否能够执行指定命令之外还会根据值对象的编码方式选择正确的命令实现代码来执行命令。
举个例子在前面介绍列表对象的编码时我们说过列表对象有ziplist和linkedlist两种编码可用其中前者使用压缩列表API来实现列表命令而后者则使用双端链表API来实现列表命令。
现在考虑这样一个情况如果我们对一个键执行LLEN命令那么服务器除了要确保执行命令的是列表键之外还需要根据键的值对象所使用的编码来选择正确的LLEN命令实现
如果列表对象的编码为ziplist那么说明列表对象的实现为压缩列表程序将使用ziplistLen函数来返回列表的长度
如果列表对象的编码为linkedlist,那么说明列表对象的实现为双端链表程序将使用listLength函数来返回双端链表的长度 借用面向对象方面的术语来说我们可以认为LLEN命令是多态( polymorphism)的只要执行LLEN命令的是列表键那么无论值对象使用的是ziplist编码还是linkedlist编码命令都可以正常执行。 下图展示了LLEN命令从类型检查到根据编码选择实现函数的整个执行过程其他类型特定命令的执行过程也是类似的。 实际上我们可以将DEL、EXPIRE、TYPE等命令也称为多态命令因为无论输入的键是什么类型这些命令都可以正确地执行。
DEL、EXPIRE等命令和LLEN等命令的区别在于前者是基于类型的多态——一个命令可以同时用于处理多种不同类型的键而后者是基于编码的多态——一个命令可以同时用于处理多种不同编码。