redis基础02-redis的5种对象数据类型
表格引用地址:http://www.cnblogs.com/xrq730/p/8944539.html
参考书籍:《Redis设计与实现》,《Redis运维与开发》
1.对象
Redis基于基础的数据结构创建了五种不同类型的对象系统,分别是:
字符串对象,列表对象,哈希对象,集合对象和有序集合对象;
Redis的对象系统实现了基于引用计数技术的内存回收机制;
Redis对象带有访问时间记录信息。
数据结构如下:
typedef redisObject{
unsigned type:4;//类型
unsigned encoding:4;//编码
void *ptr;//只想底层实现数据结构的指针
} robj;
其中,type属性记录的是对象的数据类型。因为键值总是字符串,而对象的数据类型就是上面的5种对象系统;(每种类型的对象都至少使用了两种不同的编码)
redis底层的数据结构:
不同的对象可以使用的编码类型(encoding):

可以通过OBJECT ENCODING key查看对应不同编码类型:
1.字符串对象
特点:
1.字符串对象的编码可以是int,row,或embstr;
2.最大值不能超过512M;
3.字符串对象是五种redis对象中被其他对象嵌套的对象
数据存取相关指令:
计数相关指令
注意:
1.SETEX,SETNX,可用于分布式场景,当多个客户端同时执行操作,只能有一个客户端执行成功;
2.尽量使用MSET和MGET批量处理,但是要注意数量不是无节制的,当数量太多时,可能会造成redis阻塞或网络阻塞;
3.redis是单线程架构,自增自减不会额外消耗CPU;
2.列表对象(REDIS_LIST)
特点:
1.列表对象可以是ziplist或linkedlist,linkedList使用的是双端链表作为底层实现,每个双端链表的节点都保存一个对象;
2.当满足单个字符长度小于64,元素数量小于512的时候,使用ziplist,不能就使用linkedlist
3.可以两端进行插入或弹出;
4.列表
类型的两个特点:1.有序;2.可重复;
常用操作指令
命令 | 描述 | 用法 |
LPUSH | (1)将一个或多个值value插入到列表key的表头(2)如果有多个value值,那么各个value值按从左到右的顺序依次插入表头(3)key不存在,一个空列表会被创建并执行LPUSH操作(4)key存在但不是列表类型,返回错误 | LPUSH key value [value ...] |
LPUSHX | (1)将值value插入到列表key的表头,当且晋档key存在且为一个列表(2)key不存在时,LPUSHX命令什么都不做 | LPUSHX key value |
LPOP | (1)移除并返回列表key的头元素 | LPOP key |
LRANGE | (1)返回列表key中指定区间内的元素,区间以偏移量start和stop指定(2)start和stop都以0位底(3)可使用负数下标,-1表示列表最后一个元素,-2表示列表倒数第二个元素,以此类推(4)start大于列表最大下标,返回空列表(5)stop大于列表最大下标,stop=列表最大下标 | LRANGE key start stop |
LREM | (1)根据count的值,移除列表中与value相等的元素(2)count>0表示从头到尾搜索,移除与value相等的元素,数量为count(3)count<0表示从从尾到头搜索,移除与value相等的元素,数量为count(4)count=0表示移除表中所有与value相等的元素 | LREM key count value |
LSET | (1)将列表key下标为index的元素值设为value(2)index参数超出范围,或对一个空列表进行LSET时,返回错误 | LSET key index value |
LINDEX | (1)返回列表key中,下标为index的元素 | LINDEX key index |
LINSERT | (1)将值value插入列表key中,位于pivot前面或者后面(2)pivot不存在于列表key时,不执行任何操作(3)key不存在,不执行任何操作 | LINSERT key BEFORE|AFTER pivot value |
LLEN | (1)返回列表key的长度(2)key不存在,返回0 | LLEN key |
LTRIM | (1)对一个列表进行修剪,让列表只返回指定区间内的元素,不存在指定区间内的都将被移除 | LTRIM key start stop |
RPOP | (1)移除并返回列表key的尾元素 | RPOP key |
RPOPLPUSH | 在一个原子时间内,执行两个动作:(1)将列表source中最后一个元素弹出并返回给客户端(2)将source弹出的元素插入到列表desination,作为destination列表的头元素 | RPOPLPUSH source destination |
RPUSH | (1)将一个或多个值value插入到列表key的表尾 | RPUSH key value [value ...] |
RPUSHX | (1)将value插入到列表key的表尾,当且仅当key存在并且是一个列表(2)key不存在,RPUSHX什么都不做 | RPUSHX key value |
3.哈希对象
特点:
1.哈希对象的编码可以是ziplist或者hashtable;
hasttable底层是通过字典实现的;

