南京做网站的客户电话,建设网站实训心得,建设世界一流企业,公司全网推广1. Redis的十大数据类型及常用命令
Redis是key-value键值对类型的数据库#xff0c;我们所说的数据类型指的是value的数据类型#xff0c;key的数据类型都是字符串。
1.1 字符串#xff08;String#xff09;
string是redis最基本的类型#xff0c;一个key对应一个val…1. Redis的十大数据类型及常用命令
Redis是key-value键值对类型的数据库我们所说的数据类型指的是value的数据类型key的数据类型都是字符串。
1.1 字符串String
string是redis最基本的类型一个key对应一个value。 string类型是二进制安全的意思是redis的string可以包含任何数据比如jpg图片或者序列化的对象 。 string类型是Redis最基本的数据类型一个redis中字符串value最多可以是512M
常用命令
命令说明SET key value设置指定key的值GET key获取指定key的值GETRANGE key start end返回key中字符串的子字符[0,-1]表示全部GETSET key value将指定的key的值设置为value并返回key的旧值GETBIT key offset对key所存储的字符串值获取指定偏移量上的位bit例如k1 h h对应的十六进制为01101000对应的 GETBIT k1 0的值是0GETBIT k1 1的值是1 GETBIT k1 7的值为0MGET key1 [key2]获取所有指定的key的值SETBIT key offset value对key锁存储的字符串值设置或清除指定偏移量上的位(bit)SETEX key second value将值value关联到key并将key的过期时间设为value秒SETNX key value只有在key不存在时设置key的值SETRANGE key offset value用value复写key的值从偏移量offset开始STRLEN key返回key所存储的字符串值的长度MSET key1 value1 [key2 value2]同时设置一个或多个key-value键值对MSETNX key1 value1 [key2 value2]同时设置一个或多个key-value键值对当且仅当所有key都不存在时PSETEX key millisecounds value这个命令和SETEX命令相似但他以毫秒为单位设置key的生存时间而不是像SETEX命令那样以秒为单位INCR key将key中存储的数字值增加1INCRBY key increment将key所存储的的值加上指定的值(increment)INCRBYFLOAT key increment将key所存储的的值加上指定的浮点值(increment)DECR key将key中存储的数值减1DECRBY key decrementkey所存储的值减去指定的值(decrement)APPEND key value如果key已经存在并且是一个字符串APPEND命令将value追加到key原来的值的末尾
set 命令详细介绍 set key value [NX|XX] [GET] [EX seconds|PX milliseconds|EXAT unix-time-seconds|PXAT unix-time-milliseconds|KEEPTTL] keepttl 已经存在的key-value在重新set时会改变过期时间使用keepttl参数保留原始的过期时间。 实际应用方面 比如点赞谋篇文章或抖音无限点赞可以使用incr key 命令增加1 比如可以使用过期时间来设置分布式锁在这先了解一下概念和思路之后高级篇会详细讲解 1.2 列表List
Redis列表是简单的字符串列表按照插入顺序排序。你可以添加一个元素到列表的头部左边或者尾部右边。 它的底层实际是个双端链表最多可以包含 2^32 - 1 个元素 (4294967295, 每个列表超过40亿个元素)对两端的操作性能很高通过索引下标的操作中间的节点性能会较差。 lpush k1 v1 v2 v3 v4 v5 v6 v7 其中v7是头v1是尾 常用命令
命令说明LPUSH key value1 [value2…]将value1、value2… 按照从左向右插入到列表头部最后输入的value在最前面返回值为列表的长度RPUSH key value1 [value2…]将value1、value2… 按照从右向左插入到列表头部最后输入的value在最后面返回值为列表的长度LPUSHX key value1 [value2…]将value1、value2… 按照从左向右插入到已经存在的列表头部最后输入的value在最前面返回值为列表的长度RPUSHX key value1 [value2…]将value1、value2… 按照从右向左插入到已经存在的列表头部最后输入的value在最后面返回值为列表的长度LREM key count value从列表头开始删除count个valueLLEN key获取列表key的长度(值为列表元素的个数即最大索引1)LINDEX key index通过索引index值获取列表中的元素LRANGE key start stop获取列表key指定范围内的元素【0-1】表示获取全部元素LSET key index value替换index索引对应的值为valueLTRIM key start stop裁剪原列表LINSERT key BEFORE|AFTER pivot value在key列表从头到尾的顺序第一个匹配pivot元素值的前或者后面增加值valueLPOP key count移出并获取列表头的count个元素RPOP key count移出并获取列表尾的count个元素BLPOP key1 [key2] timeout移出并获取列表的第一个元素key1列表结束后开始key2列表如果列表没有元素会阻塞列表直到等待timeout秒后超时或发现可移出元素为止BRPOP key1 [key2] timeout移出并获取列表的最后一个元素如果列表没有元素会阻塞列表直到等待timeout秒后超时或发现可移出元素为止BRPOPLPUSH source destination timeout移出source列表的最后一个值并放入destination列表的最后如果列表没有元素会阻塞列表直到等待timeout秒或发现可移除元素为止RPOPLPUSH source destinationRPOPLPUSH为BRPOPLPUSH的非阻塞版本
1.3 哈希Hash
Redis hash 是一个 string 类型的 field字段 和 value值 的映射表hash 特别适合用于存储对象。 Redis 中每个 hash 可以存储 2^32 - 1 键值对40多亿。
常用命令
命令说明HMSET key field1 value1 [field2 value2 …]设置hash值HGETALL key获取hash的所有field和valueHGET key field获取一个hash对应的field的valueHMGET key field1 [field2 …]获取一个或多个hash对应的field的valueHKEYS key获取hash所有的key值HVALS key获取hash所有key对应的valueHLEN key获取hash对应的filed的数量HSTRLEN key field获取hash指定field的value的长度HEXISTS key field判断hash是否存在指定的fieldHSET key field value设置hash对应的field和valueHSETNX key field value仅当指定的field在hash中不存在时才设置valueHINCRBY key field increment将hash中指定的field的整型值增加incrementHINCRBYFLOAT key field increment将hash中指定的field的值增加incrementHSCAN key cusror [MATCH pattern] [COUNT count]不知道没用明白
1.4 集合Set
Redis 的 Set 是 String 类型的无序集合。集合成员是唯一的这就意味着集合中不能出现重复的数据集合对象的编码可以是 intset(整数集合) 或者 hashtable(字典或者也叫哈希表)。 Redis 中Set集合是通过哈希表实现的所以添加删除查找的复杂度都是 O(1)。 集合中最大的成员数为 2^32 - 1 (4294967295, 每个集合可存储40多亿个成员)
常用命令
命令说明SADD key member1 [member2…]添加一个或多个元素到集合里SCARD key获取集合里的元素数量SDIFF key1 [key2…]获取key1中不存在于其他key的元素SDIFFSTORE destination key1 [key2…]获取队列不存在的元素并存储在destination中destination存在则会重新生成dstinationSINTER key1 [key2…]获取多个key集合的交集SINTERSTORE destination key1 [key2…]获取多个集合的交集并存储在destination中destination存在则会重新生成dstinationSISMEMBER key member确定一个给定的值是一个集合的成员SMEMBERS key获取集合里面的所有元素SMOVE source destination member移动集合里的一个元素到另一个集合SPOP key [count]删除并获取一个集合里面的count个元素SRANDMEMBER key [count]从集合里面随机获取count个元素SREM key member1 [member2…]从集合里删除一个或多个元素SUNION key1 [key2…]获取多个集合的元素(不会有重复的元素)SUNIONSTORE destination key1 [key2…]合并set元素并将结果存入到destination中SINTERCARD numkeys key1 [key2…] [LIMIT limit]返回指定结果集的交集产生的集合的基数SSCAN key cursor [MATCH pattern] [COUNT count]不知道没用明白
1.5 有序集合ZSet
Redis zset 和 set 一样也是string类型元素的集合,且不允许重复的成员。 不同的是每个元素都会关联一个double类型的分数redis正是通过分数来为集合中的成员进行从小到大的排序。 zset的成员是唯一的,但分数(score)却可以重复。 zset集合是通过哈希表实现的所以添加删除查找的复杂度都是 O(1)。 集合中最大的成员数为 2^32 - 1。
常用命令
命令说明ZADD key [NX\XX] [CH] [INCR] score1 member1 [score 2 member2]XX: 仅仅更新存在的成员不添加新成员。NX: 不更新存在的成员。只添加新成员。CH: 修改返回值为发生变化的成员总数原始是返回新添加成员的总数 (CH 是 changed 的意思)。更改的元素是新添加的成员已经存在的成员更新分数。所以在命令中指定的成员有相同的分数将不被计算在内。注在通常情况下ZADD返回值只计算新添加成员的数量。INCR: 当ZADD指定这个选项时成员的操作就等同ZINCRBY命令对成员的分数进行递增操作。ZCARD key获取一个排序集合中的成员数量ZCOUNT key min max返回分数范围内的成员数量ZINCRBY key increment member将一名成员的评分增加incrementZRANGE key start stop [WITHSCORES]返回有序集 key 中指定区间内的成员。其中成员的位置按 score 值递增(从小到大)来排序。具有相同 score 值的成员按字典序(lexicographical order )来排列。ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count]返回有序集 key 中所有 score 值介于 min 和 max 之间(包括等于 min 或 max )的成员。有序集成员按 score 值递增(从小到大)次序排列。具有相同 score 值的成员按字典序(lexicographical order)来排列(该属性是有序集提供的不需要额外的计算)。可选的 LIMIT 参数指定返回结果的数量及区间(就像SQL中的 SELECT LIMIT offset, count )注意当 offset 很大时定位 offset 的操作可能需要遍历整个有序集此过程最坏复杂度为 O(N) 时间。可选的 WITHSCORES 参数决定结果集是单单返回有序集的成员还是将有序集成员及其 score 值一起返回。该选项自 Redis 2.0 版本起可用。ZRANK key member返回有序集 key 中成员 member 的排名。其中有序集成员按 score 值递增(从小到大)顺序排列。排名以 0 为底也就是说 score 值最小的成员排名为 0 。ZREM key member [member …]移除有序集 key 中的一个或多个成员不存在的成员将被忽略。当 key 存在但不是有序集类型时返回一个错误。ZREMRANGEBYRANK key start stop移除有序集 key 中指定排名(rank)区间内的所有成员。区间分别以下标参数 start 和 stop 指出包含 start 和 stop 在内。下标参数 start 和 stop 都以 0 为底也就是说以 0 表示有序集第一个成员以 1 表示有序集第二个成员以此类推。你也可以使用负数下标以 -1 表示最后一个成员 -2 表示倒数第二个成员以此类推。ZREMRANGEBYSCORE key min max移除有序集 key 中所有 score 值介于 min 和 max 之间(包括等于 min 或 max )的成员。自版本2.1.6开始 score 值等于 min 或 max 的成员也可以不包括在内详情请参见 ZRANGEBYSCORE 命令。ZREVRANGE key start stop [WITHSCORES]返回有序集 key 中指定区间内的成员。其中成员的位置按 score 值递减(从大到小)来排列。具有相同 score 值的成员按字典序的逆序(reverse lexicographical order)排列。除了成员按 score 值递减的次序排列这一点外 ZREVRANGE 命令的其他方面和 ZRANGE 命令一样。ZREVRANGEBYSCORE key max min [WITHSCORES] [LIMIT offset count]返回有序集 key 中 score 值介于 max 和 min 之间(默认包括等于 max 或 min )的所有的成员。有序集成员按 score 值递减(从大到小)的次序排列。具有相同 score 值的成员按字典序的逆序(reverse lexicographical order )排列。除了成员按 score 值递减的次序排列这一点外 ZREVRANGEBYSCORE 命令的其他方面和 ZRANGEBYSCORE 命令一样。ZREVRANK key member返回有序集 key 中成员 member 的排名。其中有序集成员按 score 值递减(从大到小)排序。排名以 0 为底也就是说 score 值最大的成员排名为 0 。使用 ZRANK 命令可以获得成员按 score 值递增(从小到大)排列的排名。ZSCORE key member返回有序集 key 中成员 member 的 score 值。如果 member 元素不是有序集 key 的成员或 key 不存在返回 nil 。ZUNIONSTORE destination numkeys key [key …] [WEIGHTS weight [weight …]] [AGGREGATE SUM|MIN|MAX]计算给定的一个或多个有序集的并集其中给定 key 的数量必须以 numkeys 参数指定并将该并集(结果集)储存到 destination 。默认情况下结果集中某个成员的 score 值是所有给定集下该成员 score 值之 和 。ZINTERSTORE destination numberkeys key1 [key2…] [WEIGHTS weight] [SUM|MIN|MAX]计算给定的numkeys个有序集合的交集并且把结果放到destination中。 在给定要计算的key和其它参数之前必须先给定key个数(numberkeys)。默认情况下结果中一个元素的分数是有序集合中该元素分数之和前提是该元素在这些有序集合中都存在。因为交集要求其成员必须是给定的每个有序集合中的成员结果集中的每个元素的分数和输入的有序集合个数相等。如果destination存在就把它覆盖。
1.6 地理空间GEO
Redis GEO 主要用于存储地理位置信息并对存储的信息进行操作包括 添加地理位置的坐标。 获取地理位置的坐标。 计算两个位置之间的距离。 根据用户给定的经纬度坐标来获取指定范围内的地理位置集合。 地球上的地理位置是使用二维的经纬度表示经度范围 (-180, 180]纬度范围 (-90, 90]只要我们确定一个点的经纬度就可以名取得他在地球的位置。 将三维的地球变为二维的坐标再将二维的坐标转换为一维的点块最后将一维的点块转换为二进制再通过base32编码。
如何获取某个地址的经纬度 https://api.map.baidu.com/lbsapi/getpoint/
常用命令
命令说明GEOADD key longitude latitude member [longitude latitude member …]将指定的地理空间位置纬度、经度、名称添加到指定的key中。这些数据将会存储到sorted set这样的目的是为了方便使用GEORADIUS或者GEORADIUSBYMEMBER命令对数据进行半径查询等操作。GEOHASH key member [member …]时间复杂度O(log(N)) for each member requested, where N is the number of elements in the sorted set.返回一个或多个位置元素的 Geohash 表示。通常使用表示位置的元素使用不同的技术使用Geohash位置52点整数编码。由于编码和解码过程中所使用的初始最小和最大坐标不同编码的编码也不同于标准。此命令返回一个标准的Geohash在维基百科和geohash.org网站都有相关描述GEOPOS key member [member …]从key里返回所有给定位置元素的位置经度和纬度。GEODIST key member1 member2 [unit]返回两个给定位置之间的距离。如果两个位置之间的其中一个不存在 那么命令返回空值。指定单位的参数 unit 必须是以下单位的其中一个m 表示单位为米。km 表示单位为千米。mi 表示单位为英里。ft 表示单位为英尺。如果用户没有显式地指定单位参数 那么 GEODIST 默认使用米作为单位。GEORADIUS key longitude latitude radius m|km|ft|mi [WITHCOORD] [WITHDIST] [WITHHASH] [COUNT count]以给定的经纬度为中心 返回键包含的位置元素当中 与中心的距离不超过给定最大距离的所有位置元素。范围可以使用以下其中一个单位m 表示单位为米。km 表示单位为千米。mi 表示单位为英里。ft 表示单位为英尺。GEORADIUSBYMEMBER key member radius m|km|ft|mi [WITHCOORD] [WITHDIST] [WITHHASH] [COUNT count]这个命令和 GEORADIUS 命令一样 都可以找出位于指定范围内的元素 但是 GEORADIUSBYMEMBER 的中心点是由给定的位置元素决定的 而不是像 GEORADIUS 那样 使用输入的经度和纬度来决定中心点指定成员的位置被用作查询的中心。
处理中文显式乱码 使用 rwa参数
redis -cli --raw1.7 基数统计HyperLogLog
HyperLogLog 是用来做基数统计的算法HyperLogLog 的优点是在输入元素的数量或者体积非常非常大时计算基数所需的空间总是固定且是很小的。 在 Redis 里面每个 HyperLogLog 键只需要花费 12 KB 内存就可以计算接近 2^64 个不同元素的基 数。这和计算基数时元素越多耗费内存就越多的集合形成鲜明对比。 但是因为 HyperLogLog 只会根据输入元素来计算基数而不会储存输入元素本身所以 HyperLogLog 不能像集合那样返回输入的各个元素。
需求 统计某个网站、某篇文章的UVUNIQUE VISITOR
功能 一种去重复后的真实个数的数据集。
常用命令
命令说明PFADD key element [element …]将除了第一个参数以外的参数存储到以第一个参数为变量名的HyperLogLog结构中.PFCOUNT key [key …]当参数为一个key时,返回存储在HyperLogLog结构体的该变量的近似基数如果该变量不存在,则返回0.PFMERGE destkey sourcekey [sourcekey …]将多个 HyperLogLog 合并merge为一个 HyperLogLog 合并后的 HyperLogLog 的基数接近于所有输入 HyperLogLog 的可见集合observed set的并集.
1.8 位图bitmap
由0和1状态表现的二进制位的bit数组
需求 每日签到、上下班打卡
常用命令
命令说明SETBIT key offset value设置或者清空key的value(字符串)在offset处的bit值。GETBIT key offset返回key对应的string在offset处的bit值 当offset超出了字符串长度的时候这个字符串就被假定为由0比特填充的连续空间。当key不存在的时候它就认为是一个空字符串所以offset总是超出范围然后value也被认为是由0比特填充的连续空间。到内存分配。STRLEN key返回key的string类型value的长度。如果key对应的非string类型就返回错误。BITCOUNT key [start end]统计字符串被设置为1的bit数.一般情况下给定的整个字符串都会被进行计数通过指定额外的 start 或 end 参数可以让计数只在特定的位上进行。BITOP operation destkey key [key …]对一个或多个保存二进制位的字符串 key 进行位元操作并将结果保存到 destkey 上。
应用场景
1.9 位域bitfield
通过bitfield命令可以一次性操作多个比特位域(指的是连续的多个比特位)它会执行一系列操作并返回一个响应数组这个数组中的元素对应参数列表中的相应操作的执行结果。 说白了就是通过bitfield命令我们可以一次性对多个比特位域进行操作。
将一个Redis字符串看作是一个由二进制位组成的数组并能对变长位宽和任意没有字节对齐的指定整型位域进行寻址和修改。
1.10 流Stream
Redis Stream 是 Redis 5.0 版本新增加的数据结构。 Redis Stream 主要用于消息队列MQMessage QueueRedis 本身是有一个 Redis 发布订阅 (pub/sub) 来实现消息队列的功能但它有个缺点就是消息无法持久化如果出现网络断开、Redis 宕机等消息就会被丢弃。 简单来说发布订阅 (pub/sub) 可以分发消息但无法记录历史消息。 而 Redis Stream 提供了消息的持久化和主备复制功能可以让任何客户端访问任何时刻的数据并且能记住每一个客户端的访问位置还能保证消息不丢失。
Stream结构
1Message Content消息内容2Consumer group消费组通过XGROUP CREATE 命令创建同一个消费组可以有多个消费者3Last_delivered_id游标每个消费组会有个游标 last_delivered_id任意一个消费者读取了消息都会使游标 last_delivered_id 往前移动。4Consumer消费者消费组中的消费者5Pending_ids消费者会有一个状态变量用于记录被当前消费已读取但未ack的消息Id如果客户端没有ack这个变量里面的消息ID会越来越多一旦某个消息被ack它就开始减少。这个pending_ids变量在Redis官方被称之为 PEL(Pending Entries List)记录了当前已经被客户端读取的消息但是还没有 ack (Acknowledge character确认字符它用来确保客户端至少消费了消息一次而不会在网络传输的中途丢失了没处理
队列常用命令
命令说明XADD key ID field string [field string …]将指定的流条目追加到指定key的流中。 如果key不存在作为运行这个命令的副作用将使用流的条目自动创建key。XRANGE key start end [COUNT count]此命令返回流中满足给定ID范围的条目。范围由最小和最大ID指定。所有ID在指定的两个ID之间或与其中一个ID相等闭合区间的条目将会被返回。XRANGE命令有许多用途返回特定时间范围的项目。这是可能的因为流的ID与时间相关。增量迭代流每次迭代只返回几个项目。但它在语义上比SCAN函数族强大很多。从流中获取单个条目提供要获取两次的条目的ID作为查询间隔的开始和结束。该命令还有一个倒序命令以相反的顺序返回项目叫做XREVRANGE除了返回顺序相反以外它们是完全相同的。XREVRANGE此命令与XRANGE完全相同但显著的区别是以相反的顺序返回条目并以相反的顺序获取开始-结束参数在XREVRANGE中你需要先指定结束ID再指定开始ID该命令就会从结束ID侧开始生成两个ID之间或完全相同的所有元素。因此例如要获得从较高ID到较低ID的所有元素可以使用XREVRANGE -XDEL从指定流中移除指定的条目并返回成功删除的条目的数量在传递的ID不存在的情况下 返回的数量可能与传递的ID数量不同。XLEN返回流中的条目数。如果指定的key不存在则此命令返回0就好像该流为空。 但是请注意与其他的Redis类型不同零长度流是可能的所以你应该调用TYPE 或者 EXISTS 来检查一个key是否存在。XTRIMXTRIM将流裁剪为指定数量的项目如有需要将驱逐旧的项目ID较小的项目。此命令被设想为接受多种修整策略但目前只实现了一种即MAXLEN并且与XADD中的MAXLEN选项完全相同。XREAD从一个或者多个流中读取数据仅返回ID大于调用者报告的最后接收ID的条目。此命令有一个阻塞选项用于等待可用的项目类似于BRPOP或者BZPOPMIN等等。
消费常用命令
命令说明XGROUP [CREATE key groupname id-or-$] [SETID key id-or-$] [DESTROY key groupname] [DELCONSUMER key groupname consumername]该命令用于管理流数据结构关联的消费者组。使用XGROUP你可以创建与流关联的新消费者组。销毁一个消费者组。从消费者组中移除指定的消费者。将消费者组的最后交付ID设置为其他内容。要创建一个新的消费者组请使用以下格式XGROUP CREATE mystream consumer-group-name $XREADGROUP GROUP group consumer [COUNT count] [BLOCK milliseconds] STREAMS key [key …] ID [ID …]XREADGROUP命令是XREAD命令的特殊版本支持消费者组。在阅读本页之前你可能必须先理解XREAD命令才有意义。XPENDING通过消费者组从流中获取数据而不是确认这些数据具有创建待处理条目的效果。这在XREADGROUP命令中已有详尽的说明在我们的Redis Streams介绍中更好。XACK命令会立即从待处理条目列表PEL中移除待处理条目因为一旦消息被成功处理消费者组就不再需要跟踪它并记住消息的当前所有者。XACKXACK命令用于从流的消费者组的待处理条目列表简称PEL中删除一条或多条消息。 当一条消息交付到某个消费者时它将被存储在PEL中等待处理 这通常出现在作为调用XREADGROUP命令的副作用或者一个消费者通过调用XCLAIM命令接管消息的时候。 待处理消息被交付到某些消费者但是服务器尚不确定它是否至少被处理了一次。 因此对新调用XREADGROUP来获取消费者的消息历史记录比如用0作为ID将返回此类消息。 类似地待处理的消息将由检查PEL的XPENDING命令列出。 1.11 Redis常用命令
命令说明keys *查看当前库所有的keyexists key判断某刻key是否存在type key查看key的类型del key删除指定的keyunlink key非阻塞删除仅仅将key从keyspace元数据中删除真正的删除会在后续异步执行ttl key查看还有多少表过期-1表示永不过期-2表示已过期expire key 秒设置key多少秒后过期pexpire 毫秒设置key多少毫秒后过期expireat 秒时间戳格式设置key什么时候过期pexpireat 毫秒时间戳格式设置key什么时候过期move key dbindex[0-15]将当前库的key移动到指定库中select dbindex[0-15]切换数据库[0-15]默认为0单例模式redis会一次性创建16个库集群模式下只有一个库db0dbsize查看当前库的key数量flushdb清空当前库flushall清空所有库
Redis常用命令查询网址 中文 http://www.redis.cn/commands.html 英文 https://redis.io/commands 命令参考 http://doc.redisfans.com/index.html 命令不区分大小写Key是大小写敏感的 永远的帮助命令 help类型 例如help string