今天中午吃完饭去对门的奥林匹克森林公园转了一圈,花开的特别漂亮,突然感觉redis多彩多姿的数据结构就像这些花儿一样。
Redis是一个操作数据结构的语言工具,主要包括5种基本数据类型,咱们系列一已经简单说过:string、hash、list、set、zset。在具体描述这几种数据类型之前,我们先通过一张图了解下Redis内部内存管理中是如何描述这些不同数据类型的:
(一)string
string是最简单的类型,可以理解成与 Memcached 是一模一样的类型,一个 key 对应一个value,它支持的操作与 Memcached的操作类似,但它的功能更丰富:string类型是二进制安全的,意思是 value其实不仅是String,也可以是数字,它可以包含任何数据,比如 jpg 图片或者序列化的对象。
常用命令:set,setnx,setex,setrange,mset,msetnx,
get,getset,getrange,mget,
decr,decrby,incr,incrby,
append,strlen
解释set name xingxing,key就是name,对应的value就是xingxing。在Rredis中同一个键只允许有一个,不允许重复。有set赋值就应该有get取值,而且可以批量操作mset;也可以重复检查setnx(not exit);也可以设置有效期setex,单位是秒,如果不设置有效期,则永久有效。
(二)hash
hash 是一个string类型的field和value的映射表。它的添加、删除操作都是O(1)(平均)。hash特别适合用于存储对象。相较于将对象的每个字段存成单个string类型。将一个对象存储在hash类型中会占用更少的内存,并且可以更方便的存取整个对象。可以通过如下配置指定大小:
hash-max-zipmap-entries64 #配置字段最多 64 个
hash-max-zipmap-value 512#配置 value 最大为 512 字节
(三)list
list 是一个链表结构,主要功能是push、pop、获取一个范围的所有值等等,操作中 key 理解为链表的名字。Redis 的 list类型其实就是一个每个子元素都是 string 类型的双向链表。链表的最大长度是(2的 32 次方)。我们可以通过 push,pop操作从链表的头部或者尾部添加删除元素。这使得 list既可以用作栈,也可以用作队列。
常用命令:lpush、rpush、linsert、lset、lrem、lrange
(四)set
set是集合,和我们数学中的集合概念相似,对集合的操作有添加删除元素,有对多个集合求交并差等操作,操作中key 理解为集合的名字。Redis 的 set 是 string类型的无序集合。set 元素最大可以包含(2 的 32 次方)个元素。
set 的是通过 hash table实现的,所以添加、删除和查找的复杂度都是 O(1)。hash table 会随着添加或者删除自动的调整大小。关于 set集合类型除了基本的添加删除操作,其他有用的操作还包含集合的取并集(union),交集(intersection),差集(difference)。
常用命令:sadd、srem、spop、smembers、sdiff、sunion等
(五)zset(stored set)
zset 是 set 的一个升级版本,它在 set 的基础上增加了一个顺序属性,这一属性在添加修改元素的时候可以指定,每次指定后,zset会自动重新按新的值调整顺序。可以理解为有两列的 mysql 表,一列存value,一列存顺序,操作中 key 理解为 zset 的名字。
常用命令:zadd、zrem、zincrby、zrank、zrevrank、zrevrange、zcount
这和开发中常用的存储类型很一致,而且命令都是同样的操作,用起来也得心应手。