所谓工欲善其事,必先利其器。前面我们介绍了Redis在windows和在Linux下的安装和配置。Redis处理性能强大之外,还有一个优势就是提供了多种数据结构,应对不同的业务场景。接下来我们介绍Redis的常用数据类型。
Redis支持五种数据类型:string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合)。
一、String(字符串)
string 是 redis 最基本的类型,你可以理解成与 Memcached 一模一样的类型,一个 key 对应一个 value。string 类型是二进制安全的,它可以包含任何数据类型。比如序列化的对象等。
string 类型是 Redis 最基本最常用的数据类型,string 类型的值最大能存储 512MB。
1.测试
127.0.0.1:6379> SET weiz:string "hello weiz" OK 127.0.0.1:6379> GET weiz:string "hello weiz"
在以上实例中我们使用了 Redis 的 SET 和 GET 命令新增和获取缓存数据。键为 "weiz:string",对应的值为"hello weiz"。如下图所示:
2.常用命令
除了上面的get,set命令外,Redis还提供了很多功能强大的命令,比如递增,递减等,具体如下所示:
- mset用于同时设置一个或多个键值对
- mget用于同时获取一个或多个 value
- expire用于给已经存在的键设置过期时间,单位为秒
- setnx用于如果键不存在,则会添加成功,否则将添加失败
- setex用于在添加键值对的时候就为其设置过期时间(set 方式添加是永不过期)
- msetnx用于批量添加,如果有一个键已经存在,则所有都将添加失败
- incr如果值是integer ,则会将其进行加一的操作,如果不是则会报错
- decr如果值是integer ,则会将其进行减一的操作,如果不是则会报错
- incrby用于自定义需要加多少
- decrby用于自定义需要减多少
二、Hash(哈希)
Redis hash 是一个键值(key=>value)对集合。它是一个 string 类型的 field 和 value 的映射表,hash 适合用于存储对象或map等集合数据。
1.测试示例
127.0.0.1:6379> HMSET weiz:hash field1 "Hello" field2 "World" "OK" 127.0.0.1:6379> HGET weiz:hash field1 "Hello" 127.0.0.1:6379> HGET weiz:hash field2 "World"
上面的示例中,我们使用了 Redis的 HMSET, HGET 命令,HMSET 设置了两个 field=>value 的Hash数据集合, 然后通过HGET 获取对应 field 对应的 value。
每个 hash 可以存储 232 -1 键值对(40多亿)。
2.常用命令
除了上面的HMSET和HGET 外,还有Redis还提供了其他的一些命令来操作Hash数据,常用的命令如下:
- hmset用于同时将多个 field-value (字段-值)对设置到哈希表中;
- hmget用于返回哈希表中,一个或多个给定字段的值;
- hexists用于查看哈希表的指定字段是否存在;
- hincrby用于为哈希表中的字段值加上指定增量值;
- hlen用于获取哈希表中字段的数量;
- hvals返回哈希表所有字段的值,返回一个包含哈希表中所有值的表;
- hkeys用于获取哈希表中的所有字段名;
- hsetnx用于为哈希表中不存在的的字段赋值;
三、List(列表)
List列表是简单有序的字符串列表,常用的操作是向列表两端添加元素,或者获得列表的某一个片段。你可以添加一个元素到列表的头部(左边)或者尾部(右边)。通过List数据类型可以实现队列等功能。
1.测试示例
127.0.0.1:6379> lpush weiz:list redis (integer) 1 127.0.0.1:6379> lpush weiz:list mongodb (integer) 2 127.0.0.1:6379> lpush weiz:list rabbitmq (integer) 3 127.0.0.1:6379> lrange weiz:list 0 10 1) "rabbitmq" 2) "mongodb" 3) "redis" 127.0.0.1:6379>
上面的示例中,我们使用Redis的lpush 命令往键为"weiz:list"的list中加入了3个值。然后通过lrange命令获取list中的数据。
list列表最多可存储 232 - 1 元素 (4294967295, 每个列表可存储40多亿)。
2.常用命令
除了lpush,lpop,lrange命令外,还有rpush,rpop,rrange等命令,具体如下:
- LPUSH,用于向列表左边增加元素;
- RPUSH,用于向列表右边增加元素;
- LPOP,用于从列表左边弹出元素;
- RPOP,用于从列表右边弹出元素;
- LLEN,用于获取列表中元素的个数;
- LRANGE,用于获得列表片段;
- LREM,用于删除列表中指定值;
- LINDEX,用于获得指定索引的元素值;
- LSET,用于设置指定索引的元素值;
- LTRIM,用于只保留列表指定片段;
- LINSERT,用于向列表中插入元素;
四、Set(集合)
Redis 的 Set 是 string 类型的无序集合。用于保存多个字符串元素,集合中的元素不能重复,并且集合中的元素也是无序的,无法通过下标来获取集合中的元素,这些特性与java的set非常类似。Redis的 Set集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是 O(1)。
1.sadd命令
Redis提供了sadd命令添加一个 string 元素到 key 对应的 set 集合中,成功返回 1,如果元素已经在集合中返回 0。命令格式如下:sadd key member
2.测试示例
127.0.0.1:6379> sadd weiz:set redis (integer) 1 127.0.0.1:6379> sadd weiz:set mongodb (integer) 1 127.0.0.1:6379> sadd weiz:set rabbitmq (integer) 1 127.0.0.1:6379> sadd weiz:set rabbitmq (integer) 0 127.0.0.1:6379> smembers weiz:set
上面的示例中,我们通过sadd命令添加数据到set中,然后通过smembers命令获取set中的数据,如下图所示:
集合中最大的成员数为 232 - 1(4294967295, 每个集合可存储40多亿个成员)。
3.常用命令
除了sadd,smembers命令外,Redis还提供了交集,并集等功能强大的命令,具体如下:
- scard 获取集合的成员数
- sdiff 获取集合与集合的差集
- sinter 获取集合与集合的交集
- sismember 判断member元素是否是集合key的成员
- smembers 获取集合中的所有成员
- sunion 获取所有给定集合的并集
- srem 移除一个或多个元素
- sscan 迭代集合中元素
五、zset(sorted set:有序集合)
zset 和 set 一样也是string类型元素的集合,且不允许重复的成员。不同的是zset为每个元素都关联了一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序。
zset的成员是唯一的,但分数(score)却可以重复。
1.zadd 命令
Redis提供了zadd命令添加元素到集合,如果元素在集合中存在则更新对应score,命令格式如下:zadd key score member
2.测试示例
127.0.0.1:6379> zadd weiz:zset 0 redis (integer) 1 127.0.0.1:6379> zadd weiz:zset 1 mongodb (integer) 1 127.0.0.1:6379> zadd weiz:zset 2 rabbitmq (integer) 1 127.0.0.1:6379> zadd weiz:zset 3 rabbitmq (integer) 0 127.0.0.1:6379> ZRANGEBYSCORE weiz:zset 0 1000 1) "mongodb" 2) "rabbitmq" 3) "redis"
上面的示例中,我们使用zadd添加了3个数据,然后通过 ZRANGEBYSCORE命令获取对应的数据,如下图所示:
3.常用命令
除了sadd,smembers命令外,Redis还提供了交集,并集等功能强大的命令,具体如下:
- zadd 用于在集合中增加序号为n的value;
- zrange 用于排序指定的rank(排名)范围内的元素并输出;
- zrevrange 用于反向排序;
- zrangebyscore 用于获取指定的score范围内的元素;
- zrangebylex 用于获取某个范围的数据,还可以使用limit分页;
- zincrby 用于为元素的score累加,新元素score基数为0
- zrem 用于删除集合中指定的元素;
- zrank 用于查询指定value的排名,注意不是score;
- zcard 用于获取集合的元素个数;
- zremrangebyrank 用于删除某个范围内的元素;
- zremrangebyscore 用于删除score在某个范围内的元素;
最后
以上,我们就把Redis的数据结构介绍完了,Redis的各种数据结构都有对应的使用场景。作为开发人员必须熟练掌握。磨刀不误砍柴工,只有掌握了这些基础,才能在实际项目中熟练使用Redis。