背景介绍

以下摘自:Redis官网.

Redis is an open source (BSD licensed), in-memory data structure store, used as a database, cache and message broker. It supports data structures such as strings, hashes, lists, sets, sorted sets with range queries, bitmaps, hyperloglogs, geospatial indexes with radius queries and streams. Redis has built-in replication, Lua scripting, LRU eviction, transactions and different levels of on-disk persistence, and provides high availability via Redis Sentinel and automatic partitioning with Redis Cluster.

总的来说,Redis是一个基于内存的高性能的键值型数据库,也就是常说的NoSQL,可以用来作为数据库或者缓存.并且支持多种数据结构,包括字符串,散列,列表,集合,带有范围查询的排序集,位图,HyperLogLog,具有半径查询的地理空间索引和流.

各种语言都提供了Redis的客户端,比如Java的Jedis和python的redis-py.

同时Redis也提供交互式的客户端,在mac上执行:

brew install redis进行安装,安装完成后执行:

redis-cli 进入交互式的客户端,即可开始使用.

本文主要用来记录针对各种数据结构的操作命令,来源主要是Redis官网加上自己的理解. 由于英语问题,不保证理解一定正确. 大家可以参考redis官网来进行学习.

public

  • help: 这个命令很重要,只要你用的好,可以查看所有命令的用法,可以起到一个临时提示的作用,比如这个命令有哪些选项等等. 使用方法: help之后根据提示输入:help command,即可以查看该命令的详细方法签名.输入help @group可以查看该group相关的命令,比如list,set.
  • keys: 使用模式匹配,返回匹配的key,使用*进行查看全量的key. 注意:不要在线上使用这个命令,不可控. keys **
  • exists: 查看某个key是否存在,存在返回1,不存在返回0.exists key.
  • scan: 遍历所有的key,因为做了分页,所以是安全的. sacn cursor match * count 100. *可以进行模式匹配. cursor初次使用为0,之后每一次为上一次scan返回的游标.
  • type:查看某个key的类型,返回描述.type key.
  • del: 删除key,可以删除多个. del key1 key2
  • expire: 设置过期时间, expire key seconds.
  • ttl: 查看key的剩余生存时间, ttl key
  • pttl: 以毫秒形式查看key的过期时间, pttl key
  • move: 将当前数据库中的某个key移到新的数据库. move key db
  • dump: 拿到序列化后的value. dump key.
  • resotre: 用上一个命令拿到的值回复某个key.resotre key seconds 序列化的value
  • object: 查看指定key值的内部结构.
  • MONITOR: 可以监控redis服务器,看他处理的每个请求.可以在redis客户端中执行monitor,也可以直接在shell种执行:redis-cli monitor.

DB

这块其实也是public的一部分,我单独将其写出来一下.

  • select: 选择数据库,默认为16个数据库可以选择.select index
  • flushdb: 删除当前db的所有key. flushdb.
  • swapdb: 交换两个数据库.swapdb index1 index2.
  • randomkey: 在当前库里随机返回一个key. randomkey.
  • monitor: 监视器,可以监视某个redis接受的所有命令.redis-cli monitor. 直接在命令行中执行.

string

  • set: 设置某个key的value.set key value
  • get: 获取某个key的value. get key
  • strlen: 返回字符串的长度.strlen key
  • append: 如果key存在并且为字符串,则追加值,如果key不存在,则创建并追加,此时相当于set. 成功后返回追加后字符串的长度.append key value
  • getrange: 根据输入的偏移来返回子字符串.支持-1偏移,代表最后一个字符. getrange key start end
  • setrange: 在key的指定偏移量处写入新的值.setrange key offset value
  • incr: 操作整数.当你的key中存储的是整数的时候,会将整数加1.需要注意的是,key为空的时候会被置为0然后加1.key的值为不能解释为数字的字符串时会报错.incr key
  • decr: incr的反操作,递减1.decr key
  • incrby: 递增某个增量.其他同incr一样. incrby key one_int_value.
  • decrby: incrby 的反操作.递减某个量.decrby key one_int_value
  • mget: 一次性获取多个key.注意如果key不存在会返回nil,所以这条命令永远不会出错. mget key1 key2 ...
  • mset: 一次性写入多个key-value. 不会失败,并且是原子操作.也就是说所有值必然会更新. mset key1 value1 key2 value2
  • msetnx: 批量的非空写入,注意是原子操作,所以当某一个key存在,所以key都不会被写入. msetnx key1 value1 key2 value2
  • setex: 设置key=value且过期时间为seconds.原子操作,相当于set + expire. 语法set key seconds value
  • setnx: 是set if not exists,当key不存在时写入,存在时不做任何操作.setnx key value
  • getset: 设置新值并返回旧值.getset key new_value
  • psetex : 和setex相似,区别只是设置的过期时间单位为毫秒.psetex key ms value

