2.1 数据类型:

Redis 数据类型

Redis支持五种数据类型:string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合)。


String(字符串)

string是redis最基本的类型,你可以理解成与Memcached一模一样的类型,一个key对应一个value。

string类型是二进制安全的。意思是redis的string可以包含任何数据。比如jpg图片或者序列化的对象 。

string类型是Redis最基本的数据类型,一个键最大能存储512MB。

redis数据类型 以及作用 redis数据类型详解_redis

1、O(1)时间复杂度获取字符串长度、未用长度、已用长度
2、预分配机制,减少内存再分配次数

3、惰性删除机制,字符串缩减长度后的空间不释放,作为预分配保留

String在redis内部存储默认就是一个字符串,被redisObject所引用,当遇到incr,decr等操作时会转成数值型进行计算,此时redisObject的encoding字段为int。

命令:get/set

业务场景:

String是最常用的一种数据类型,普通的key/ value 存储都可以归为此类.

HASH

Redis hash 是一个键值(key=>value)对集合。

Redis hash是一个string类型的field和value的映射表,hash特别适合用于存储对象。


可以将数据库一条记录或程序中一个对象转换成hashmap存放在redis中。


业务场景:用户有多个属性,修改是存在修改一个属性序列化反序列化整个对象,采用hash时:Key仍然是用户ID, value是一个Map,这个Map的key是成员的属性名,value是属性值,这样对数据的修改和存取都可以直接通过其内部Map的Key(Redis里称内部Map的key为field), 

命令:hget.hset

上面已经说到Redis Hash对应Value内部实际就是一个HashMap,实际这里会有2种不同实现,这个Hash的成员比较少时Redis为了节省内存会采用类似一维数组的方式来紧凑存储,而不会采用真正的HashMap结构,对应的value redisObject的encoding为zipmap,当成员数量增大时会自动转成真正的HashMap,此时encoding为ht。

List(列表)

Redis 列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边)。

业务场景:关注列表,粉丝列表。或者是一些常见的城市列表等

实现方式:Redis list的实现为一个双向链表,即可以支持反向查找和遍历,更方便操作,不过带来了部分额外的内存开销,Redis内部的很多实现,包括发送缓冲队列等也都是用的这个数据结构。

redis数据类型 以及作用 redis数据类型详解_Redis_02

命令:lpush,rpush,lpop,rpop,lrange等。

Set(集合)

Redis的Set是string类型的无序集合。

集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是O(1)。

sadd 命令

添加一个string元素到,key对应的set集合中,成功返回1,如果元素已经在集合中返回0,key对应的set不存在返回错误。

业务场景:

Set对外提供的功能与list类似,当需要存储一个列表数据,又不希望出现重复数据时,可选用set。比如共同好友等。

实现方式:

set 的内部实现是一个 value永远为null的HashMap,实际就是通过计算hash的方式来快速排重的,这也是set能提供判断一个成员是否在集合内的原因。

命令:zadd,zrange,zrem,zcard等

zset(sorted set:有序集合)


Redis zset 和 set 一样也是string类型元素的集合,且不允许重复的成员。

不同的是每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序。

zset的成员是唯一的,但分数(score)却可以重复。

业务场景:根据时间排序的新闻列表等,阅读排行榜

实现方式:edis sorted set的内部使用HashMap和跳跃表(SkipList)来保证数据的存储和有序,HashMap里放的是成员到score的映射,而跳跃表里存放的是所有的成员,排序依据是HashMap里存的score,使用跳跃表的结构可以获得比较高的查找效率,并且在实现上比较简单。

redis数据类型 以及作用 redis数据类型详解_字符串_03