1. Redis数据结构
Redis可以存储键与5种不同数据结构类型之间的映射,分别为string(字符串)、list(列表)、set(集合)、hash(散列)和zset(有序集合)。日常使用的基本上就是如上的五种常见数据结构。此外,Redis还支持bitmaps(位图), hyperloglogs(超级日志), geospatial indexes with radius queries and streams(具有半径查询和流的地理空间索引)。
下面引用《Redis实战》的表格,介绍五种常见的数据结构
结构类型 结构存储的值 结构的读写能力 STRING 可以是字符串、整数或浮点数 对整个字符串或者字符串的其中一部分执行操作;对整数和浮点数执行自增(increment)或者自减(decrement) LIST 一个链表,链表上的每个节点都包含一个字符串 从链表的两端推入或者弹出元素;根据偏移量对链表进行修剪(trim);读取单个或者多个元素;根据值查找或者移除元素。 SET 包含字符串的无序收集器(unordered collection),并且被包含的每个字符串都是独一无二、各不相同的 添加、获取、移除单个元素;检查一个元素是否存在于集合中;计算交集、并集、差集;从集合里面随机获取元素。 HASH 包含键值对的无序散列表 添加、获取、移除单个键值对;获取所有键值对。 ZSET(有序集合) 字符串成员(member)与浮点数分值(score)之间的有序映射,元素的排列顺序由分值的大小决定 添加、获取、删除单个元素;根据分值范围(range)或者成员来或许元素。
-
string:字符串类型是非常常见的一种类型,Redis中的字符串类型和很多编程语言里的字符串类型差不多,但相对要灵活些。字符串可以存储以下三种类型:
- 字符串(字节组成的序列)
- 整数
- 浮点数
当字符串中的值可以被解释成十进制数或者浮点数的时候,Redis就会发现这一点,并允许用户对这个字符串进行各种增(incr*)、减(decr*)操作。如果对一个不存在的键或者保存了空串的键进行增减操作,则Redis会将其值当做0来处理。如果值无法被解释为整数或浮点数,Redis将向用户返回一个错误。
list:列表可以看作是个双端队列,可以在列表两端推入和弹出元素。对列表的不同操作可以实现其他编程语言中的堆栈(同一端进出)和队列(一端进,另一端出)数据结构。
set:集合最显著的特点应该就是其中的元素互不相同。用户可以快速对集合进行插入,删除,检查某元素是否在集合中的操作。此外,多个集合间也能很方便的执行交、并、差集运算。
zset:有序集合存储着成员与分值(权值,在Redis中以IEEE 754双精度浮点数的格式存储)之间的映射,并且提供了分值处理命令。适用于按照权值获取元素的情况。如热门帖子获取、基于投票数排序文章等。
hash:Redis中的散列可以让用户将多个键值对存储到一个Redis键中,可以把这种数据聚集看作是关系数据库中的行,或者文档数据库中的文档。
2. Redis常用命令
2.1 key的有关命令
命令 | 操作 |
---|---|
exists key | 测试指定key是否存在 |
del key1 [key2 ...] | 删除给定key |
type key | 返回给定key的类型 |
keys pattern | 以正则表达式的形式,返回匹配的所有key |
rename oldkey newkey | 修改key的名字 |
dbsize | 查看数据库中key的数量(并不是所谓的大小) |
expire key seconds | 为key指定过期时间,到期自动删除 |
ttl key | 查看key的剩余时间 |
select index | 选择数据库(默认16个数据库,index为0-15) |
move key index | 将key移动到指定数据库 |
flushdb | 清空当前数据库key |
flushall | 清空所有数据库key |
2.2 string的有关命令
命令 | 操作 |
---|---|
set key value | 设置key对应的值为string类型的value |
mset key1 value1 [key2 value2...] | 一次设置多个key |
get key | 获取指定key的value值 |
mget key1 [key2 ...] | 一次获取多个key的value值 |
incr key | 对key的值做自增操作,返回新的值 |
decr key | 对key的值做自减操作,返回新的值 |
incrby key integer | 对key的value加指定integer |
decrby key integer | 对key的value减指定integer |
append key value | 给指定key的字符串追加value |
substr key start end | 截取key,从start(包含)到end(包含)。注意只是返回截取的value,源value并没改变 |
2.3 list的有关命令
命令 | 操作 |
---|---|
lpush key value1 [value2...] | 在key对应的list的头部(左端)添加元素 |
rpush key value1 [value2...] | 在key对应的list的尾部(右端)添加元素 |
lpop key | 移除并返回key对应的list的头部(左端)元素 |
rpop key | 移除并返回key对应的list的尾部(右端)元素 |
lindex key offset | 返回列表中偏移量为offset的元素 |
lrange key start end | 返回列表中从start偏移量到end偏移量中的元素,包含两个端点元素(只返回,原list不变) |
ltrim key start end | 对列表进行修剪,只保留从start偏移量到end偏移量的元素,包含两个端点 |
llen key | 返回对应列表的长度 |
此外,list还包含一些阻塞式的命令以及在列表之间移动元素的命令:
命令 | 操作 |
---|---|
blpop key1 [key2...] timeout | 从第一个非空列表中弹出位于头部(左端)的元素,或者在timeout秒内阻塞并等待可弹出元素的出现 |
brpop key1 [key2...] timeout | 从第一个非空列表中弹出位于尾部(右端)的元素,或者在timeout秒内阻塞并等待可弹出元素的出现 |
rpoplpush source-key dest-key | 从source-key列表中弹出位于最右端的元素,然后把这个元素插入dest-key列表的最左端,并向用户返回该元素 |
brpoplpush source-key dest-key timeout | 从source-key列表中弹出位于最右端的元素,然后把这个元素插入dest-key列表的最左端,并向用户返回该元素。如果source-key为空,则在timeout秒内阻塞并等待可弹出元素的出现 |
2.4 set的有关命令
命令 | 操作 |
---|---|
sadd key value1 [value2...] | 将一个或多个元素添加到集合中,并返回添加成功的元素的个数 |
srem key value1 [value2...] | 从集合中移除一个或多个元素,返回移除成功的元素的个数 |
sismember key value | 检查元素value是否在集合key中,存在返回1,不存在返回0 |
scard key | 返回集合包含的元素个数 |
smembers key | 返回集合包含的全部元素 |
srandmember key [count] | 随机返回集合中的一个或多个元素。当count为正数时,返回的元素不会重复;当count为负数时,返回的元素有可能会重复 |
spop key | 随机移除集合中的某个元素,被返回给用户 |
smove source-key des-key value | 如果集合source-key中包含元素value,则移除它,并添加到dest-key中;成功移除并添加则返回1,否则返回0 |
处理多个集合的常用命令:
命令 | 操作 |
---|---|
sdiff key1 [key2...] | 返回所有集合的差集 |
sdiffstore dest-key key1 [key2...] | 将计算所得的差集中的元素添加到dest-key中 |
sinter key1 [key2...] | 返回所有集合的交集 |
sinterstore dest-key key1 [key2...] | 将计算所得的交集中的元素添加到dest-key中 |
sunion key1 [key2...] | 返回所有集合的并集 |
sunionstore dest-key key1 [key2...] | 将计算所得的并集中的元素添加到dest-key中 |
2.5 zset的有关命令
命令 | 操作 |
---|---|
zadd key score1 member1 [score2 member2 ... ] | 将带有给定分值的成员你添加到有序集合中。注意分值在前,成员在后 |
zrem key member1 [member2 ... ] | 从有序集合中删除指定成员,并返回成功删除的元素个数 |
zcard key | 返回有序集合包含的成员个数 |
zincrby key increment member | 给指定成员的分值加上increment |
zcount key min max | 返回分值介于min和max之间的成员数量 |
zrank key memeber | 返回指定成员在有序集合中的排名,成员按照score从小到大排序 |
zrevrank key memeber | 返回指定成员在有序集合中的排名 ,成员按照score从大到小排序 |
zscore key member | 返回指定成员的分值 |
zrange key start stop [WITHSCORES] | 返回有序集合中排名介于start和stop之间的成员,如果给定了可选的 WITHSCORES选项,则连带成员分值一并返回 |
zrevrange key start stop [WITHSCORES] | 同上,结果按score逆序 |
zrangebyscore key min max [WITHSCORES] | 返回分值介于min和max之间的成员 |
zremrangebyrank key start stop | 删除集合中排名在start和stop之间的成员 |
zremrangebyscore key min max | 删除集合中分值在min和max之间的成员 |
2.6 hash的有关命令
命令 | 操作 |
---|---|
hset key field value | 向散列key中添加一个键值对 |
hget key field | 获取散列key中的一个键的值 |
hmset key field1 value1 [field2 value2 ...] | 向散列key中添加一个或多个键值对 |
hmget key field1 [field2 ... ] | 获取散列key中的一个或多个键的值 |
hdel key field1 [field2 ... ] | 删除散列中的一个或多个键值对,返回成功删除的键值对数量 |
hlen key | 返回散列包含的键值对数量 |
hincrby key field integer | 给散列中指定field的值加上integer |
hexists key field | 测试指定field是否在散列中存在 |
hkeys key | 返回散列中所有field |
hvals key | 返回散列中所有value |
hgetall key | 返回散列中所有键值对 |
2.7 其他命令
Redis还有许多其他的命令,如发布订阅相关的命令,排序命令,更完整的命令介绍可以查看Redis官网文档或中文版地址。
此外,Redis客户端还提供了 command
命令,可以用来查看命令数组。如:
特别推荐:Redis客户端还提供了 help
命令,可以查看数据结构的描述( help set
),查看某个命令的具体用法( help zadd
),以及通过 help @group
语法来查看某个命令组( help @set
查看set所有命令)。如:
此外,Redis客户端还提供了命令智能提示,可以提示用户该命令的具体格式,如,当键入 zadd
时,客户端的智能提示如下:
单纯的记忆命令是没有意义的,应该着重去学习Redis数据结构的概念和含义,具体应用的时候配合使用 help
命令以及官方文档即可。而且Redis的命令基本都是自解释的,基本从字面上就能够了解到该命令的作用。习惯了之后甚至可以自己去猜测需要的命令。
======返回目录======