引言
Redis作为内存数据库,不仅性能强劲,而且具有 可扩展(主从复制和分片)、持久化(重启后可恢复之前数据)、内存存储(使得redis的速度很快)、远程(可和多个客户端打交道) 等特性,及支持存储五种数据类型的结构.
以下是常见的数据库及缓存服务器对比
名称
|
类型
|
存储结构
|
其它功能
|
Redis |
内存存储、非关系型DB
|
字符串、列表、集合、散列、有序集合
|
复制、持久化、分片、发布与订阅等
|
Mysql
|
关系型DB
|
表、视图等
|
支持主主、主从复制、ACID等
|
Memcached
|
内存存储的键值缓存
|
字符串键值对
|
多线程
|
MongoDB
|
硬盘存储、非关系型文档DB
|
表
|
支持主从复制、分片等
|
Redis支持的5种数据结构类型
结构类型
|
存储结构
|
操作
|
STRING
|
字符串、浮点数、整数
|
对字符串操作,支持浮点型或整型值的自增、自减
|
LIST
|
链表,链表上的每个节点包含一个字符串
|
链表两端推入或弹出元素,偏移,读取,移除元素
|
SET |
字符串的集合,无序、不重复
|
添加,获取,移除,是否存在,交集,并集,差集等
|
HASH
|
键值对的无序散列表
| 获取,添加,移除等 |
ZSET
|
字符串成员、浮点数分值构成的有序映射,根据分值大小排序
|
添加,获取,移除,根据分值范围获取
|
字符串(STRING 有序、去重)
redis支持的字符串可以存储以下3种类型的值: 字节串、整数、浮点数
命令
|
用法及含义
|
INCR
|
INCR key-name 将键存储的值加上1
|
DECR
|
DECT key-name 将键存储的值减去1
|
INCRBY
|
INCRBY key-name num 将键存储的值加上增量num
|
DECRBY
|
DECRBY key-name num 将键存储的值减去num
|
INCRBYFLOAT
|
INCRBYFLOAT key-name num 将键存储的值加上浮点数num,redis版本高于2.6可用
|
注:
1、当值被存进redis字符串时,redis会自动判断其类型,若不为整数或浮点数,执行INCR、DECR等命令会返回错误;
2、当上述命令操作的key-name不存在,或key-name为空串时,redis执行时会把key-name对应的value当作0处理;
3、INCR和DECR命令在某些场合下非常实用,例如 接口限流访问功能,redis缓存用户在指定时间内的访问次数直接加1即可
以下为redis处理子串和二进制位的命令
命令
|
用法及含义
|
APPEND
|
APPEND key-name value 追加到key-name存储的值末尾
|
GETRNGE
|
GETRANGE key-name start end 截取存储key-name的值的start-->end偏移量
|
SETRANGE
|
SETRANGGE key-name start end 设置存储key-name的值的start-->end偏移量
|
GETBIT
| GETBIT key-name offset 将字符串看做二进制位串,并返回偏移量为offset的二进制位的值 |
注:
1、SETRANGE、SETBIT命令,若字符串长度不够,redis会自动填充空字节(null)来扩展至所需长度,然后再执行写入或更新操作;
2、GETRANGE命令,若长度超过实际长度,超过的长度会被视为空串;
列表(LIST 有序、可重复)
redis的列表常用命令
命令
|
用法及含义
|
RPUSH
|
RPUSH key-name value [……] 将一个或多个元素推入list的右端
|
LPUSH
|
LPUSH key-name value [……] 将一个或多个元素推入到list的左端
|
LPOP |
LPOP key-name 移除list最右端的元素
|
RPOP
|
RPOP key-name 移除list最左端的元素
|
LINDEX
|
LINDEX key-name offset 获取list偏移量为offset的元素
|
LRANGE |
LRANGE key-name start end 获取list指定偏移量内的元素
|
LTRIM
|
LTRIM key-name start end 修剪list指定偏移量元素,不包含start/end位置元素
|
阻塞式的列表弹出及移动命令(常用在消息传递和任务队列中)
命令
|
用法及含义
|
BLPOP
|
BLPOP key-name [key-name] timeout 从第一个非空列表中弹出位于最左端的元素或者在timeout时间内阻塞并等待可弹出的元素出现
|
BRPOP
|
BRPOP key-name [key-name] timeout 从第一个非空列表中弹出位于最右端的元素或者在timeout时间内阻塞并等待可弹出的元素出现
|
RPOPLPUSH |
BPOPLPUSH source-key dest-key 从source-key列表弹出位于最右端的元素,然后将这个元素推入dest-key列表的最左端,并返回这个元素
|
BRPOPLPUSH
|
BPOPLPUSH source-key dest-key timeout 从source-key列表弹出位于最右端的元素,然后将这个元素推入dest-key列表的最左端,并返回这个元素;若source-key为空,则在timeout秒内阻塞并等待可弹出的元素出现
|
集合(SET 无序、不可重复)
以下为集合的常用命令
命令
|
用法及含义
|
SADD
| SADD key-name item [item……] 将一个或多个元素添加至集合中,并返回被添加元素当中原本并不存在与集合里面的元素数量 |
SREM
|
SREM key-name item [item……] 从集合中移除一个或多个元素,并返回被移除的元素数量
|
SISMEMBER |
SISMEMBER key-name item 判断item元素是否存在于集合中
|
SCARD
| SCARD key-name 返回集合包含的元素数量 |
SMEMBERS |
SMEMBERS key-name 返回集合key-name包含的所有元素
|
SPOP
|
SPOP key-name 随机的从集合key-name中语出一个元素,并返回这个元素
|
SMOVE
|
SMOVE source-key dest-key item 若source-key集合中包含item元素,则从source-keyz中移除item元素,并将item元素添加至集合dest-key中;若item元素被成功移除则此命令返回1,否则返回0
|
SRANDMEMBERS
|
SRANDMEMBERS key-name [num] 从集合key-name中随机返回一个或多个元素,当num为正数时,此命令返回的随机元素不会重复;若为负数,则此命令返回的可能会重复
|
用于处理和组合多个集合的redis命令
命令
|
用法及含义
|
SDIFF
|
SDIFF key-name [key-name……] 返回那些存在于第一个集合、但不存在有其他集合中的元素(差集)
|
SDIFFSTORE
|
SDIFFSTORE dest-key key-name [key-name……] 将那些存在于第一个集合、但并不存在于其他集合中的元素存储到dest-key键中
|
SINTER |
SINTER key-name [key-name] 返回那些同时存在于所有集合中的元素(交集)
|
SINTERSTORE
|
SINTERSTORE dest-key key-name [key-name……] 将那些同时存在于所有集合中的元素存储在dest-key键中
|
SUNION |
SUNION key-name [key-name] 返回那些至少存在于一个集合中的元素(并集)
|
SUNIONSTORE
|
SUNIONSTORE dest-key key-name [key-name……] 将那些至少存在于一个集合中的元素存储至dest-key键中
|
散列(HASH 无序)
一些常用的redis散列命令
|
|
HMGET
|
HMGET key-name key [key……] 从散列表中获取一个或多个键的值
|
HMSET
|
HMSET key-name key value [key value……] 为散列里面的一个或多个键设置值
|
HDEL
|
HDEL key-name key [key……] 删除散列里面的一个或多个键值对,并返回成功找到并删除的元素数量
|
HLEN |
HLEN key-name 返回散列包含的键值对的数量
|
一些高级redis散列命令
命令
| 用法及含义 |
HEXISTS
| HEXISTS key-name key 检查key是否存在于key-name键名的散列中 |
HKEYS |
KKEYS key-name 获取key-name散列包含的所有键
|
HVALS |
HVALS key-name 获取key-name散列包含的所有值
|
HGETALL |
HGETALL key-name 获取key-name散列包含的所有键值对
|
HINCRBY |
HINCRBY key-name key num 给key-name散列中的key的值加上整数num
|
HINCRBYFLOAT |
HINCRBYFLOAT key-name key num 给key-name散列中的key的值加上浮点数num
|
注: HGETALL命令取值时,可能因为一次性获取大体积的值而导致redis服务器阻塞,可以先用HKEYS命令取出所有键,再用HGET命令依次取值
有序集合(ZSET)
命令
|
用法及含义
|
ZADD |
ZADD key-name score member [score member……] 将带有指定分值的成员添加到有序集合里面 |
ZREM |
ZREM key-name member [member……] 从有序集合中移除指定的成员,并返回被移除的成员的数量
|
ZCARD |
ZCARD key-name 返回有序集合包含的成员数量
|
ZINCRBY |
ZINCRBY key-name increment member 将member成员的分值加上increment
|
ZCOUNT
|
ZCOUNT key-name min max 返回分值介于min和max之间的成员数量
|
ZRANK |
ZRANK key-name member 返回成员member对应的分值在有序集合中的排名
|
ZSCORE
| ZSCORE key-name member 返回成员member对应的分值 |
ZRANGE |
ZRANGE key-name start end [WITHSCORES] 返回有序集合中分值排名介于start和end之间的成员;若给定了可选的,则此命令会将成员对应的分值也一并返回
|
命令
|
用法及含义
|
ZREVRANK | ZREVRANK key-name member 返回有序集合立成员member的排名,成员按照分值从大到小排列 |
ZREVRANGE |
ZREVRANGE key-name start end 返回有序集合给定排名范围的成员,成员按照分值从大到小排列
|
ZRANGEBYSCORE | ZRANGEBYSCORE key min max 返回有序集合中,分值介于min和max之间的所有成员 |
ZREVRANGEBYSCORE
|
ZREVRANGEBYSCORE key max min 获取有序集合汇总,分值介于min和max之间的所有成员,并按其分值从大到小排列来返回它们
|
ZREMRANGEBYRANK |
ZREMRANGEBYRANK key-name start end 移除有序集合中排名介于start和end之间的所有成员
|
ZREMRANGEBYSCORE
|
ZREMRANGEBYSCORE key-name min max 移除有序集合中分值介于min和max之间的所有成员
|
ZINTERSTOR |
ZINTERSTOR dest-key key-count key [key……] [WEIGHTS weight [weight……]} [AGGREGATE SUM|MIN|MAX] 对给定的有序集合执行类似于集合的交集运算
|
ZUNIONSTORE |
ZUNIONSTORE dest-key key-count key [key……] [WEIGHTS weight [weight……]} [AGGREGATE SUM|MIN|MAX] 对给定的有序集合执行类似于集合的并集运算
|
更多命令参考: http://redis.io/commands
本文部分内容参考《Redis 实战》Josiah L. Carlson