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值时,空转时长较高的部分,会被内存回收;
posted @ 2020-05-10 21:41  PerfectLi  阅读(747)  评论(0编辑  收藏  举报