list

  • LPUSH: 向队头放入一个元素.LPUSH key v1 v2 v3.
  • RPUSH: 向队尾放入一个元素.RPUSH key v1 v2 v3.
  • LPOP: 从队头弹出一个元素.LPOP key.
  • RPOP: 从队尾弹出一个元素.RPOP key.
  • LLEN: 获取队列的长度.LLEN key.
  • LINDEX: 获取指定index的值.LINDEX key 0.0,1,2是队头的index,-1,-2,-3是队尾的index.
  • LINSERT: 在队列中某个值的前/后插入一个新元素.LINSERT key before|after pivot value.O(n)的时间复杂度.
  • LRANGE: 返回范围内的元素,支持-1从尾部计算.LRANGE key 0 -1可以返回全部值.注意,时间复杂度是O(N+S).
  • LREM: 删除指定数量个value.LREM key count value.count大于零时从头到尾数,count<0时从后向前数,count=0删除所有指定的value.
  • LSET: 设置指定index上的值.LSET key index value.时间复杂度为O(n).
  • LTRIM: 修剪list,仅保留指定范围内的值.LTRIM key start end.事件负责度O(n).
  • LPUSHX: 在队头插入一个元素,当key不存在时,不做操作.LPUSHX key v.
  • RPUSHX: 在队尾插入一个元素,当key不存在时,不做操作.RPUSHX key v.
  • BLPOP: 从队列头部,阻塞式的弹出一个元素,支持多个键,支持超时和永不超时.BLPOP key1 key2 3.
  • BRPOP: 从队列尾部,阻塞式的弹出一个元素,支持多个键,支持超时和永不超时.BLPOP key1 key2 3.
  • RPOPLPUSH: 将一个队列的最后一个元素弹出并且放到另一个队列的头部.RPOPLPUSH source-list destination-list.
  • BRPOPLPUSH: 阻塞版本的上一个命令.

sets

  • SADD: 向集合中添加一个或者多个元素.SADD key v1 v2 v3.
  • SCARD: 返回集合的元素数量.SCARD key.
  • SPOP: 随机从集合中弹出一定数量的元素.SPOP key count.
  • SMOVE: 将某个元素从一个集合移到另一个集合.SMOVE source target member.
  • SMEMBERS: 返回该集合的所有成员.SMEMBERS key.
  • SISMEMBER:给定元素是否是集合中的一员,返回1或者0.SISMEMBER key v.
  • SRANDMEMBER: 随机获取指定数量个成员.SRANDMEMBER count,O(1)或者O(n).看count咯.
  • SREM: 从给定集合中删除指定的多个元素.SREM key v1 v2 v3.
  • SSCAN: 扫描集合.以较小的代价查找一些元素.sscan key 0 match o* count 10.将返回set中以o开头的10个元素,可以继续使用游标来扫描.
  • SDIFF: 返回第一个集合和其他集合不同的元素.SDIFF key1 key2 key3. 例如: key1 = {a,b,c,d} key2 = {c} key3 = {a,c,e} SDIFF key1 key2 key3 = {b,d} O(n)的时间复杂度,n是所有set的集合总数.
  • SDIFFSTORE: 和上一个命令差不多,只不过会把结果存在第一个set中,覆盖存储.SDIFFSTORE key1 key2 key3.O(n)的时间复杂度.
  • SINTER: 求多个集合的交集,SINTER key1 key2 key3.时间复杂度是O(m * n).m是key1的元素数量,n是后面所有集合的最小元素数量.
  • SINTERSTORE: 上一个命令的存储版本,将结果覆盖到第一个set中.
  • SUNION: 求并集.SUNION key key1 key2.
  • SUNIONSTORE: 上一个命令的存储版本,将结果存储在key中.

