Redis学习记录
一、基本操作
启动与连接
redis-server
:启动Redis服务,执行该命令后,Redis会在后台运行,并监听默认的端口6379。redis-cli
:连接到Redis服务器的命令行客户端,通过它用户可以与Redis进行交互,发送命令并接收响应。telnet 127.0.0.1 6379
:使用telnet工具连接到本地的Redis服务器,端口号为6379,这是一种替代方式,当redis-cli不可用时可以使用。quit
或exit
:用于退出Redis客户端,结束与服务器的连接。
键操作
DEL key [key ...]
:删除一个或多个键及其对应的值。当键不存在时,该命令不会执行任何操作。STRLEN key
:获取指定键的值的字符串长度。如果键不存在或值不是字符串类型,则返回0。
二、字符串
字符串是Redis中最基本的数据类型,它可以存储文本、数字等各种类型的数据。
设置与获取值
SET key value
:将键key的值设置为value,如果键已经存在,会覆盖原来的值。SETEX key seconds value
:将键key的值设置为value,并设置其过期时间为seconds秒,适用于需要定时删除键值的情况。PSETEX key milliseconds value
:与SETEX类似,但过期时间以毫秒为单位,提供了更精确的时间控制。SETNX key value
:只有在键key不存在的情况下,才将key的值设置为value,可用于实现简单的分布式锁功能。GET key
:返回键key的值,如果键不存在,则返回nil。GETSET key value
:将键key的值设置为value,并返回设置前的旧值,若没有旧值则返回nil,该命令原子执行,保证了操作的完整性。APPEND key value
:如果键key存在并且值是一个字符串,则把value追加到现有值的末尾;如果key不存在,则将key的值设置为value,返回追加后的字符串长度。SETRANGE key offset value
:从偏移量offset开始,用value字符串覆盖键key存储的原字符串,offset从0开始计数,返回修改后新的value字符串的长度。GETRANGE key start end
:返回键key存储的字符串的从start到end之间(包括start和end)的部分,即获取指定范围的子字符串。
数字操作
INCR key
和DECR key
:将键key存储的数字值value加一或减一。若key不存在则值先初始化为0再加一或减一;若key存储的值不能被解释为数字,则返回错误。INCRBY key increment
和DECRBY key decrement
:将键key存储的数字值value加上或减去一个increment/decrement的量,若key不存在则值先初始化为0再加减,若key存储的值不能被解释为数字,则返回错误。INCRBYFLOAT key increment
:将键key存储的浮点数值value加上一个increment的增量,若key不存在则值先初始化为0再执行加上增量的操作,若key存储的值或increment不能被解释为浮点数值,则返回错误。
批量操作
MSET key value [key value ...]
:同时为多个键设置值,一次性执行多个SET操作,提高效率。MGET key [key ...]
:返回给定的一个或多个键的值,一次性获取多个键的值,减少网络往返时间。MSETNX key value [key value ...]
:当所有给定的key都不存在时才同时为多个键设置值,只要有其中一个key已经存在,那么所有值都不会被继续设置,可用于确保多个键值的同时设置原子性。
三、列表
列表是Redis中的一种有序数据结构,它允许在两端进行快速的插入和删除操作。
元素添加
LPUSH key element [element ...]
:将一个或多个元素添加到列表key的表头(左侧),多个值则从左至右依次插入表头,即第一个元素会成为新的头元素。如果列表key不存在,则创建一个然后执行LPUSH插入操作;如果列表key存在但不是列表类型,则返回错误。RPUSH key element [element ...]
:将一个或多个元素添加到列表key的表尾(右侧),多个值则从左至右依次插入表尾,即最后一个元素会成为新的尾元素。如果列表key不存在,则创建一个然后执行RPUSH插入操作;如果列表key存在但不是列表类型,则返回错误。LPUSHX key element [element ...]
和RPUSHX key element [element ...]
:当且仅当key存在并且是一个列表的时候,才执行LPUSH或RPUSH操作,用于在列表存在时才添加元素。
元素移除与获取
LPOP key [count ...]
和RPOP key [count ...]
:将一个或count个元素从列表头或尾方向移除并将其返回,如果列表key不存在,则返回nil。LREM key count element
:移除列表key中与element相等的count个元素,返回被移除的元素的数量,count为正数时从头到尾移除,count为负数时从尾到头移除,count为0时移除所有匹配的元素。LLEN key
:返回列表key的长度,如果key不存在则返回0,如果key不是列表类型则返回错误。LINDEX key index
:返回列表key中索引为index的元素,索引从0开始,支持负数索引,表示从尾部开始计数。LINSERT key BEFORE|AFTER pivot element
:将元素element插入到列表key中,位于pivot之前(BEFORE)或者之后(AFTER),如果pivot不存在,则返回-1。LSET key index element
:将列表key中索引为index的元素设置为element,如果索引超出范围,则返回错误。LRANGE key start stop
:返回列表key中,位于start和stop之间的元素(包括start和stop),start和stop可以是负数,表示从尾部开始计数。LTRIM key start stop
:只保留列表key中索引为start和stop之间的元素,其余元素被移除,用于裁剪列表。
阻塞式操作
BLPOP key [key ...] timeout
和BRPOP key [key ...] timeout
:列表阻塞式弹出,分别是LPOP和RPOP的阻塞版本,当列表中没有任何元素时阻塞,直到超时或发现新的可弹出元素为止,适用于消费者-生产者模型,避免轮询带来的资源浪费。BRPOPLPUSH source destination timeout
:是RPOPLPUSH的阻塞版本,当列表source中没有任何元素时阻塞,直到超时或发现新的可弹出元素为止,原子性地从source列表尾部弹出元素并添加到destination列表头部。
四、集合
集合是Redis中的一种无序且元素唯一的数据结构,适用于需要去重和集合运算的场景。
元素操作
SADD key member [member ...]
:将一个或多个元素加入到集合key中,已存在于集合中的元素将被忽略,返回成功添加的元素数量。SMEMBERS key
:返回集合key中的所有成员,以数组形式返回。SISMEMBER key member
:判断member是否是集合key的成员,是返回1,不是或key不存在返回0。SPOP key [count]
:移除并返回集合key中的一个或count个随机元素,可用于随机抽样等场景。SRANDMEMBER key [count]
:和SPOP类似,区别在于SRANDMEMBER只返回不移除元素,可指定返回多个随机元素。SMOVE source destination member
:将member元素从source集合移动到destination集合,原子性操作,确保元素在两个集合间的转移不会出现中间状态。SCARD key
:返回集合key的基数,即集合中元素的数量。SREM key member [member ...]
:将一个或多个元素从集合key中移除,不存在的member元素将被忽略。
集合运算
SINTER key [key ...]
、SUNION key [key ...]
和SDIFF key [key ...]
:分别返回多个集合的交集、并集和差集,结果以数组形式返回。SINTERSTORE destination key [key ...]
、SUNIONSTORE destination key [key ...]
和SDIFFSTORE destination key [key ...]
:与SINTER、SUNION、SDIFF类似,区别在于会将结果集保存到destination集合中,而不是单纯返回,若destination存在则将其覆盖,destination可以是key本身。
五、有序集合
有序集合是集合的一种升级版,它在元素唯一的基础上,还为每个元素关联了一个分数,从而可以对元素进行排序。
元素操作
ZADD key [NX|XX] [GT|LT] [CH] [INCR] score member [score member ...]
:将一个或多个member元素及其分数score加入到有序集合key中,NX表示仅当member不存在时插入,XX表示仅当member存在时更新分数,GT/LT表示仅当分数大于/小于当前分数时更新,CH表示仅当分数改变时才更新,INCR表示将分数加上给定的增量,返回结果根据选项不同而有所差异。ZSCORE key member
:返回有序集合key中的成员member的分数值(score)。ZINCRBY key increment member
:为有序集合key的成员member的分数值score加上一个增量increment,返回更新后的分数值。ZREM key member [member ...]
:将一个或多个成员从有序集合key中移除,不存在的member成员将被忽略。
元素查询
ZRANGE key start stop [WITHSCORES]
和ZREVRANGE key start stop [WITHSCORES]
:返回有序集合key中指定区间内的成员,从低到高或从高到低排列,可选择是否返回分数值。ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count]
和ZREVRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count]
:返回有序集合key中所有score值在指定区间内的成员,从低到高或从高到低排列,可限制返回的数量。ZRANK key member
和ZREVRANK key member
:返回有序集合key中成员member的排名,按照score从小到大或从大到小排列,排名从0开始计数。ZCARD key
:返回有序集合key的基数,即集合中成员的数量。ZCOUNT key min max
:返回有序集合key中,分数值score在min和max之间(包括等于)的成员的数量。
元素移除
ZREMRANGEBYRANK key start stop
、ZREMRANGEBYSCORE key min max
和ZREMRANGEBYLEX key min max
:分别移除有序集合key中指定排名区间、分数区间或字典序区间内的所有member,按照score从小到大排列。
六、哈希
哈希是Redis中用于存储键值对集合的数据结构,适用于将多个字段和值关联起来的场景。
字段操作
HSET key field value [field value ...]
:将哈希表key中的域field的值设置为value,如果域已存在,则覆盖原来的值,返回1表示成功设置,返回0表示域已存在且值未改变。HGET key field
:返回哈希表key中给定域field的值,如果域不存在,则返回nil。HEXISTS key field
:判断给定域field是否存在于哈希表key中,存在返回1,不存在返回0。HDEL key field [field ...]
:删除哈希表key中的一个或多个指定域field,返回成功删除的域的数量。HLEN key
:返回哈希表key中域的数量。HSTRLEN key field
:返回哈希表key中,给定域field相关联的值的字符串长度。
批量操作
HMGET key field [field ...]
:返回哈希表key中一个或多个给定域field的值,一次性获取多个域的值,减少网络交互。HMSET key field value [field value ...]
:设置多个key-value对,功能同HSET相同,但已过时,建议使用HSET代替。HGETALL key
:返回哈希表key中所有的域和值,以数组形式返回,适用于需要获取整个哈希表内容的场景。
增量操作
HINCRBY key field increment
和HINCRBYFLOAT key field increment
:将哈希表key中field的值加上整数或浮点数增量increment,若field不存在则初始化为0再执行增量操作。
七、流
流是Redis 5.0引入的一种数据结构,用于处理实时数据流,支持消息的发布与订阅、消息持久化等功能。
消息操作
XADD key [NOMKSTREAM] [MAXLEN|MINID [=|~] threshold [LIMIT count]] *|id field value [field value ...]
:向流追加一个新的消息,如果key不存在则创建。NOMKSTREAM表示如果key不存在且没有指定MAXLEN等选项,则不创建流;MAXLEN或MINID用于限制流的最大长度或最小ID,超过限制时会自动删除旧消息;*表示自动生成消息ID,也可指定id。XLEN key
:返回流key中消息的数量。XRANGE key start end [COUNT count]
:返回流key中,id位于start和end之间的消息(包括start和end),可限制返回的消息数量。XREAD [COUNT count] [BLOCK milliseconds] STREAMS key [key ...] id [id ...]
:读取和返回流key中比id大的消息,若没有则阻塞至消息可用,适用于消费者获取新消息的场景。
消费者组操作
XGROUP CREATE key groupname id|$ [MKSTREAM] [ENTRIESREAD entries_read]
:创建一个消费者组,groupname为消费者组名称,id指定消费者组开始读取消息的ID,$表示从最新消息开始读取,MKSTREAM表示如果流不存在则创建,ENTRIESREAD用于指定已读取消息的数量。XACK key group id [id ...]
:确认消费者组group中的消费者已成功接收并处理消息id,返回成功确认的消息数量。XCLAIM key group consumer min-idle-time id [id ...]
:将消息id从消费者组group的pending队列中取出,重新分配给consumer消费者,当消息在pending队列中滞留时间超过min-idle-time时使用,用于处理消息消费失败或超时重试的情况。XDEL key id [id ...]
:从流key中移除消息id,返回成功移除的消息数量。XINFO STREAM key [FULL [COUNT count]]
:返回流key的详细信息,包括长度、第一个消息ID、最后一个消息ID、消费者组列表等,FULL选项可获取更详细的信息,COUNT限制返回的消息数量。XINFO GROUPS key
:返回流key的消费者组列表,包括消费者组名称、消费者数量、pending消息数量等。XINFO CONSUMERS key groupname
:返回消费者组groupname中的消费者列表,包括消费者名称、pending消息数量、最新交付的消息ID等。XTRIM key MAXLEN|MINID [=|~] threshold [LIMIT count]
:从流的开头删除消息,根据MAXLEN或MINID条件,删除超过阈值的消息,LIMIT限制一次删除的最大消息数量。
八、地理空间
Redis的地理空间功能允许存储和查询地理位置信息,基于经纬度坐标。
地理位置操作
GEOADD key [NX|XX] [CH] longitude latitude member [longitude latitude member ...]
:添加一个或多个成员到地理空间中,NX表示仅当member不存在时添加,XX表示仅当member存在时更新位置,CH表示返回添加或更新的元素数量,longitude和latitude是经度和纬度,member是位置名称。GEOPOS key member [member ...]
:返回一个或多个成员的位置经纬度信息,以数组形式返回,每个元素包含经度和纬度。GEODIST key member1 member2 [M|KM|FT|MI]
:返回两个成员member1和member2之间的距离,单位可选米(M)、公里(KM)、英尺(FT)或英里(MI),默认为米。GEOHASH key member [member ...]
:以哈希字符串的形式返回成员的地理信息,该哈希字符串可以用于地理编码和索引。
地理搜索
GEORADIUS key longitude latitude radius M|KM|FT|MI
和GEORADIUSBYMEMBER key member radius M|KM|FT|MI
:分别以经纬度坐标或成员member为中心,查询半径为radius范围内的成员,返回结果可包含距离、经纬度等信息。GEOSEARCH key FROMMEMBER member|FROMLONLAT longitude latitude BYRADIUS radius M|KM|FT|MI|BYBOX width height M|KM|FT|MI [ASC|DESC] [COUNT count [ANY]] [WITHCOORD] [WITHDIST] [WITHHASH]
:指定范围内搜索member并返回,可以按成员(FROMMEMBER)或按经纬度(FROMLONLAT),范围可以是圆形(BYRADIUS)或矩形(BYBOX),可指定排序方式、返回数量和附加信息。GEOSEARCHSTORE destination source FROMMEMBER member|FROMLONLAT longitude latitude BYRADIUS radius M|KM|FT|MI|BYBOX width height M|KM|FT|MI [ASC|DESC] [COUNT count [ANY]] [STOREDIST]
:与GEOSEARCH相同,指定范围内搜索,并将结果存储至destination,STOREDIST选项可仅存储距离信息。
九、HyperLogLog
HyperLogLog是一种用于近似计数的算法,Redis实现了该数据结构,用于统计唯一元素的数量,具有较小的内存占用。
PFADD key [element [element ...]]
:添加一个或多个元素到HyperLogLog中,若key不存在则创建一个,返回1表示添加成功且基数估计可能改变,返回0表示添加成功但基数估计未改变。PFCOUNT key [key ...]
:返回一个或多个key的近似基数,当有多个key时,返回它们的并集的近似基数。PFMERGE destkey sourcekey [sourcekey ...]
:将一个或多个sourcekey合并至destkey,destkey会包含合并后的近似基数信息,如果destkey存在则会被覆盖。
十、位图与位域
位图和位域是基于字符串二进制位操作的功能,用于高效存储和操作位信息。
位操作
SETBIT key offset value
和GETBIT key offset
:分别设置或读取偏移量为offset的位的值,offset从0开始计数,value为0或1,返回设置或读取的值。BITOP operation destkey key [key ...]
:对一个或多个key进行位逻辑运算(如AND、OR、XOR、NOT),并将结果存储在destkey中,operation指定运算类型,destkey可以是现有key或新key。BITCOUNT key [start [end [BYTE|BIT]]]
和BITPOS key bit [start [end [BYTE|BIT]]]
:分别返回从start到end为止的所有设置位(bit为1的位)的数量,以及返回第一个bit位(0或者1)的位置,start和end可指定范围,BYTE或BIT指定按字节或位计算。
位域操作
BITFIELD key [GET encoding offset|[OVERFLOW WRAP|SAT|FAIL] <SET encoding offset value|INCRBY encoding offset increment> [GET encoding offset|[OVERFLOW WRAP|SAT|FAIL] <SET encoding offset value|INCRBY encoding offset increment> ...]]
和BITFIELD_RO key [GET encoding offset [GET encoding offset ...]]
:BITFIELD将一个String字符串类型当作一个bit数组,执行任意位域整数运算,如获取、设置、增量操作等;BITFIELD_RO是只读版本,仅执行获取操作,两者都返回一个数组,包含各个操作的结果。
以上内容如有不当烦请指正。