【Redis基础】五种数据类型
2017-07-24 18:35
429 查看
Redis的键值有5种数据类型,分别为字符串,散列表,列表,集合,有序集合,接下来我详细介绍
Redis对象redis.h/redisObject源码如下:
接下来分析redisObject 的结构体内容
encoding属性记录了对象所使用的编码。
不同类型和编码的对象如下图所示:
Redis程序可以通过跟踪对象的引用计数值,在适当的时候进行内存回收。
对象共享
两个相同的键指向同一个字符串对象,引用计数+1,这样更节约内存。
raw:保存字符串值(长度>39字节)
embstr:保存短字符串的优化编码方式(字符串长度<=39字节),是只读的,修改时会先转换为raw。
注:使用embstr编码创建字符串对象只需内存分配一次,而raw需要两次;embstr编码释放字符串对象,只需要调用一次内存释放函数,而raw需要两次;并且embstr编码的字符串保存在一块连续的内存里面。
linkedlist:不满足压缩表的条件,就使用链表。
HashTable:不满足ziplist的条件,就使用HashTable编码
HashTable:不满足intset的条件,就使用HashTable
skiplist:不满足ziplist的条件时,使用skiplist编码
本人才疏学浅,若有错,请指出,谢谢!
如果你有更好的建议,可以留言我们一起讨论,共同进步!
衷心的感谢您能耐心的读完本篇博文!
参考书籍:《Redis设计与实现(第二版)》—黄健宏
参考链接:Redis命令参考
引入
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 | 让当前键值递减 d39e ,并返回递减后的值 |
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个时,使用intsetHashTable:不满足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时,使用ziplistskiplist:不满足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命令参考
相关文章推荐
- Redis学习笔记之入门基础知识——五种数据类型
- Redis——五种数据类型
- Redis 五种数据类型之简单使用
- 数据库的连接、索引和Redis的五种数据类型及其操作命令、使用场景
- redis五种数据类型的使用(zz)
- python基础知识——五种数据类型+切片操作
- Redis五种数据类型
- redis基础数据类型详解
- Redis中的五种数据类型
- redis五种数据类型的使用
- (转) 淘淘商城系列——Redis五种数据类型介绍
- Redis五种数据类型的使用场景
- Redis的五种数据类型
- Redis基础数据类型详解之Hash
- redis 五种数据类型的使用场景
- redis的五种数据类型
- 02redis五种数据类型
- redis五种数据类型和常用命令及适用场景
- redis学习--基础3 数据类型string
- Redis五种数据类型介绍