sorted sets

  • ZADD: 向有序集中添加元素.支持多个(分数-值),且支持额外的指令.ZADD [NX | XX] [CH] [INCR] score1 value1 score2 value2.指令也可以没有,有的话规定一些重复之类的规则.时间复杂度:对每一个(分数-值)来说都是为O(log(n))
  • ZREM: 从集合中移除一个或者多个元素.ZREM key v1 v2.O(m*log(n))
  • ZSCORE: 获取元素的分值.ZSCORE key v.O(1).
  • ZRANK: 返回该值在集合中的排名,从低到高排序的名次.ZRANK key value.O(log(n)).
  • ZREVRANK: 返回该值在集合中的排名,从高到低排序的名次.ZREVRANK key value.O(log(n)).
  • ZPOPMAX: 弹出分数最高的x个值.ZPOPMAX key count.O(log(N)*M).
  • ZPOPMIN: 弹出分数最低的x个值.ZPOPMIN key count.O(log(N)*M).
  • BZPOPMAX:从有续集中弹出分数最大的值.阻塞版本.BZPOPMAX key key2 key3 time.time为阻塞时间,同样0代表永不超时.O(n).
  • BZPOPMIN:和上面命令一样,只不过弹出的是分数最小的值.O(n).
  • ZCARD: 返回有续集的元素个数.ZCARD key.O(1)的时间复杂度.
  • ZCOUNT: 返回在给定分值区间内的元素数量.ZCOUNT key min max.O(log(n)).
  • ZRANGE: 返回给定分数范围内的值.ZRANGE key start end WITHSOCRES.
    • WITHSCORES: 返回值是否带有分值.
    • 分值相同时使用字典排序.
    • O(log(N)+M)
  • ZRANGEBYLEX: 根据值的起始和截止返回范围内的值.ZRANGEBYLEX key min max [LIMIT offset count],字典序版本的上一个命令.
  • ZRANGEBYSCORE: 根据分值的起始和截止返回范围内的值.ZRANGEBYSCORE key min max [LIMIT offset count],
  • 这里是三个上面三个的反序命令,分值或者字母序列的从高到低.懒得写.
  • ZLEXCCOUNT: 根据值进行字典排序版本的上一个命令.ZLEXCCOUNT key min max.O(log(n)).
  • ZINCRBY: 给某个元素增加给定的分值.ZINCRBY key score value.O(log(n)).
  • ZSCAN: 扫描集合,和set部分的命令差不多.
  • ZINTERSTORE: 求给定集合的交集并存在指定的集合中(覆盖存储),还有一些其他的选项供操作.ZUNIONSTORE destination numkeys key [key ...] [WEIGHTS weight [weight ...]] [AGGREGATE SUM|MIN|MAX]
    • WEIGHTS: 指定每个集合在算出最后的分数之前的乘法因子.
    • AGGREGATE: 指定聚合的方式,可以是求和,最大,最小值.
    • 时间复杂度很复杂…
  • ZUNIONSTORE: 上一个命令的并集版本.

hashes

  • HSET: 写入一条数据,key对应的列的数据.HSET key field value.
  • HGET: 获取某个key的某个列的值.HGet key field.
  • HMGET: 获取多个列的值的列表.HMGET key field1 field2.
  • HMSET: 一次写入多个列-值.HMSET key field1 v1 field2 v2.
  • HSETX: 仅当该列不存在的时候写入.HSETX key field value.
  • HDEL: 删除一个或者多个列.HDEL key field field field
  • HEXISTS: 检查是否包含某个列.HEXISTS key field.返回0或者1.
  • HGETALL: 返回当前key中的所有字段和值.HGETALL key.时间复杂度是O(n).
  • HINCRBY: 对某个列的值进行增加.HINCRBY key field number.只支持feild是64位有符号整数.
  • HINCRBYFLOAT: 增加一个浮点数.其余和上面的命令一样.HINCRBYFLOAT key field float.
  • HKEYS: 返回所有的列名.HKEYS key.
  • HLEN: 返回列的数据.HLEN key.
  • HSCAN: 扫描所有的列-值.返回的规则和其他的scan一样.HSCAN key 0 match uu* count 10
  • HSTRLEN: 返回该列的值的长度.HSTRLEN key field.
  • HVALS: 返回所有的值.只有值没有列名.HVALS key.时间复杂度为O(n).

