(5种数据结构)命令总结
一丶Keys
1) 查询key
- EXISTS key 判断key是否存在
- TYPE key 查询key对应的类型
- KEYS pattern 查询匹配表达式的key, 时间复杂度O(1), 在key多时,不建议使用
- SCAN cursor [MATCH pattern] [COUNT count]
- 使用游标查询key
- MATCH key表达式
- COUNT 命中多少个key后返回, 有时可能比指定个数多一点, 默认是10
2) 删除key
- DEL key [key ...] 删除key, 包括key对应的值
- UNLINK key [key ...] 异步删除key, 非阻塞
3) 修改key名字
- RENAME key newkey 如果newkey已经存在, 存在的将会被覆盖, 如果key不存在, 将会报错
- RENAMENX key newkey 只有当newkey不存在时,才会修改key
4)有效期
redis常用作缓存, 所以在使用redis存储数据时, 一般会设置有效期
- EXPIRE key seconds 设置key有效期为指定秒数, 在指定秒数后, 该key将会被自动删除
- EXPIREAT key timestamp 设置key在指定时间戳(单位秒)时失效
- PEXPIRE key milliseconds 设置key有效期为指定毫秒数
- PEXPIREAT key milliseconds 设置key在指定时间戳(单位毫秒)时失效
- PERSIST key 移除key的有效期设置, 即key永久有效
- TTL key 查询key的有效期(仍可存活的时间) 单位秒 -1表示未设置有效期, -2表示key不存在
- PTTL key 查询key的有效期(仍可存活的时间) 单位毫秒 -1表示未设置有效期, -2表示key不存在
5) 迁移key
- MIGRATE host port key|"" destination-db timeout[COPY] [REPLACE] [AUTH password][KEYS key [key ...]]
- MOVE key db
二丶Strings
本数据类型为字符串, 可以用于存储数字, 有数字运算操作, 如增加, 位运算.
1) 增加
- SET key value [EX seconds|PX milliseconds] [NX|XX]
- 设置添加一个字符串
- EX 设置过期时间,单位秒
- PX 设置过期时间,单位毫秒
- NX 只有当key不存在时才设置
- XX 只有当key存在时才设置
- SETNX key value 添加设置value, 只有当key不存在时才添加
- MSET key value [key value ...] 批量添加
- MSETNX key value [key value ...] 批量添加, 只有当key不存在时才添加
- SETEX key seconds value 添加,同时设置有效期(单位秒)
- PSETEX key milliseconds value 添加,同时设置有效期(单位毫秒)
- APPEND key value 追加字符串,如果key不存在,则设置(set key value)
2)查询
- GET key 查询value
- MGET key [key ...] 批量查询value
- GETRANGE key start end 查询value的子字符串
- STRLEN key 查询value长度
3)修改 (可以使用1中操作修改key对应的value)
- SETRANGE key offset value 替换value中的子字符串 offset 偏移, 起始是0
4) 数字运算
- INCR key 值加1
- INCRBY key increment 值加上指定整数
- INCRBYFLOAT key increment 值加上指定浮点数
- DECR key 值减1
- DECRBY key decrement 值减去指定整数
5) 位操作
- BITCOUNT key [start end] 统计bit位数
- BITFIELD key [GET type offset] [SET type offset value] [INCRBY type offset increment] [OVERFLOW WRAP|SAT|FAIL] 位运算
- BITOP operation destkey key [key ...] 与或非等操作之后,保存值到destkey
- BITPOS key bit [start] [end] 查询第一个指定bit(0|1)的位置
- SETBIT key offset value 设置指定位置(offset)上的bit值
- GETBIT key offset 查询指定位置(offset)上的bit值
三丶Lists
本数据类型是列表,左边是头部, 右边是尾部, 可以理解为双端队列,类似java中的Deque,如LinkedList.
1) 增加
- LPUSH key element [element ...] 从队列左边(头部)(批量)添加值
- LPUSHX key element 从队列左边(头部)添加值, 只有当值存在时才添加(并不会覆盖)
- RPUSH key element [element ...] 从队列右边(尾部)(批量)添加值
- RPUSHX key element 从队列右边(尾部)添加值, 只有当值存在时才添加(并不会覆盖)
- LINSERT key BEFORE|AFTER pivot element 在指定值"pivot" 前|后 插入值"element"
2) 查询
- LINDEX key index 通过下标获取队列中对应的元素 (下标起始是0, 从左边到右边递增)
- 从时间复杂度为O(N)可以推断底层实现应该是链表
- LRANGE key start stop 批量查询, 起始下标是0, -1表示列表最后一个元素, -2表示倒数第二个
- LLEN key 查询队列的长度
3) 修改
- LSET key index element 修改(替换)指定下标的元素
4) 删除
- LREM key count element 删除count个值为element的元素
- LTRIM key start stop 保留[start, stop]下标范围元素的队列, 裁剪去其他 (批量删)
- LPOP key 删除第一个元素(左边头部), 并返回该元素
- RPOP key 删除最后一个元素(右边尾部), 并返回该元素
- BLPOP key timeout 删除第一个元素(左边头部), 并返回该元素, 如果队列为空, 则阻塞等待timeout秒
- BRPOP key timeout 删除最后一个元素(右边尾部), 并返回该元素, 如果队列为空, 则阻塞等待timeout秒
5) 其他
- RPOPLPUSH source destination 将source队列的最后一个元素移除, 并添加到destination队列的头部
- BRPOPLPUSH source destination timeout 将source队列的最后一个元素移除, 并添加到destination队列的头部, 如果source队列为空, 则阻塞等待timeout秒
四丶Sets
本数据类型是(不重复)集合, 与列表不一样的地方在于, 它没有顺序, 且值不重复, 可以类比java中的Set.
1) 增加
- SADD key member [member ...] (单个或批量增)
2) 查询
- SMEMBERS key 获取set中的所有成员
- SRANDMEMBER key [count] 随机获取set中的一个或者多个成员
- SSCAN key cursor [MATCH pattern] [COUNT count] 使用游标迭代遍历集合中的元素
- SCARD key 查询集合中的成员个数
- SISMEMBER key member 判断member是不是在集合中
3) 删除
- SREM key member [member ...] 删除指定成员
- SPOP key [count] 随机删除并返回一个或多个成员
4) 集合与集合之间的运算
- 交集
- SINTER key [key ...]
- SINTERSTORE destination key [key ...] 求出交集, 并保存到目的集合中
- 并集
- SUNION key [key ...]
- SUNIONSTORE destination key [key ...] 求出并集, 并保存到目的集合中
- 差集
- SDIFF key [key ...]
- SDIFFSTORE destination key [key ...] 求出差集, 并保存到目的集合中
- 其他
- SMOVE source destination member 从一个集合移除指定成员,并放到指定集合中
本数据类型为有序集合,根据数据对(score, member)中的score排序存储, member不重复, 可以类比java中的SortedSet, (用的比较少)
1) 增加或修改
- ZADD key [XX|NX] [CH] [INCR] score member [score member ...]
- XX 只更新已存在成员的分数, 不添加成员
- NX 只添加新成员, 不更新已存在成员
- CH 添加新成员, 如果成员已经存在,则更新分数, 并返回改变的成员数量(包括添加的和修改分数的)
- INCR 和命令ZINCRBY类似, 用于"增加"修改分数
2) 查询
2.1) 查询成员
- ZRANGE start stop [WITHSCORES]
- 排序集合, 根据分数从低到高排序, zrange命令指定下标范围返回对应的值
- WITHSCORES 返回时,带上分数
- ZREVRANGE start stop [WITHSCORES]
- 排序集合, 根据分数从高到低排序, zrevrange命令指定下表范围返回对应的值
- WITHSCORES 返回时,带上分数
- ZRANGEBYLEX key min max [LIMIT offset count]
- 分数相同是前提, 分数相同的成员字典排序(如abcd)
- 对分数相同的成员进行范围查询
- 默认情况下, “max” 和 “min” 参数前必须加 “[” 符号作为开头。”[” 符号与成员之间不能有空格, 返回成员结果集会包含参数 “min” 和 “max” 。
- “max” 和 “min” 参数前可以加 “(“ 符号作为开头表示小于, “(“ 符号与成员之间不能有空格。返回成员结果集不会包含 “max” 和 “min” 成员。
- 可以使用 “-“ 和 “+” 表示得分最小值和最大值
- LIMIT 分页查询
- ZREVRANGEBYLEX key min max [LIMIT offset count]
- 与上面命令类似, 只是排序相反
- ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count]
- 根据分数范围查询成员, (默认是分数从低到高排序)
- min, max 如 1 5, 查询结果将会包含最大最小值, 如果想排除, 数字前面可以加(
- -inf +inf 可以表示最小最大值
- WITHSCORES 返回时,带上分数
- LIMIT 分页查询
- ZREVRANGEBYSCORE key max min [WITHSCORES] [LIMIT offset count]
- 与上面命令类似, 只是排序相反
- ZSCAN key cursor [MATCH pattern] [COUNT count]
- 使用游标查询, 可以参考SCAN
- MATCH 匹配表达式
- COUNT 限制命令个数(一般接近,可能会多) 默认是10
2.2) 查询排名和分数
- ZRANK key member 查询指定成员对应的排名(下标, 起始是0, 分数从低到高)
- ZREVRANK key member 与上面命令类似, 只是排序相反
- ZSCORE key member 查询指定成员的分数
2.3) 统计
- ZCARD key 统计集合中成员的个数
- ZCOUNT key min max 统计分数范围内的成员个数, min, max 可以参考ZRANGEBYSCORE
- ZLEXCOUNT key min max 当所有分数都相同时使用, 这种情况下, 会根据member字典排序, 统计member在min,max范围的个数, min,max可以参考ZRANGEBYLEX
3) 删除
- ZPOPMIN key [count] 删除一个或多个最小分数的值, 并返回对应的成员和分数
- ZPOPMAX key [count] 删除一个或多个最大分数的值, 并返回对应的成员和分数
- BZPOPMIN key [key ...] timeout 删除一个或多个最小分数的值, 并返回对应的成员和分数, 如果没有,则阻塞等待指定秒数
- BZPOPMAX key [key ...] timeout 删除一个或多个最大分数的值, 并返回对应的成员和分数, 如果没有,则阻塞等待指定秒数
- ZREM key member [member ...] 删除指定成员
- ZREMRANGEBYLEX key min max 当所有分数都相同时使用, 这种情况下, 会根据member字典排序, 删除在min,max范围的member, min,max可以参考ZRANGEBYLEX
- ZREMRANGEBYRANK key min max 删除排名(下标)范围内的成员, min, max 起始下标是0, -1表示列表最后一个元素, -2表示倒数第二个
- ZREMRANGEBYSCORE key min max 删除分数范围内的成员, min, max 可以参考ZRANGEBYSCORE
4) 集合之间的运算
- ZINTERSTORE destination key [key ...] 求交集并存储到destination
- ZUNIONSTORE destination key [key ...] 求并集并存储到destination
5) 分数运算
- ZINCRBY key increment member 给指定成员增加指定分数
六丶Hashes
本数据类型为哈希, 可以类比java中的HashMap
1) 增加或修改
- HSET key field value 在key添加哈希键值对, field value, 类似java中, HashMap.put(field, value)
- HMSET key field value [field value ...] 批量加
- HSETNX key field value 只有当field不存在时才添加
2) 查询
- HGET key field
- HMGET key field [field ...] 批量查
- HGETALL key 查询所有
- HSCAN key cursor [MATCH pattern] [COUNT count] 使用游标查询
- HKEYS key 查询所有field
- HVALS key 查询所有values
- HEXISTS key field 判断field是否存在
- HLEN key 查询键值对的个数
- HSTRLEN key field 查询field对应value的字符长度
3) 删除
- HDEL key field [field ...] 删除一个或多个field
4) 运算
- HINCRBY key field increment 值为整数时, 增加指定值
- HINCRBYFLOAT key field increment 值为浮点数时, 增加指定值
七丶后记
虽说后台总被嘲讽CRUD, 但"增删查改"确实是学习数据相关的技术的菩提总纲, 精辟
学习资料: