【Redis基础】五种数据类型

来源:互联网 发布:淘宝网信用卡网银支付 编辑:程序博客网 时间:2024/06/04 18:24

Redis的键值有5种数据类型,分别为字符串,散列表,列表,集合,有序集合,接下来我详细介绍

引入

1.redisObject

  • Redis中的每个对象都由一个redisObject结构表示

  • Redis对象redis.h/redisObject源码如下:

/* The actual Redis Object *//* * Redis 对象 */#define REDIS_LRU_BITS 24#define REDIS_LRU_CLOCK_MAX ((1<<REDIS_LRU_BITS)-1) /* Max value of obj->lru */#define REDIS_LRU_CLOCK_RESOLUTION 1000 /* LRU clock resolution in ms */typedef struct redisObject {    // 类型    unsigned type:4;    // 编码    unsigned encoding:4;    // 对象最后一次被访问的时间    unsigned lru:REDIS_LRU_BITS; /* lru time (relative to server.lruclock) */    // 引用计数    int refcount;    // 指向实际值的指针    void *ptr;} robj;

接下来分析redisObject 的结构体内容

2.type

对象的type属性记录了对象的类型,一共有5种类型,如下图

这里写图片描述

3.encoding

  • 对象的ptr指针指向对象的底层实现数据结构,而这些数据结构由encoding属性决定

  • encoding属性记录了对象所使用的编码。

  • 不同类型和编码的对象如下图所示:

这里写图片描述

4.refcount

  • 内存回收
    Redis程序可以通过跟踪对象的引用计数值,在适当的时候进行内存回收。

  • 对象共享
    两个相同的键指向同一个字符串对象,引用计数+1,这样更节约内存。

5.lru

对象的空转时长可以用Object idletime命令获取

字符串(String)

1.编码类型

  • int:保存整数值

  • raw:保存字符串值(长度>39字节)

  • embstr:保存短字符串的优化编码方式(字符串长度<=39字节),是只读的,修改时会先转换为raw。

注:使用embstr编码创建字符串对象只需内存分配一次,而raw需要两次;embstr编码释放字符串对象,只需要调用一次内存释放函数,而raw需要两次;并且embstr编码的字符串保存在一块连续的内存里面。

2.常用命令

命令 功能 set key value 设置字符串的值 set key value NX 仅在key不存在的情况下,才进行设置操作,若键已存在,则不会覆盖旧值 set key value XX 仅在key已存在的情况下,才进行设置操作,若键不存在,则失败 get key 获取键的值 Del key 删除键 Incr key 让当前键值递增,并返回递增后的值 Decr key 让当前键值递减,并返回递减后的值 Incrby key increment 指定一次增加的值,并返回递增后的值 Decrby key decrement 指定一次减少的值,并返回递减后的值 Mset key1 value1 … 同时设置多个键的值 Mget key1 key2 … 同时获得多个键的值 strlen key 获取字符串长度 Bitcount key 获得字符串类型键中值是1的二进制位个数 setrange name 3 515 替换name的值,从第三位开始替换为515

列表(list)

1.编码类型

  • ziplist:当列表对象保存的字符串元素长度小于64字节,数量小于512个时,使用压缩表

  • linkedlist:不满足压缩表的条件,就使用链表。

2.常用命令

命令 功能 Lpush key value 向列表左边增加元素(栈:先进后出) Rpush key value 向列表右边增加元素(队列:先进先出) Lrange key start stop 获得列表片段 Lpop key 从左边弹出一个元素,并删除 Rpop key 从右边弹出一个元素,并删除 Lindex key index 获取指定索引的元素值 llen key 获取列表中元素的个数 lrem key count value 删除列表中前count个值为value的元素 ltrim key start stop 只保留列表指定片段[start-stop], rpoplpush list1 list2 将元素从list1移动到list2 lset key index value 设置指定下标的值 linsert key before/after v1 v2 向列表中插入元素,将v1插入到值2的前面/后面

散列(Hash)

1.编码类型

  • ziplist:当哈希对象保存的字符串元素长度小于64字节,数量小于512个时,使用压缩表

  • HashTable:不满足ziplist的条件,就使用HashTable编码

2.常用命令

命令 功能 hset key field value 给字段赋值 hsetnx key field value 当字段不存在时赋值 hmsetkey field1 value1 [field2 values] 设置多个字段的值 hget key field 获取字段值 hmget key field1 [field2] 获得多个字段的值 hgetall key 获取所有字段和字段值 hexists key field 判断字段是否存在 hkeys key 获取所有字段的名字 hvals key 获取所有字段的值 hlen key 获取字段数量 hincrby key field increment 增加数字,仅对数字类型的值有用

集合(Set)

1.编码类型

  • intset:当集合对象保存的所有元素都是整数值,且元素数量不超过512个时,使用intset

  • HashTable:不满足intset的条件,就使用HashTable

2.常用命令

命令 功能 sadd key value1 [value2 value3 …] 增加元素 srem key value1 [value2 value3 …] 删除元素 smembers key 获取集合中所有的元素 sismember key value 判断元素是否在集合中 scard key 获取集合里面的元素个数 srandmember key 随机获取集合中的元素 spop key 随机出栈 smove key1 key2 将key1里的某个值赋给key2 SINTER key1 key2 [key3 …] 对集合做交集运算 SUNION key1 key2 [key3 …] 对集合做并集运算 SDIFFSTORE destination key1 key2 [key3 …] 对集合做差集并将结果存储

有序集合(zset)

1.编码类型

  • ziplist:当有序集合对象的所有元素长度都小于64,且元素数量小于128时,使用ziplist

  • skiplist:不满足ziplist的条件时,使用skiplist编码

2.常用命令

命令 功能 zadd key score1 value1 … 增加元素 zrange key start stop [WITHSCORE] 返回索引从start到stop之间的所有元素,若要获取分数末尾加上withscores,( 不包含 +inf 正无穷大 -inf 负无穷大 zrangebyscore key min max 获取指定分数范围内的元素,[min,max] zscore key value 获取元素的分数 zincrby key increment value 增加某个元素的分数 zcard key 获取集合中元素的数量 zrem key value1 [value2 …] 删除一个或多个元素 zrevrangebyscore key min max 不仅是由大到小输出,而且它的min和max参数的顺序与zrangebyscore相反 zremrangebyscore key start end 依据顺序号删除元素 zremrangebyrank key start end 根据索引删除元素 zcount key score 获取指定分数范围内的元素个数 zrank key values 获得元素排名(从小到大) zrevrank key values 和zrank命令相反(分数大的元素排名为0)



本人才疏学浅,若有错,请指出,谢谢!
如果你有更好的建议,可以留言我们一起讨论,共同进步!
衷心的感谢您能耐心的读完本篇博文!

参考书籍:《Redis设计与实现(第二版)》—黄健宏
参考链接:Redis命令参考

原创粉丝点击