streams

本章节的命令签名较长且变化较多,因此不再提供示例命令和方法签名,可以去下面的链接中学习.

stream相关命令

  • XINFO: 用于检索有关流和关联的消费者组的不同信息.有三种子命令,STREAMS,GROUPS,CONSUMERS.
  • XADD: 将给定的条目添加到Stream中,如果stream不存在,则以key创建一个Stream.
  • XRANGE: 从Stream中查找指定范围的条目并返回.
  • XREVRANGE: XRANGE的倒序版本,接受参数也是倒序.
  • XLEN: 返回Stream中的项目数量.
  • XDEL: 从Stream删除给定ID的项目.
  • XREAD: 从一个或者多个Stream中读取数据,仅返回ID大于传入ID的信息.
  • XTRIM: 将Stream修剪的只保留给定数量的项目,有多种修剪策略,目前只实现了一种.
  • XREADGROUP:使用消费者组从Stream中读取信息.
  • XACK:确认已经处理消息.
  • XCLAIM: 更改消息的所有权,可以是其他消费者来处理此消息,
  • XPENDING: 查看正在处理的消息的信息.
  • XGROUP: 创建,销毁,管理消费者组.也有多个子命令,CREATE,SETID,DESTROY,DELCONSUMER.

bitmaps

其实bitmap不是一个实际的数据结构,只是在string数据结构上的一组面向位的操作,因为string数据结构是二进制安全的,所以这个是可行的.

  • SETBIT: 设置某个key在某个位置的bit值.SETBIT key offset value.
  • GETBIT: 获取某个key在某个位置的bit值.GETBIT key offset.
  • BITCOUNT: 获取某个范围内bit=1的总数.BITCOUNT key start end.
  • BITPOS: 获取某个范围内第一个0或者1出现的位置.BITPOS key 0 1 2.

hyperloglogs

hyperloglog的原理这里就不讲了,完了多看看之后单独记录一下.

  • PFADD: 添加一个或者多个元素.PFADD key1 v1 v2 v3.O(1).
  • PFCOUNT: 返回不重复的元素的个数,可以统计多个key.同时,返回值是有一定(0.81%)错误率的近似值.PFCOUNT key1 key2 key3.O(n).
  • PFMERGE: 将多个key1的内容合并到一个key中.PFMERGE target key1 key2.O(n),n是key的数量. geospatial index
  • GEOADD: 想指定的key中添加一个或者多个地理位置,格式为经度,纬度,名称.GEOADD key longitude latitude member [longitude latitude member ...]
  • GEOHASH: 返回一个或者多个GEO值的hash.GEOHASH key member [member ...]
  • GEOPOS: 获取某个成员的坐标.GEOPOS key member [member ...]
  • GEODIST: 返回两个成员之间的距离,可以指定多种单位.GEODIST key member1 member2 [unit].
  • GEORADIUS: 返回指定点为球心,指定距离为半径内的坐标集.GEORADIUS key longitude latitude radius m|km|ft|mi [WITHCOORD] [WITHDIST] [WITHHASH] [COUNT count] [ASC|DESC] [STORE key] [STOREDIST key]
  • GEORADIUSBYMEMBER: 与上一个命令相似,只是返回的是成员名称.GEORADIUSBYMEMBER key member radius m|km|ft|mi [WITHCOORD] [WITHDIST] [WITHHASH] [COUNT count] [ASC|DESC] [STORE key] [STOREDIST key].

完。

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