(键值对按照顺序排列)
2. 键和值的长度小于64,且数量都小于512的时候,使用ziplist;
3.字典数据结构特点:1.字典数据结构中每个键都是字符串对象,对象是保存了键值对的键。2。字典数据结构中每个值都是字符串对象,对象中保存了键值对的值;
(通俗点就是:string -> (无数个键值对 )->这无数个键值对中,key必定是string对象 ,java中就是Map<String,Map<String,Object>>一样的意思)
常用指令
4.集合对象
特点:
1.集合对象的编码可以是inset或hasetable;(键值对值为null的hasetable)
2.当集合对象都是int类型且当总长度不超过512;使用intset否则hashtable
常用指令
命令 | 描述 | 用法 |
SADD | (1)将一个或多个member元素加入到key中,已存在在集合的member将被忽略(2)假如key不存在,则只创建一个只包含member元素做成员的集合(3)当key不是集合类型时,将返回一个错误 | SADD key number [member ...] |
SCARD | (1)返回key对应的集合中的元素数量 | SCARD key |
SDIFF | (1)返回一个集合的全部成员,该集合是第一个Key对应的集合和后面key对应的集合的差集 | SDIFF key [key ...] |
SDIFFSTORE | (1)和SDIFF类似,但结果保存到destination集合而不是简单返回结果集(2) destination如果已存在,则覆盖 | SDIFFSTORE destionation key [key ...] |
SINTER | (1)返回一个集合的全部成员,该集合是所有给定集合的交集(2)不存在的key被视为空集 | SINTER key [key ...] |
SINTERSTORE | (1)和SINTER类似,但结果保存早destination集合而不是简单返回结果集(2)如果destination已存在,则覆盖(3)destination可以是key本身 | SINTERSTORE destination key [key ...] |
SISMEMBER | (1)判断member元素是否key的成员,0表示不是,1表示是 | SISMEMBER key member |
SMEMBERS | (1)返回集合key中的所有成员(2)不存在的key被视为空集 | SMEMBERS key |
SMOVE | (1)原子性地将member元素从source集合移动到destination集合(2)source集合中不包含member元素,SMOVE命令不执行任何操作,仅返回0(3)destination中已包含member元素,SMOVE命令只是简单做source集合的member元素移除 | SMOVE source desination member |
SPOP | (1)移除并返回集合中的一个随机元素,如果count不指定那么随机返回一个随机元素(2)count为正数且小于集合元素数量,那么返回一个count个元素的数组且数组中的元素各不相同(3)count为正数且大于等于集合元素数量,那么返回整个集合(4)count为负数那么命令返回一个数组,数组中的元素可能重复多次,数量为count的绝对值 | SPOP key [count] |
SRANDMEMBER | (1)如果count不指定,那么返回集合中的一个随机元素(2)count同上 | SRANDMEMBER key [count] |
SREM | (1)移除集合key中的一个或多个member元素,不存在的member将被忽略 | SREM key member [member ...] |
SUNION | (1)返回一个集合的全部成员,该集合是所有给定集合的并集(2)不存在的key被视为空集 | SUNION key [key ...] |
SUNIONSTORE | (1)类似SUNION,但结果保存到destination集合而不是简单返回结果集(2)destination已存在,覆盖旧值(3)destination可以是key本身 | SUNION destination key [key ...] |
5.有序集合对象
特点:
1.有序集合可以是ziplist或者skiplist;
2.ziplist根据对象分值进行排序;较小的放在表头位置;
3.skiplist底层是通过dict和zset实现的;好处是降低了数据查询的复杂度;
(skiplist结构如下:)
有序集合中,跳跃表和字典公用一份数据,但是同时各自有一份元素。
4.保存的元素数量小于128且保存的所有元素长度都小于64字节使用ziplist,否则使用 skiplist 编码。
常用指令
命令 | 描述 | 用法 |
ZADD | (1)将一个或多个member元素及其score值加入有序集key中(2)如果member已经是有序集的成员,那么更新member对应的score并重新插入member保证member在正确的位置上(3)score可以是整数值或双精度浮点数 | ZADD key score member [[score member] [score member] ...] |
ZCARD | (1)返回有序集key的元素个数 | ZCARD key |
ZCOUNT | (1) 返回有序集key中,score值>=min且<=max的成员的数量 | ZCOUNT key min max |
ZRANGE | (1)返回有序集key中指定区间内的成员,成员位置按score从小到大排序(2)具有相同score值的成员按字典序排列(3)需要成员按score从大到小排列,使用ZREVRANGE命令(4)下标参数start和stop都以0为底,也可以用负数,-1表示最后一个成员,-2表示倒数第二个成员(5)可通过WITHSCORES选项让成员和它的score值一并返回 | ZRANGE key start stop [WITHSCORES] |
ZRANK | (1)返回有序集key中成员member的排名,有序集成员按score值从小到大排列(2)排名以0为底,即score最小的成员排名为0(3)ZREVRANK命令可将成员按score值从大到小排名 | ZRANK key number |
ZREM | (1)移除有序集key中的一个或多个成员,不存在的成员将被忽略(2)当key存在但不是有序集时,返回错误 | ZREM key member [member ...] |
ZREMRANGEBYRANK | (1)移除有序集key中指定排名区间内的所有成员 | ZREMRANGEBYRANK key start stop |
ZREMRANGEBYSCORE | (1)移除有序集key中,所有score值>=min且<=max之间的成员 | ZREMRANGEBYSCORE key min max |
6.系统相关指令及key管理相关指令
系统相关指令:
key管理相关指令
命令 | 描述 | 用法 |
DEL | (1)删除给定的一个或多个key(2)不存在的Key将被忽略 | DEL key [key ...] |
EXISTS | (1)检查给定key是否存在 | EXISTS key |
EXPIRE | (1)为给定key设置生存时间,key过期时它会被自动删除(2)对一个已经指定生存时间的Key设置执行EXPIRE,新的值会代替旧的值 (3)如果设置位负值,会立刻被删除 | EXPIRE key seconds |
EXPIREAT | (1)同EXPIRE,但此命令指定的是UNIX时间戳,单位为秒 | EXPIRE key timestamp |
KEYS | (1)查找所有符合给定模式pattern的key,下面举一下例子(2)KEYS *匹配所有key(3)KEYS h?llo匹配hello、hallo、hxllo等(4)KEYS h*llo匹配hllo、heeeeello等(5)KEYS h[ae]llo匹配hello和hallo(6)特殊符号想当做查找内容经的使用\ | KEYS pattern |
MIGRATE | (1)原子性地将key从当前实例传送到目标实例指定的数据库上(2)原数据库Key删除,新数据库Key增加(3)阻塞进行迁移的两个实例,直到迁移成功、迁移失败、等待超时三个之一发生 | MIGRATE host port key destination-db timeout [COPY] [REPLACE] |
MOVE | (1)将当前数据库的key移动到给定数据库的db中(2)执行成功的条件为当前数据库有key,给定数据库没有key | MOVE key db |
dumprestore | (1)dump将键值序列化;(2)restore表示还原;一般用于不同redis实例中数据迁移 | dump keyrestore key ttl value |
PERSIST | (1)移除给定key的生存时间,将key变为持久的 | PERSIST key |
RANDOMKEY | (1)从当前数据库随机返回且不删除一个key, | RANDOMKEY |
RENAME | (1)将key改名为newkey(2)当key和newkey相同或key不存在,报错(3)newkey已存在,RENAME将覆盖旧值 | RENAME key newkey |
RENAMENX | (1)为了防止强行rename,只有在newkey不存在的情况下才能执行 | RENAMENK key newkey |
TTL | (1)以秒为单位,返回给定的key剩余生存时间 | TTL key |
PTTL | (1)以毫秒为单位,返回给定的key剩余生存时间 | PTTL key |
TYPE | (1)返回key锁存储的值的类型 | TYPE key |
注意:
1.对于字符串类型的键,set命令很容易去掉过期时间;
2.Redis不支持二级数据结构内部元素的过期功能。例如,hash对象中,值中多个KEY的过期时间无法指定
3.setex是原子操作,并且可以减少一次网络请求时间
7.类型检查和命令多态
Redis中操作间的命令分为两种。
其中一种命令可以对任何类型的键执行,比如DEL命令,EXPIRE命令,RENAME命令,TYPE命令,OBJECT命令等;
另一种是只能对特定类型键执行;
- 类型检查的实现
在执行指令的时候,服务器会先判断RedisObject的类型是否有相关的指令,没有的话,不能执行
- 多态命令的实现
一个命令可以同时用于处理多种不同类型的键;
8.内存回收
通过引用计数技术实现内存回收机制;
typedef struct redisObject{
</span><span style="color: #008000;">//</span><span style="color: #008000;">.....</span>
<span style="color: #0000ff;">int</span> refcount;<span style="color: #008000;">//</span><span style="color: #008000;">引用计数
</span><span style="color: #008000;">//</span><span style="color: #008000;">.....</span>
}
对象引用计数信息会随着对象的使用状态而不断变化;
创建一个对象的时候,值会被初始化为1;
被新程序使用时,引用计数会增1;
不再被程序使用会减1;
当对象引用计数值为0,对象锁占用的内存会被释放;
9.对象共享
对象的引用计数属性带有对象共享的作用;
10.对象的空转时长
---------------------------------
typedef struct redisObject{
// ... unsigned lru : 22 ; // ... }robj;- 空转时长就是通过将当前时间减去键的值对象的lru时间计算得出的
-------------------------------
- Object IDLETIME 命令可以打印出给定键的空转时长;
- 这个命令在放键的值对象时,不会修改值对象的lru属性;
- 键的空转时常的另一个作用,就是当maxmemory选项设置最大值时,通过内存回收算法volatile-lru 或者 allkeys-lru,当服务器的内存超过设置的maxmemory值时,空转时长较高的部分,会被内存回收;
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· 葡萄城 AI 搜索升级:DeepSeek 加持,客户体验更智能
· 什么是nginx的强缓存和协商缓存
· 一文读懂知识蒸馏