全局命令
keys pattern // 正则匹配key。常见 keys * 匹配全部key。keys h?ll*匹配hill和hello等 dbsize // key总数 exists key // key是否存在 del key [key...] // 删除key expire key seconds // key将在n秒后过期,可以通过ttl key观察剩余过期时间 expireat key timestamp // key将在时间戳后过期 pexpire key milliseconds // key将在n毫秒后过期 pexpireat key milliseconds-timestamp // key将在毫秒级时间戳后过期 type key // 5种数据类型:string,list,hash,set,zset(有序set) rename key newkey // 重命名key,如果新命名的key已经存在,将覆盖 renamenx key newkey // 重命名key,为防止覆盖,只允许新命名的key不存在时重命名 randomkey // 随机返回一个key
迁移key命令:move,dump + restore,migrate
move key db // 在Redis内部多个数据库间迁移。但生产环境不适合多数据库,这个命令知道一下即可
用 dump + restore 实现在不同Redis实例间进行数据迁移,分两步:
dump key // 在源Redis上序列化key,格式是RDB格式 restore key ttl value // 在目标Redis上复原key,ttl表示过期时间,如果ttl=0表示无过期时间
用 migrate 也能实现在不同Redis实例间进行数据迁移,本质上就是封装了dump + restore + del命令
migrate host port key|"" destination-db timeout [copy] [replace] [keys key [key…]] // host和port是目标Redis的IP和端口 // key|"":如果要迁移多个key,就设为"" // destination-db:目标Redis的数据库索引 // timeout:迁移的毫秒级超时时间 // [copy]:copy迁移后不删除源Redis里的key // [replace]:不论目标Redis是否存在该key都会覆盖 // [keys key [key…]]:迁移多个key时用
数据库管理:
select dbIndex // Redis默认配置有16个数据库,链接后默认就是0号数据库
但这个功能不太好,因为Redis是单线程,多个数据库用一个CPU,彼此间还是会受到影响。而且多个数据库用数字进行切会增加复杂度,因此如分布式实现Redis Cluster只允许用0号数据库。如果真的要用多数据库,完全可以在一台机器上部署多个Redis实例,彼此用端口做区分。现代计算机通常是有多个CPU的,这样既保证了业务间数据的独立和不受影响,又合理地使用了CPU。
flushdb // 清除当前数据库 flushall // 清除所有数据库
字符串命令
set key value [ex seconds] [px milliseconds] [nx|xx] // ex seconds:key的秒级过期时间 // px milliseconds:key的毫秒级过期时间 // nx:key必须不存在才能设置成功,用于添加 // xx:key必须存在才能设置成功,用于更新 setnx key value // 和nx一样 // 例如多个客户端同时执行setnx操作相同的键,只有一个客户端才能设置成功,是一种分布式锁的实现方案 setex key seconds value // 和xx一样 get key // 获取key mset key value [key value…] // 批量设置key-value mget key [key…] // 批量获取,除了简化命令外,批量操作其实可以节省网络请求 getset key value // 先get原来的值,再set新值 setrange key offset value // 设置指定位置的字符 getrange key start end // 获取指定范围的字符 incr key // 自增value,如果不是数字,返回错误 decr key // 自减value incrby key increment // 自增指定数字,例如视频每放一次,播放次数自增 decrby key decrement // 自减指定数字 incrbyfloat key increment // 自增浮点数 append key value // value的尾部追加值 strlen key // 字符串长度
哈希命令
hset key field value // 为key设置一对field-value get key field // 获取key的field的值 hdel key field [field…] // 删除key的field hlen key // 统计field的数量 hmset key field value [field value…] // 批量设置key的field-value hmget key field [field…] // 批量获取key的field值 hexists key field // 判断key里field是否存在 hkeys key // 获取key里所有的field(该命令可能叫hfields比较好…) hvals key // 获取key里所有value hgetall key // 获取key里所有field-value hincrby key field // 自增value hincrbyfloat key field // 自增浮点数 hstrlen key field // 计算value字符串的长度
列表命令
添加命令:
rpush key value [value…] // 从右边插入元素 lpush key value [value…] // 从左边插入元素 linsert key before|after pivot value // 找到等于pivot的元素,在其前|后插入元素
查找命令:
lrange key start end // 指定范围内查找 lindex key index // 根据index查找元素 llen key // 获取list长度
删除命令:
lpop key // 删除最左边元素 rpop key // 删除最右边元素 lrem key count value // 找到value元素后开始删除,count>0从左往右删,count<0从右往左删,count=0全删 ltrim key start end // 按照索引范围删除
修改命令:
lset key index newValue // 根据index修改元素
阻塞操作:
blpop key [key…] timeout // 是lpop的阻塞版本,移出并获取列表的第一个元素 // 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止 // 如果timeout设为0,会一直等待下去,直到有元素能弹出为止 brpop key [key…] timeout // 是rpop的阻塞版本,其他同上
用lpush + brpop可实现阻塞队列,生产者客户端用lpush加入元素,多个消费者客户端用brpop命令阻塞式“抢”列表尾部的元素。这样多个消费客户端可以保证了消费的负载均衡和高可用性。
集合命令
set和list不同,set中不允许有重复的元素。例如用set给用户添加关心的话题。
集合内操作:
sadd key element [element…] // 添加元素 srem key element [element…] // 删除元素 scard key // 计算元素个数 sismember key element // 判断元素是否在set中 srandmember key [count] // 随机从集合返回指定个数元素,count默认值为1 spop key // 随机弹出元素 smembers key // 获取全部元素
集合间操作:
sinter key [key…] // 求交集 sunion key [key…] // 求并集 sdiff key [key…] // 求差集 sinterstore destination key [key…] // 将交集的结果保存 sunionstore destination key [key…] // 将并集的结果保存 sdiffstore destination key [key…] // 将差集的结果保存
有序集合命令
有序集合是能排序的,为set中每个元素分配一个score,根据score来排序。有序集合为我们提供了获取指定分数和元素范围查询,计算成员排名等功能。可以用于排行榜系统等。
集合内操作:
zadd key [nx|xx] [ch] [incr] score element [score element…] // 添加元素 // nx:元素必须不存在才能设置成功,用于添加 // xx:元素必须存在才能设置成功,用于更新 // ch:返回操作后有序集合内元素和分数发生变化的个数 // incr:对score做增加,相当于zincrby zcard key // 计算元素个数 zscore key member // 获取元素分数 zrank key member // 获取元素排名(从低到高排) zrevrank key member // 获取元素排名(从高到低排) zrem key member [member…] // 删除元素 zincrby key increment member // 增加元素分数 zrange key start end [withscores] // 返回指定排名范围内的元素(从低到高排) zrevrange key start end [withscores] // 返回指定排名范围内的元素(从高到低排) zrangebyscore key min max [withscores] [limit offset count] // 返回指定分数范围内的元素 // limit offset count可以指定起始位置和个数 zrevrangebyscore key min max [withscores] [limit offset count] // 返回指定分数范围内的元素,参数同上 zcount key min max // 返回指定分数范围内的元素个数 zremrangebyrank key start end // 删除指定排名内的升序元素 zremrangebyscore key min max // 删除指定分数范围内的元素
集合间操作:
zinterstore destination numkeys key [key…] [weights weight [weight…]] [aggregate sum|min|max] // 交集结果保存起来。numkeys:需要做交集计算key的个数 // key [key…]:需要做交集计算的key // [weights weight [weight…]]:每个key的权重,计算时每个元素的score会乘以这个权重 // [aggregate sum|min|max]:计算完交集后做汇总,默认是sum zunionstore destination numkeys key [key…] [weights weight [weight…]] [aggregate sum|min|max] // 并集结果保存起来,参数同上