您的位置:首页 > 数据库 > Redis

【Redis基础】五种数据类型

2017-07-24 18:35 429 查看
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让当前键值递减
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个时,使用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命令参考
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: