zoukankan      html  css  js  c++  java
  • 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{
        
        //.....
        int refcount;//引用计数
        //.....
        
    }
    对象引用计数信息会随着对象的使用状态而不断变化;
    创建一个对象的时候,值会被初始化为1被新程序使用时,引用计数会增1不再被程序使用会减1当对象引用计数值为0,对象锁占用的内存会被释放;
    

    9.对象共享

    对象的引用计数属性带有对象共享的作用;

    10.对象的空转时长

    
    
    typedef struct redisObject{
        // ...    
        unsigned lru : 22 ;
        // ...  
    }robj;
    空转时长就是通过将当前时间减去键的值对象的lru时间计算得出的
    
    Object IDLETIME 命令可以打印出给定键的空转时长;
    这个命令在放键的值对象时,不会修改值对象的lru属性;
    
    键的空转时常的另一个作用,就是当maxmemory选项设置最大值时,通过内存回收算法volatile-lru 或者 allkeys-lru,当服务器的内存超过设置的maxmemory值时,空转时长较高的部分,会被内存回收;











  • 相关阅读:
    启动Tomcat报错:严重: Exception starting filter struts2 java.lang.NoClassDefFoundError: org/apache/commons/lang/StringUtils
    数学 交换律
    android中LayoutInflater的使用
    数学 三角函数
    数学 矩阵
    数学 弧度
    数学 分配律
    Android开发必备的免费资源和工具
    数学 结合律
    View.setTag()的作用
  • 原文地址:https://www.cnblogs.com/perferect/p/12865224.html
Copyright © 2011-2022 走看看