简言之:
redis 是一个开源的,高性能的,基于键值对的缓存存储系统。通过提供多种键值数据类型来适应不同的场景下的缓存存储需求。同时redis的诸多高级功能使其可以胜任消息队列,任务队列等不同的角色。
数据类型和基本命令
字符串类型(String)
是redis最基本的类型,能存任何形式的字符串,包括二进制数据。一个string类型的key允许存储的最大容量是512MB,但劝你别这么干(存很大的数据),毕竟redis会把数据都加载到内存。
在这个键foo存一个bar值,或者更新foo里面的存的值为bar:
SET foo bar
获取这个foo里面的值, 你将得到字符串bar:
GET foo
当键值里面存的是数字,可以使用命令递增数字:
INCR foo
它返回的是递增以后的值。如果里面存的不是数字,会报错。
String类型应用场景示例:
- 访问量统计
- 生成自增id
- 存储其他你想存的字符串
其他命令:
增加指定的整数(返回增加后的值)
INCRBY key increment
减少指定的整数 && 减1(返回减少后的值)
DECRBY key decrement
DECR key
DECRBY key 5 和 INCRBY key -5的效果是一样的。
增加指定的浮点数(返回增加后的值)
INCRBYFLOAT key increment\
在键值尾部追加字符串(返回追加后的总长度)
APPEND key value
获取键值字符串长度
STRLEN key
同时设置 || 获得多个键值
MSET key1 value1 key2 value2
MGET key1 key2
散列类型(Hash)
如果我们存的数据有多个部分组成,比如标题,作者,正文。这时候用散列比较合适了。散列类型的键值是一种字典结构,其存储了字段和字段值的映射。一个散列类型键最多可以包含2^32-1个字段。技术上并不要求每个key存的字段都是一致的,如:key0里面存的字段是title,author; key1里面存的字段是content,title。
赋值&&取值
HSET key field1 value1
HGET key field1
同时设置 && 获取多个字段的值 && 获取所有字段和它们的值
HMSET key field1 value1 field2 value2
HMGET key field1 field2
HGETALL key
字段是否存在(不存在返回0,否则1):
HEXISTS key field
字段不存在时赋值(返回值与HEXISTS相反):
HSETNX key field value
增加数字(返回增加后的值):
HINCRBY key field increment
删除字段(返回被删的字段个数):
HDEL key field1 field2 ...
Hash应用场景示例
- 存储文章数据,或者别的多组成数据
其他命令:
只获取字段名 || 字段值
HKEYS key
HVALS key
获得字段数量
HLEN key
列表类型(List)
列表类型可以存储有序的字符串列表,常见的操作是向列表两端添加元素,或者获取列表的某个片段。它是由双向链表实现的,所以向两端添加元素的时间复杂度是O(1),获取越近两端的元素速度越快。这种特性使它能快速完成下面场景:如社交网站的新鲜事,我们只关心最新的内容,即使里面的数据几千万个,我们要找最新的100条也是很快的。一个列表类型的键最多能容纳2^32-1个元素。命令:
- 向列表两端增加元素:(返回增加后列表的长度)
LPUSH key value1 value2
RPUSH key value1 value2
- 从两端弹出元素:(返回弹出的元素)
LPOP key
RPOP key
- 获取列表中的元素的个数:(当key不存在返回0)
LLEN key
- 获得列表中的片段:(start,stop的全闭区间)
LRANGE key start stop
LRANGE支持负索引,-1表示最右边的元素,以此类推。
- 删除列表中指定的值:(返回删除元素的个数)
LREM key count value
将会删除列表中前count个值为value的元素。
- 当count>0,将会删除列表中从左边开始,前count个值为value的元素
- 当count<0,将会删除列表中从右边开始,前abs(count)个值为value的元素
- 当count==0,将会删除列表中所有的,值为value的元素
List使用场景示例
- 文章id列表
- 评论列表
- 各种列表...
其他命令
- 获取 || 设置指定索引的元素值
LINDEX key index
LSET key index value
- 只保留列表的指定片段
LTRIM key start stop
- 向列表中插入元素
LINSERT key BEFORE|AFTER value1 value2
在列表中从左到右查找值为value1的元素,然后根据第二个参数before还是after来确定value2插在前面还是后面。
- 将元素从一个列表转到另一个列表
RPOPLPUSH source destination
从名字就可以看出它的功能:先从source列表类型键的右边弹出一个元素,然后将其加入到destination列表类型键的左边,并返回这个元素的值,整个过程是原子的。
集合类型(Set)
行为很像高中数学课教过的集合。它每个元素是不同的,且没有顺序,一个集合类型的键最多可以存2^32-1个字符串。redis集合内部是使用值为空的散列表实现的,所以向集合中加入元素,删除元素,判断元素是否存在,这些操作的时间复杂度都是O(1)。最方便的是多个集合之间可以取交集,并集,差集。
命令:
- 增加 && 删除元素(返回增加了多少个,删除了多少个)
SADD key value1 value2 ...
SREM key value1 value2 ...
- 获得集合中的所有元素
SMEMBERS key
- 判断元素是否在集合中(存在返回1,否则0)
SISMEMBER key value
- 取多个集合的差集
SDIFF key0 key1 key2 ...
这个例子的意思是:先求key0有而key1没有的元素集合keyTmp,然后再求keyTmp有而key2没有的元素集合。
- 取集合间的交集
SINTER key0 key1 key2 ...
求在三个几个都存在的元素集合。
- 取集合间的并集
SUNION key0 key1 key2 ...
Set使用场景示例
- 存储文章标签: 比如,使用键名为post:id:tags的键存储该篇文章的标签。但并没有使用到集合的优势,这儿也可以使用简单的字符串来存储标签。
- 通过标签搜索文章: 比如,使用键名为tag:标签名:postIds的集合类型的键存储文章id。 当我们需要找标签同时满足‘MySQL’和‘Java’, 那我们就可以用交集命令,飞快选出文章的id了。
其他命令
- 获得集合中元素的个数
SCARD key
- 进行集合运算并将结果存储
SDIFFSTORE destination key0 key1 key2 ...
将key0 key1 key2的差集存到destination键中。
SINTERSTORE destination key0 key1 key2 ...
将key0 key1 key2的交集存到destination键中。
SUNIONSTORE destination key0 key1 key2 ...
将key0 key1 key2的并集存到destination键中。
- 随机获得集合中的元素
SRANDMEMBER key [count]
- 当count>0, 随机从集合中获得count个不同元素
- 当count<0, 随机从集合中获得abs(count)个可能有重复的元素
- 从集合中随机弹出一个元素
SPOP key
有序集合类型(ZSet)
与Set的区别就是‘有序’二字。 在集合的基础上,有序集合为每个元素都关联了一个分数,这使得我们不仅可以完成插入删除,判断元素是否存在等操作,还可以获得分数最高(或最低)的前N个元素,获得指定分数范围内的元素等。元素是不同的,但是它们分数可以相同。
命令:
- 增加元素(返回增加的元素个数)
ZADD key score1 value1 score2 value2 ...
如果元素已经存在则会替换元素的分数。分数是整数或者浮点数。
- 获得元素的分数
ZSCORE key value
- 获得排名在某个范围的元素列表(全闭区间)
ZRANGE key start stop [WITHSCORES]
ZREVRANGE key start stop [WITHSCORES]
ZRANGE 命令会按照元素从小到大的顺序返回索引从start到stop之间的元素,加上WITHSCORES会返回分数。ZREVRANGE则是从大到小的顺序。
- 获得指定分数范围的元素列表(全闭区间)
ZRANGEBYSCORE key min max [WITHSCORES] [limit offset count]
ZREVRANGEBYSCORE key min max [WITHSCORES] [limit offset count]
按照分数从小到大的顺序,返回分数在min到max之间的元素。如果希望分数范围不包含端点值,可以这样:
ZRANGEBYSCORE key 80 (100
limit,offset的用法与SQL相同。即,在获得的元素基础上向后偏移offset个元素,并且只获取前count个。比如:
ZRANGEBYSCORE key 80 100 limit 1 3
ZREVRANGEBYSCORE则是从大到小的顺序。
- 增加某个元素的分数(返回更改后的分数)
ZINCRBY key increment value
ZSet使用场景示例
- 各种排行榜
其他命令
- 获得集合中元素的个数
ZCARD key
- 获得指定分数范围内的元素个数(全闭区间)
ZCOUNT key min max
要用开区间就用'('
- 删除一个或者多个元素(返回删除成功的数量)
ZREM key value1 value2 ...
- 按照排名范围删除元素(全闭区间,返回删除成功的数量)
ZREMRANGEBYRANK key start stop
按照从小到大的顺序,删除排名在start stop之间的元素,索引从0开始。
- 按照分数范围删除元素(全闭区间,返回删除成功的数量)
ZREMRANGEBYSCORE key min max
要开区间,则用'(',比如
ZREMRANGEBYSCORE key 80 (100
- 获得元素的排名
ZRANK key value
ZREVRANK key value
ZRANK从小到大,ZREVRANK从大到小,排名从0开始。