目录1. String2. Hash3. List4. Set5. Zset6. 类型补充1. Streams2. Geospatial3. Hyperloglog4. Bitmaps5. Bitfield6. Scan官方文档Redis - The Real-time Data PlatformRedis与MySQL的区别MySQL数据存储于硬盘中速度慢通过“表”来存储数据是“关系型数据库”Redis数据存储于内存中速度快但是存储空间有限通过“键值对”来存储数据是“非关系型数据库”Redis在内存中存储数据的中间件作为数据库用于数据缓存在分布式系统中可以大展拳脚。1. String常见全局命令1set [key] [value]创建键值对2get [key]查看键对应的值3keys [pattern]查看匹配规则的key4exists [key]判定key是否存在5del [key]删除指定的key6expire [key] [seconds]给key设置过期时间7ttl [key]查询key的过期时间8type [key]查询key对应的value类型SET key value [expiration EX seconds | PX milliseconds [NX|XX]NX如果key不存在才设置如果key存在则不设置返回nilXX如果key存在才设置相当于更新key的value如果key不存在则不设置返回nil注意GET 只支持字符串类型的value其他类型使用GET获取会报错MSET [key1 value1 key2 value2 ...]一次性设置多个键值对MGET [key1 key2 ...]一次性获取多个键值对SETNX / SETXX / SETPXSETNX不存在才设置存在则设置失败SETEX设置的同时指定超时时间单位秒PSETEX设置的同时指定超时时间单位毫秒键值对的运算操作incr [key]value 1incrby [key] [number]value ndecr [key]value - 1decrby [key] [number]value - nincrbyfloat [key] [number] value /- 小数APPEND key value如果key已经存在且是一个string将value追加到原有string后面如果key不存在则等同于set命令返回值为string的长度。注意汉字在utf-8字符集中占3个字节。在启动redis客户端时加上 --rawredis-cli --raw 就可以使redis客户端能够自动把二进制数据尝试翻译成汉字。CtrlS冻结当前画面CtrlQ解除冻结GETRANGE key start end左闭右闭类似于substring。例如getrange key 0 -1获取全部 string。SETRANGE key offset value从 offset 偏移量开始替换替换成 value返回值是替换后字符串的长度针对不存在的key也可以操作不过会把offset之前的内容填充成0x00。STRLEN key获取字符串的长度单位字节String编码方式int8个字节的长整型embstr小于等于39个字节的字符串raw大于39个字符的字符串整数当做int来存储小数当做字符串来存储。注意Redis 不擅长数据统计。2. Hash常见全局命令hset key field value [field value ...]返回值是设置成功的键值对的个数hget key field获取哈希表hmget key [field ...]一次查询多个valuehexists key field返回值1表示存在0表示不存在hdel key [field ...]返回值是本次操作删除的字段个数hkeys key获取hash中key的所有field字段hvals 获取hash中所有的value值hgetall key获取hash中所有的field和valuehscan遍历hash但是属于“渐进式遍历”HLEN key获取hash的元素个数不需要遍历 O(1)HSETNX key field value不存在时候才能设置成功存在则设置失败HINCRBY key field n运算操作HINCRBYFLOAT key field n运算操作HSTRLEN key field计算长度3. ListList链表1list中的元素是有序的2 list中的元素可以重复。增加LPUSH key [element ...]头插链表元素可一个或多个返回值为list的长度如果key已经存在且key对应的value类型不是list则lpush命令就会报错。LRANGE key start stop查看list中指定范围的元素左闭右闭如果下标超出范围Redis会尽可能获取到给定区间的元素。LPUSHX key [element ...]头插链表元素key不存在l则直接返回。RPUSH key [element ...]尾插链表元素可一个或多个返回值为list的长度。RPUSHX key [element ...]尾插链表元素key不存在l则直接返回。删除LPOP key [count]头删list元素一次删count个Redis 5 以上支持RPOP key [count]尾删list元素一次删count个Redis 5 以上支持LINDEX key index给定下标获取到对应的元素如果下标非法返回nil。LINSERT key before|after pivot value在基准值pivot前或后插入新元素value返回值是新list的长度。LLEN key获取list长度。LREM key count element 在key中从前往后删除count个值为element的元素count值为负数时从后往前删返回值为成功删除元素的个数。LTRIM key start stop保留start和stop区间内的元素左闭右闭。LSET key index element根据下标修改元素。阻塞版本命令BLPOP [key ...] timeout不存在该元素则在timeout时间内一直阻塞BRPOP [key ...] timeout同上。注意如果命令中设置了多个key那么会从左向右进行键遍历知道有个键对应的列表中可以弹出元素命令立即返回。返回的结果是一个二元组包括当前的数据来自哪个key以及取到的数据是什么。timeout单位是秒从Redis 6 开始超时时间允许设定成小数。4. SetSet集合1. 集合中的元素是无序的2. 集合中的元素不能重复。SADD key [member ...]给集合中添加元素返回值为添加成功元素的个数。SMEMBERS key获取集合中的所有元素。SISMEMBER key member判定当前元素是否在集合中。SPOP key [count]随机删除count个元素不写count就是随机删除一个返回值为成功删除的元素。SRANDMEMBER key count随机获取集合中的count个元素但不会删除。SMOVE source destination member将源Set中的member删除插入目的Set中。如果目的Set中已经有member插入后不会有效果如果源Set中没有member返回0表示移动失败。SREM key [member ...]一次删除一个或多个member返回值为删除成功的元素个数 。交集interSINTER [key ...]求交集返回值为交集的元素O(N*M)N是最小集合元素个数M是最大集合元素个数。SINTERSTORE destination [key ...]直接把算好的交集放到destination这个key对应的集合中返回值为交集的元素个数。并集unionSUNION [key ...]求并集返回值为并集的元素 O(N)N是总的元素个数。SUNIONSTORE destination [key ...]直接把算好的并集放到destination这个key对应的集合中返回值为并集的元素个数。差集diffSDIFF [key ...]求差集返回值为差集的元素O(N)N是总的元素个数SDIFFSTORE destination [key ...]直接把算好的差集放到destination这个key对应的集合中返回值为差集的元素个数Set应用场景1使用Set保存用户的“标签”用户画像Set方便计算交集很容易找到两个用户之间的公共标签基于这样的标签可以衍生出“用户关系”。2使用Set计算用户间的共同好友如QQ推荐可能认识的好友。3使用Set统计UV互联网衡量用户规模的指标主要是两方面PVPage View用户每次访问该服务器都会产生一个PVUVUser View每个用户访问服务器都会产生一个UV但是同一个用户的多次访问只算成一条所以需要Set进行去重。5. ZsetZset 有序集合1.有序升序/降序给Zset中的member引入了一个属性分数score浮点类型排序的时候就是依照分数score大小进行升序/降序既可以通过member找到对应的score也可以通过score找到对应的member。2.唯一member唯一score可以相同不同member的score相同时按照member的字典序排列。ZADD key [NX|XX] [GT|LT] [CH] [INCR] score member [score member ...]新增元素返回值为新增元素的数量O(logn)n为有序集合中元素个数NX|XXXX只更新存在的不添加新元素NX只添加新元素不更新存在的。如果不加NX|XX选项member不存在添加新membermember已存在更新对应的score。LT|GTLT只更新比当前score小的scoreGT只更新比当前score大的score这个选项不会阻止添加新元素。CH让命令的返回值从“新增元素的数量”变为“新增元素数量 更新元素数量”。INCR针对现有元素的score进行运算此时只能对一组score member进行计算如 zadd key incr 1 zhangsan返回值为修改后的score。ZRANGE key start stop [withscores]类似LRANGE查看有序集合中的元素详情默认升序。ZREVRANGE key start stop [withscores]查看有序集合中的元素详情默认降序。ZRANGEBYSCORE key start stop [withscores]按照分数查找元素指定分数作为区间注意这个命令可能会在6.2版本后弃用合并到ZRANGE中。ZCARD key获取zset中元素的个数。ZCOUNT key min max返回分数在min和max之间的元素个数左闭右闭想不包含边界值就加上括号如 zcount key (1 (10意为返回1和10之间的数不包含1和10。O(logn)。min和max可以写成浮点数也支持 -inf负无穷大inf正无穷大。ZPOPMAX key [count]删除并返回分数最高的count个元素如果存在score相同的最大值按照member的字典序删除一个O((logN)*count)。BZPOPMAX [key ...] timeoutZPOPMAX的阻塞版本timeout单位是秒支持小数形式返回值为keymemberscoreO(logN)。ZPOPMIN key [count]删除并返回分数最低的count个元素如果存在score相同的最小值按照member的字典序删除一个O((logN)*count)。BZPOPMIN [key ...] timeoutZPOPMIN的阻塞版本timeout单位是秒支持小数形式返回值为keymemberscoreO(logN)。ZRANK key member获取member元素的排名O(logN)。ZREVRANK key member获取member元素的排名反着算O(logN)。ZSCORE key member查询指定member元素的分数O(1)。ZREM key [member ...]删除元素O(logN * M)N为整个有序集合的个数M为要删除member的个数返回值为删除成功元素的个数。ZREMRANGEBYRANK key start stop使用下标描述的范围进行删除O(logN M)N为整个有序集合的个数M为start-stop区间中的元素个数返回值为删除成功的元素。ZREMRANGEBYSCORE key min max按照分数删除指定范围的元素。ZINCRBY key increment member给指定member修改分数内容同时移动元素位置保持有序支持小数和负数。ZINTERZUNIONZDIFF 从Redis 6.2开始支持ZINTERSTORE destination numkeys key [key ...] [WEIGHTS weight [weight ...]] [AGGREGATE SUM | MIN | MAX]numkeys说明后续有几个有序集合参与运算weight为不同有序集合对应的权重最终分数为权重*score再求和aggregate中给了三种处理member相同score不同的情况时交集最终的分数如何合并默认是SUM。ZUNIONSTORE destination numkeys key [key ...] [WEIGHTS weight [weight ...]] [AGGREGATE SUM | MIN | MAX]同上。zset编码方式ziplist skiplistzset应用场景1 微博热搜2游戏天梯排行3成绩排行6. 类型补充1. Streams模拟实现事件传播的机制。2. Geospatial存储坐标经纬度并根据坐标半径、矩形区域查找。GEOADDGEOSEARCH3. Hyperloglog估算Set集合中的元素个数误差0.81%左右即记录当前集合中有多少个不同的元素。不存储元素的内容但是能够记录“元素的特征”从而知道新增元素时是一个已存在的元素还是第一次出现的元素。PFADDPFCOUNT4. Bitmaps位图使用比特位表示整数存储了元素内容本质上还是一个集合是Set类型针对整数的特化版本。SETBITGETBIT5. Bitfield位域可以理解成一串二进制序列字节数组把这个字节数组中的某几位赋予特定的含义并且可以进行读取/修改/算术运算相关操作。6. Scankeys *一次性获取Redis中所有的key这个操作很危险可能会阻塞Redis服务器渐进式遍历每执行一次命令只获取其中一小部分多次遍历获得全部的key。SCAN cursor [MATCH pattern] [COUNT count] [TYPE type]cursor是光标光标设置为0表示从头开始获取count限制这一次遍历能获取到几个元素默认是10但是返回个数不一定是count不精确type指定这次遍历想获取什么类型的key如scan 0 count 3返回值的前半部分说明下次光标从哪里开始遍历后半部分是这次遍历到的key中的内容。注意如果遍历过程中键有所变化增加、修改、删除可能导致遍历时键的重复遍历或者遗漏。
【Redis】Redis基本操作
目录1. String2. Hash3. List4. Set5. Zset6. 类型补充1. Streams2. Geospatial3. Hyperloglog4. Bitmaps5. Bitfield6. Scan官方文档Redis - The Real-time Data PlatformRedis与MySQL的区别MySQL数据存储于硬盘中速度慢通过“表”来存储数据是“关系型数据库”Redis数据存储于内存中速度快但是存储空间有限通过“键值对”来存储数据是“非关系型数据库”Redis在内存中存储数据的中间件作为数据库用于数据缓存在分布式系统中可以大展拳脚。1. String常见全局命令1set [key] [value]创建键值对2get [key]查看键对应的值3keys [pattern]查看匹配规则的key4exists [key]判定key是否存在5del [key]删除指定的key6expire [key] [seconds]给key设置过期时间7ttl [key]查询key的过期时间8type [key]查询key对应的value类型SET key value [expiration EX seconds | PX milliseconds [NX|XX]NX如果key不存在才设置如果key存在则不设置返回nilXX如果key存在才设置相当于更新key的value如果key不存在则不设置返回nil注意GET 只支持字符串类型的value其他类型使用GET获取会报错MSET [key1 value1 key2 value2 ...]一次性设置多个键值对MGET [key1 key2 ...]一次性获取多个键值对SETNX / SETXX / SETPXSETNX不存在才设置存在则设置失败SETEX设置的同时指定超时时间单位秒PSETEX设置的同时指定超时时间单位毫秒键值对的运算操作incr [key]value 1incrby [key] [number]value ndecr [key]value - 1decrby [key] [number]value - nincrbyfloat [key] [number] value /- 小数APPEND key value如果key已经存在且是一个string将value追加到原有string后面如果key不存在则等同于set命令返回值为string的长度。注意汉字在utf-8字符集中占3个字节。在启动redis客户端时加上 --rawredis-cli --raw 就可以使redis客户端能够自动把二进制数据尝试翻译成汉字。CtrlS冻结当前画面CtrlQ解除冻结GETRANGE key start end左闭右闭类似于substring。例如getrange key 0 -1获取全部 string。SETRANGE key offset value从 offset 偏移量开始替换替换成 value返回值是替换后字符串的长度针对不存在的key也可以操作不过会把offset之前的内容填充成0x00。STRLEN key获取字符串的长度单位字节String编码方式int8个字节的长整型embstr小于等于39个字节的字符串raw大于39个字符的字符串整数当做int来存储小数当做字符串来存储。注意Redis 不擅长数据统计。2. Hash常见全局命令hset key field value [field value ...]返回值是设置成功的键值对的个数hget key field获取哈希表hmget key [field ...]一次查询多个valuehexists key field返回值1表示存在0表示不存在hdel key [field ...]返回值是本次操作删除的字段个数hkeys key获取hash中key的所有field字段hvals 获取hash中所有的value值hgetall key获取hash中所有的field和valuehscan遍历hash但是属于“渐进式遍历”HLEN key获取hash的元素个数不需要遍历 O(1)HSETNX key field value不存在时候才能设置成功存在则设置失败HINCRBY key field n运算操作HINCRBYFLOAT key field n运算操作HSTRLEN key field计算长度3. ListList链表1list中的元素是有序的2 list中的元素可以重复。增加LPUSH key [element ...]头插链表元素可一个或多个返回值为list的长度如果key已经存在且key对应的value类型不是list则lpush命令就会报错。LRANGE key start stop查看list中指定范围的元素左闭右闭如果下标超出范围Redis会尽可能获取到给定区间的元素。LPUSHX key [element ...]头插链表元素key不存在l则直接返回。RPUSH key [element ...]尾插链表元素可一个或多个返回值为list的长度。RPUSHX key [element ...]尾插链表元素key不存在l则直接返回。删除LPOP key [count]头删list元素一次删count个Redis 5 以上支持RPOP key [count]尾删list元素一次删count个Redis 5 以上支持LINDEX key index给定下标获取到对应的元素如果下标非法返回nil。LINSERT key before|after pivot value在基准值pivot前或后插入新元素value返回值是新list的长度。LLEN key获取list长度。LREM key count element 在key中从前往后删除count个值为element的元素count值为负数时从后往前删返回值为成功删除元素的个数。LTRIM key start stop保留start和stop区间内的元素左闭右闭。LSET key index element根据下标修改元素。阻塞版本命令BLPOP [key ...] timeout不存在该元素则在timeout时间内一直阻塞BRPOP [key ...] timeout同上。注意如果命令中设置了多个key那么会从左向右进行键遍历知道有个键对应的列表中可以弹出元素命令立即返回。返回的结果是一个二元组包括当前的数据来自哪个key以及取到的数据是什么。timeout单位是秒从Redis 6 开始超时时间允许设定成小数。4. SetSet集合1. 集合中的元素是无序的2. 集合中的元素不能重复。SADD key [member ...]给集合中添加元素返回值为添加成功元素的个数。SMEMBERS key获取集合中的所有元素。SISMEMBER key member判定当前元素是否在集合中。SPOP key [count]随机删除count个元素不写count就是随机删除一个返回值为成功删除的元素。SRANDMEMBER key count随机获取集合中的count个元素但不会删除。SMOVE source destination member将源Set中的member删除插入目的Set中。如果目的Set中已经有member插入后不会有效果如果源Set中没有member返回0表示移动失败。SREM key [member ...]一次删除一个或多个member返回值为删除成功的元素个数 。交集interSINTER [key ...]求交集返回值为交集的元素O(N*M)N是最小集合元素个数M是最大集合元素个数。SINTERSTORE destination [key ...]直接把算好的交集放到destination这个key对应的集合中返回值为交集的元素个数。并集unionSUNION [key ...]求并集返回值为并集的元素 O(N)N是总的元素个数。SUNIONSTORE destination [key ...]直接把算好的并集放到destination这个key对应的集合中返回值为并集的元素个数。差集diffSDIFF [key ...]求差集返回值为差集的元素O(N)N是总的元素个数SDIFFSTORE destination [key ...]直接把算好的差集放到destination这个key对应的集合中返回值为差集的元素个数Set应用场景1使用Set保存用户的“标签”用户画像Set方便计算交集很容易找到两个用户之间的公共标签基于这样的标签可以衍生出“用户关系”。2使用Set计算用户间的共同好友如QQ推荐可能认识的好友。3使用Set统计UV互联网衡量用户规模的指标主要是两方面PVPage View用户每次访问该服务器都会产生一个PVUVUser View每个用户访问服务器都会产生一个UV但是同一个用户的多次访问只算成一条所以需要Set进行去重。5. ZsetZset 有序集合1.有序升序/降序给Zset中的member引入了一个属性分数score浮点类型排序的时候就是依照分数score大小进行升序/降序既可以通过member找到对应的score也可以通过score找到对应的member。2.唯一member唯一score可以相同不同member的score相同时按照member的字典序排列。ZADD key [NX|XX] [GT|LT] [CH] [INCR] score member [score member ...]新增元素返回值为新增元素的数量O(logn)n为有序集合中元素个数NX|XXXX只更新存在的不添加新元素NX只添加新元素不更新存在的。如果不加NX|XX选项member不存在添加新membermember已存在更新对应的score。LT|GTLT只更新比当前score小的scoreGT只更新比当前score大的score这个选项不会阻止添加新元素。CH让命令的返回值从“新增元素的数量”变为“新增元素数量 更新元素数量”。INCR针对现有元素的score进行运算此时只能对一组score member进行计算如 zadd key incr 1 zhangsan返回值为修改后的score。ZRANGE key start stop [withscores]类似LRANGE查看有序集合中的元素详情默认升序。ZREVRANGE key start stop [withscores]查看有序集合中的元素详情默认降序。ZRANGEBYSCORE key start stop [withscores]按照分数查找元素指定分数作为区间注意这个命令可能会在6.2版本后弃用合并到ZRANGE中。ZCARD key获取zset中元素的个数。ZCOUNT key min max返回分数在min和max之间的元素个数左闭右闭想不包含边界值就加上括号如 zcount key (1 (10意为返回1和10之间的数不包含1和10。O(logn)。min和max可以写成浮点数也支持 -inf负无穷大inf正无穷大。ZPOPMAX key [count]删除并返回分数最高的count个元素如果存在score相同的最大值按照member的字典序删除一个O((logN)*count)。BZPOPMAX [key ...] timeoutZPOPMAX的阻塞版本timeout单位是秒支持小数形式返回值为keymemberscoreO(logN)。ZPOPMIN key [count]删除并返回分数最低的count个元素如果存在score相同的最小值按照member的字典序删除一个O((logN)*count)。BZPOPMIN [key ...] timeoutZPOPMIN的阻塞版本timeout单位是秒支持小数形式返回值为keymemberscoreO(logN)。ZRANK key member获取member元素的排名O(logN)。ZREVRANK key member获取member元素的排名反着算O(logN)。ZSCORE key member查询指定member元素的分数O(1)。ZREM key [member ...]删除元素O(logN * M)N为整个有序集合的个数M为要删除member的个数返回值为删除成功元素的个数。ZREMRANGEBYRANK key start stop使用下标描述的范围进行删除O(logN M)N为整个有序集合的个数M为start-stop区间中的元素个数返回值为删除成功的元素。ZREMRANGEBYSCORE key min max按照分数删除指定范围的元素。ZINCRBY key increment member给指定member修改分数内容同时移动元素位置保持有序支持小数和负数。ZINTERZUNIONZDIFF 从Redis 6.2开始支持ZINTERSTORE destination numkeys key [key ...] [WEIGHTS weight [weight ...]] [AGGREGATE SUM | MIN | MAX]numkeys说明后续有几个有序集合参与运算weight为不同有序集合对应的权重最终分数为权重*score再求和aggregate中给了三种处理member相同score不同的情况时交集最终的分数如何合并默认是SUM。ZUNIONSTORE destination numkeys key [key ...] [WEIGHTS weight [weight ...]] [AGGREGATE SUM | MIN | MAX]同上。zset编码方式ziplist skiplistzset应用场景1 微博热搜2游戏天梯排行3成绩排行6. 类型补充1. Streams模拟实现事件传播的机制。2. Geospatial存储坐标经纬度并根据坐标半径、矩形区域查找。GEOADDGEOSEARCH3. Hyperloglog估算Set集合中的元素个数误差0.81%左右即记录当前集合中有多少个不同的元素。不存储元素的内容但是能够记录“元素的特征”从而知道新增元素时是一个已存在的元素还是第一次出现的元素。PFADDPFCOUNT4. Bitmaps位图使用比特位表示整数存储了元素内容本质上还是一个集合是Set类型针对整数的特化版本。SETBITGETBIT5. Bitfield位域可以理解成一串二进制序列字节数组把这个字节数组中的某几位赋予特定的含义并且可以进行读取/修改/算术运算相关操作。6. Scankeys *一次性获取Redis中所有的key这个操作很危险可能会阻塞Redis服务器渐进式遍历每执行一次命令只获取其中一小部分多次遍历获得全部的key。SCAN cursor [MATCH pattern] [COUNT count] [TYPE type]cursor是光标光标设置为0表示从头开始获取count限制这一次遍历能获取到几个元素默认是10但是返回个数不一定是count不精确type指定这次遍历想获取什么类型的key如scan 0 count 3返回值的前半部分说明下次光标从哪里开始遍历后半部分是这次遍历到的key中的内容。注意如果遍历过程中键有所变化增加、修改、删除可能导致遍历时键的重复遍历或者遗漏。