文章目录
Redis的概述
- Redis (Remote Dictionary Server)即远程字典服务,是单线程的多路IO复用
- 是一个开源的内存数据结构存储,用作数据库、缓存、消息代理
- Redis 是用ANSI C编写的,推荐使用Linux进行部署。Windows版本没有官方支持。
- NoSql:no only sql(不仅仅是sql),泛指非关系型数据库,没有固定的查询语言
Redis能干嘛?
-
内存存储,持久化(rdb,aof)
-
效率高,可以用于高速缓存
-
发布订阅系统
-
地图信息分析
-
计时器、计数器(浏览量)
Redis命令
通用命令
-
**select <数字> :**切换库,redis默认有16个库,默认进入0号库
-
**dbsize :**查看当前数据库的key的数量
-
del … : 删除指定的key数据
-
type : 查看你的key是什么类型
-
expire <数字>(以秒为单位): 给指定的key设置过期的时间
-
ttl : 查看key还有多少秒过期,-1表示永不过期,-2表示已过期
-
**flushdb :**清空数据库
-
**flushall :**通杀数据库
-
clear :清屏命令
-
keys * : 查看当前库所有key 可使用? *模糊查询
一、字符串
-
set [ex |px |EXAT |PXAT |KEEPTTL] [NX|XX] [GET]]:
新建key
,如果 key 已经保存了一个值,则无论其类型如何,都会将其覆盖(返回值:OK
) 在成功的set操作时,将丢弃与该键关联的任何先前的生存时间
可选操作:
value
后加上xx
时只会对已经存在的key
进行设置操作,如果key
不存在返回nil
—
nx
:仅当不存在时才设置它 —
ex
:设置指定的过期时间,以秒为单位 —
px
:设置指定的过期时间,以毫秒为单位 —
keepttl
:保留与key
关联的生存时间 —
get
:返回存储在key
中的旧字符串 注意:由于
set
命令选项可以替换setnx
、setex
、psetex
、getset
,因此在未来的 Redis 版本中,这些命令可能会被弃用 并最终被删除。 -
setnx :
只有在key
不存在时,设置key
的值 (命令在设置成功时返回1
,设置失败时返回0
) -
setex :
将key
的值设置为value
,并将key
的生存时间设置为seconds
秒钟。
setex
是一个原子性操作,它可以在同一时间内完成设置和设置过期时间这两个操作
如果key
已存在,那么setex
命令将覆盖已有的值
(扩展:seconds
是秒
的意思) -
psetex <毫秒> :
这个命令和
setex
命令相似,但它是以毫秒
为单位设置key
的生存时间,而不是像setex
命令那样以秒
为单位进行设置,命令在设置成功时返回OK
-
get :
查询对应键值,如果
key
不存在,那么返回特殊值nil
;否则返回key
的值 如果
key
的值并非字符串类型,那么返回一个错误,因为get
命令只能用于字符串值 -
getset :
将key
的值设置为value
,并返回key
在被设置之前的旧值
如果key
没有旧值,也就是说,key
在设置之前并不存在,那么命令返回nil
当key
存在但不是字符串类型时,命令返回一个错误 -
mset … :
同时为多个键设置值,如果某个键已经存在,那么mset
将使用新值覆盖旧值
如果这不是你所希望的效果,请考虑使用msetnx
,这个命令只会在所有给定键都不存在的情况下进行设置
mset
是一个原子性操作(有一个失败,则都失败),所有给定键都会在同一时间内被设置,不会出现某些键被设置了但是 另 一些键没有被设置的情况
mset
命令总是返回OK
-
mget … :
返回给定的一个或多个字符串键的值
如果给定的字符串键里面,有某个键不存在,那么这个键将以特殊值nil
表示
mget
命令将返回一个列表,列表中包含了所有给定键的值 -
setrange :
从偏移量offset
开始,用value
参数覆写key
储存的字符串值,如果key
原来储存的字符串长度比偏移量小,那么原字符和 偏移量之间的空白将用0
字节(\x00
)进行填充
不存在的key
当作空白字符串处理,不可用负数
(扩展:offset
名词是开端
的意思) -
getrange :
返回 key
的字符串值的指定部分,字符串的截取范围由 start
和 end
两个偏移量决定
索引从 0
开始, 0
表示第一个字符 负数偏移量
表示从字符串的末尾开始计数,-1
表示最后一个字符
- append :
将给定的追加到原值的末尾,若key不存在,则会新建key(返回值:附加value之后,key的值的长度) - incr :
将key
中存储的数字值增1
(只能对数字值操作),如果key
不存在,那么它的值会先被初始化为0
,然后再执行incr
命令 (返回值:key
在执行加1
操作之后的值) - decr :
将key
中存储的数字值减1
(只能对数字值操作),如果key
不存在,那么它的值会先被初始化为0
,然后再执行decr
命令 (返回值:key
在执行减1
操作之后的值) - incrby <步长(n)> :
将key
中存储的数字值增加n
,如果key不存在,那么它的值会先被初始化为0
,然后再执行incrby
命令
如果key
存储的值不能被解释为数字,那么返回一个错误 - incrbyfloat <步长> :
同上,可以增加整数也可以增加浮点数如(5.5,4.2),而incrby
使用浮点数则会报错 - decrby <步长(n)> :
将key
中存储的数字值减n
,如果key
不存在,那么它的值会先被初始化为0
,然后再执行decrby
命令
如果key
存储的值不能被解释为数字,那么返回一个错误 - strlen :
获取key
存储的字符串值的长度,当key
不存在时,命令返回0
如果key
的值并非字符串类型,那么返回一个错误 - exists :
判断某个key
是否存在
二、列表
-
lpush/rpush … :
lpush
将一个或多个value
从左到右插入到列表key
的表头,注意,采用头插法的方式插入数据
rpush
采用从右到左,采用尾插法 当
key
存在但不是列表类型时,返回一个错误 -
lpushx/rpushx … :
与 lpush
/rpush
相反,只对 key
存在并且是个列表时才执行设置操作,如果 key
不存在,则什么也不做
- lrange
:
返回列表 key
中指定区间的元素,区间以偏移量 start
和 stop
指定
0
表示第一个元素, 1
表示第二个元素,你也可以使用负数下标,-1
表示最后一个元素, -2
表示倒数第二个元素
超出范围的下标值不会引起错误,如果 start
下标比列表的最大下标(end)还要大,那么 lrange
返回一个空列表
如果 stop
下标比 end
下标还要大, redis
将 stop
的值设置为 end
- lpop/rpop [n]:
lpop
:移除并返回列表 key
的 n
个头元素,当 key
不存在时,返回 nil
,当值被移除完,则 key
不再存在
rpop
:移除并返回列表 key
的 n
个尾元素,当 key
不存在时,返回 nil
,值在键在,值光键亡。
返回值是被移除的元素
- rpoplpush :
将列表 key1
的尾元素移除并添加到列表 key2
的头部,作为列表 key2
的头元素
如果key1或key2不存在,值nil会被返回,并且不执行其他操作
如果key1 和 key2 相同,则列表中的表尾元素将会被移动到表头,并返回该元素
- llen :
返回列表key的长度,如果key不存在,则key被解释为一个空列表,返回0
如果key不是列表类型,返回一个错误
- lrem :
根据参数count,移除count个列表中与参数value相等的元素
count>0:表示从表头开始向表尾搜索,移除count个列表中与参数value相等的元素
count<0:表示从表尾开始向表头搜索,移除count(绝对值)个列表中与参数value相等的元素
count=0:表示移除表中所有与value相等的值
返回值是被移除元素的数量;当key不存在时,会被视为空表,lrem命令总是返回0
- lindex :
返回列表key中,下标为index的元素
0表示第一个元素,-1表示最后一个元素,如果key不是列表类型,则返回一个错误
如果index参数的值不在列表的区间范围内,,返回nil
- linsert Before|After :
将值value2 插入到列表key中,位于值value2 之前或之后,插入成功后返回操作之后列表的长度
当value1不存在于列表key时,不执行操作,返回-1
key不存在时视为空列表,不执行任何操作,返回0;key不是列表类型时,返回一个错误
(如果列表中有多个value1,从头元素开始向尾元素查找,以第一个找到的value1为准,并不会每个value1前或后都插入)
- lset :
将列表key下标为index的值设置为value
当index参数超出范围,或对一个空列表(key不存在)进行lset时,返回一个错误
- ltrim
:
只保留列表key [start,stop] 这个区间的值,其余元素全部删除,当key不是列表类型时,返回一个错误
超出范围的下标值不会引起错误
如果start的值比列表的最大下标end还要大,或者大于stop,那么整个列表都会被清空,返回一个空列表
如果stop的值比end还要大,redis会将stop的值设置为end
三、set无序集合(元素可重复)
- sadd … :
将一个或多个member元素加入到集合key中,已经存在集合中的元素将被忽略
当key不是集合类型时,返回一个错误
- sismember :
判断member元素是否key集合的成员,是 返回1 ,否或key不存在 返回0
- spop [count] :
移除并返回集合中的一个随机元素
- srandmember [count] :
如果只提供key参数,那么返回集合中的一个随机元素,如果集合为空,返回空数组
如果count为正数,返回一个元素不重复的数组,如果conut大于等于集合基数,那么返回整个集合
如果count为负数,那么返回一个元素可能会重复多次的数组,而数组的长度为count的绝对值
- srem … :
移除集合key中的一个或多个元素,不存在的member元素会被忽略,key不是集合类型时,返回一个错误
- smove :
将memder元素从source集合移动到destination集合,smove是原子性操作
当destination集合中已包含memder元素,smove只是简单地将source集合中的memder元素删除
当source或destination不是集合类型时,返回一个错误
- scard :
返回集合key的基数(集合中元素的数量),当key不存在时返回0
- smembers :
返回集合key 中的所有成员,不存在的key视为空集合
- sinter [key] … :
返回一个集合的全部成员,如果给定多个集合,是返回所有给定集合的交集,不存在的key被视为空集(当然,结果也是空集)
- sinterstore [key] … :
这个命令类似于sinter,但它将结果保存到destination集合,而不是简单地返回结果集
如果destination集合已经存在,则将其覆盖,destination也可以是key本身
- sunion [key] … :
返回一个集合的全部成员,该集合是所有给定集合的并集,不存在的key被视为空集
- sunionstore [key] … :
这个命令类似于sunion,但它将结果保存到destination集合,而不是简单地返回结果集
如果destination集合已经存在,则将其覆盖,destination也可以是key本身
- sdiff [key2] … :
返回一个集合的全部成员,该集合是所有给定集合的差集(key1 中的,不包含key2 中的),不存在的key被视为空集
- sdiffstore [key] … :
这个命令类似于sdiff,但它将结果保存到destination集合,而不是简单地返回结果集
如果destination集合已经存在,则将其覆盖,destination也可以是key本身
四、哈希表
- hset [field value] … :
将哈希表key(hash)中域field的值设置为value
- hsetnx [field value] … :
仅在域field尚未存在域哈希表hash的情况下将它的值设置为value,如果已存在,则放弃操作
- hget :
返回哈希表hash给定域field中的值
- hexists :
判断给定域field 是否存在于哈希表hash 中
- hdel [field] … :
删除哈希表hash 中的一个或多个指定域,不存在的域将被忽略
- hlen :
返回哈希表 key 中域的数量
- hstrlen :
返回哈希表key中,与给定域相关联的值的字符串长度
- hincrby :
为哈希表key
中的域field
的值加上增量 increment
,增量也可以为负数,相当于对给定域进行减法操作
如果 key
不存在,一个新的哈希表 key
被创建并执行 hincrby
命令
如果域 field
不存在,那么在执行命令前,域 field
的值被初始化为 0
对一个储存字符串值的域 field
执行 hincrby
命令将造成一个错误
- hincrbyfloat :
为哈希表 key
中的域 field
加上浮点数增量 increment
- hmget [field] … :
返回哈希表 key
中一个或多个给定域 field
的值
- hkeys :
返回哈希表 key
中所有的域
- hvals :
返回哈希表 key
中所有域的值
- hgetall :
返回哈希表 key
中所有的域和值
- hdel [field] … :
从哈希表 key
中删除指定的域 field
,不存在的指定域将被忽略
五、有序集合(元素不可重复)
- zadd [score member] … :
将一个或多个 member
元素及其 score
值加入到有序集 key
当中
- zscore :
返回有序集 key
中成员 member
的 score
值
- zincrby :
为有序集 key
的成员 member
的 score
值加上增量 increment
,也可传递负数值
(可传递双精度浮点数)
如果 key
不存在或 member
不是 key
中的成员时,会先创建 key
或 member
再进行 zincrby
命令
- zcard :
返回有序集 key
的基数
- zcount :
返回有序集 key
中,score
值在 min
和 max
之间(默认包括 score
值等于 min
或 max
)的成员的数量
- zrange
【withscores】:
返回有序集 key
中指定区间内的成员,成员的位置按照 score
值递增(从小到大)来排序
可以通过使用 withscores
选项,来让成员和它的 score
值一并返回
- zrevrange
【withscores】 :
除了成员的位置是按照 score
值递减(从大到小)来排序,其他功能域 zrange
命令一样
- zrangebyscore|zrevrangebyscore 【withscores】【limit 】:
返回有序集key
中,所有 score
值介于min
和 max
之间(默认包括等于 min
和 max
)的成员。
通过在参数前增加 (
符号来使用可选的开区间
有序集成员按 score
值递增(zrangebyscore)或递减(zrevrangebyscore)排序
可选的 limit
参数指定返回结果的区间
min
和 max
的值可以时 -inf
和 +inf
,这样你就可以在有序集的最低和最高 score
值的情况下使用zrangebyscore
这条命令
- zrank :
返回有序集 key
中成员 member
的排名,其中有序集成员按 score
值递增排序,排名从 0
开始,也就是说,score
值最小的 成员排名为 0
- zrevrank :
返回有序集 key
中成员 member
的排名,其中有序集成员按 score
值递减排序,排名从 0
开始,也就是说,score
值最大的成 员排名为 0
- zrem [member] … :
移除有序集 key
中的一个或多个成员,不存在的成员将被忽略
- zremrangebyrank
:
移除有序集 key
中,指定排名(rank)区间内的所有成员
0
表示第一个,-1
表示最后一个 (包含 start
和 stop
)在内
- zremrangebyscore :
移除有序集 key
中,所有**score
**值介于min
和 max
(默认包括等于min
和 max
)的成员
通过在参数前增加( 符号来使用可选的开区间
- zlexcount :
对于一个所有成员的分值都相同的有序集合key
来说,这个命令会返回该集合中,成员介于 min
和 `max 范围内的元素数量
(合法的 min
和 max
必须携带 [
或 (
来表明闭区间或开区间)
特殊值 -
和 +
在min
参数以及 max
参数中具有特殊的意义,其中 +
表示正无限 -
表示负无限
- zremrangebylex :
对于一个所有成员的分值都相同的有序集合 key
来说,这个命令会移除该集合中,成员介于 min
和 max
范围内的所有元素
- zunionstore [key …] [weights [weight …]] [aggregate [sum|min|max]] :
计算给定的一个或多个有序集的并集,其中给定 key
的数量必须以 numkeys
参数指定,并将该并集(结果集)储存到 destination
默认情况下,结果集中某个成员的 score
值是所有给定集下该成员 score
值之 和
使用 WEIGHTS
选项,你可以为 每个 给定有序集 分别 指定一个乘法因子,每个给定有序集的所有成员的 score
值在传递给聚合函 数之前都要先乘以该有序集的因子。如果没有指定 WEIGHTS
选项,乘法因子默认设置为 1
使用 AGGREGATE
选项,你可以指定并集的结果集的聚合方式,默认使用的参数 SUM
,可以将所有集合中某个成员的 score
值之 和 作为结果集中该成员的 score
值;使用参数 MIN
,可以将所有集合中某个成员的 最小 score
值作为结果集中该成员的 score
值;而参数 MAX
则是将所有集合中某个成员的 最大 score
值作为结果集中该成员的 score
值。
- zinterstore [key …] [weights [weight …]] [aggregate [sum|min|max]] :
计算给定的一个或多个有序集的交集,其余功能与 zunionstore
命令一致
六、Bitmaps
- setbit :
设置或清除存储在key
的 字符串值 中 offset
的位(bit
)
位的设置或清除 取决于value
的参数,可以是 0
也可以是 1
offset
参数必须大于或等于 0
字符串会进行伸展以确保它可以将 value
保存在指定的偏移量上,当字符串值进行伸展时,空白位置以0
填充
- getbit :
返回存储在 key
的字符串值中 offset
处的位值
当 offset
比字符串值的长度大,或者 key
不存在时,返回 0
。
- bitcount [start] [end] :
计算给定字符串 key
中,被设置为 1
的 位数
通过指定额外的 start
或 end
参数,可以让计数只在特定的区间进行
- bitpos [start] [end] :
返回位图中第一个值为 bit
的二进制位的位置
通过可选的 start
参数和 end
参数指定要检测的范围
- bitop [key …] :
在多个键key 之间执行按位运算并将结果存储在目标键destkey中
BITOP AND destkey key [key ...]
,对一个或多个 key
求逻辑并,并将结果保存到 destkey
。
BITOP OR destkey key [key ...]
,对一个或多个 key
求逻辑或,并将结果保存到 destkey
。
BITOP XOR destkey key [key ...]
,对一个或多个 key
求逻辑异或,并将结果保存到 destkey
。
BITOP NOT destkey key
,对给定 key
求逻辑非,并将结果保存到 destkey
。
除了 NOT
操作之外,其他操作都可以接受一个或多个 key
作为输入。
**处理不同长度的字符串:**当 bitop
处理不同长度的字符串时,较短的那个字符串所缺少的部分会被看作 0
**返回值:**保存到 destkey
的字符串的长度,和输入的 key
中最长的字符串长度相等
七、HyperLogLog (值不能重复)
- pfadd [element …] :
将任意数量的元素添加到指定的 HyperLogLog
里面
调用 pfadd
命令时可以只给定键名而不给定元素
·····如果给定的键 key
已经是一个 HyperLogLog
,那么这种调用不会产生任何效果
····如果给定的键 key
不存在,那么命令会创建一个空的 HyperLogLog
,并向客户端返回 1
返回值: 如果 HyperLogLog
的内部储存被修改了,那么返回 1
,否则返回 0
- pfcount [key …] :
返回一个或多个键的 基数(有点像求并集的意思)
- pfmerge [sourcekey …] :
将多个 HyperLogLog
合并为一个 HyperLogLog
, 合并得出的 HyperLogLog
会被储存在 destkey
键里面
八、Geo (地理位置)
- geoadd [xx|nx] [ch] [longitude latitude member …] :
将给定的空间元素 经度(longitude)
、纬度(latitude)
、名字(member)
添加到指定的键 key
里面
geoadd
命令以标准的 x,y
格式接收参数,所以用户必须先输入经度
,然后再输入纬度
。
geoadd
能够记录的坐标是有限
的:非常接近两极的区域
是无法被索引
的
—有效的经度介于 -180
度至 180
度之间。
—有效的纬度介于 -85.05112878
度至 85.05112878
度之间。
注意: 没有 geodel
命令,因为您可以使用 zrem
删除元素 ,Geo索引结构只是一个排序集
geoadd
还提供以下选项: Redis 版本 >= 6.2.0
:添加了 CH
、NX
和 XX
选项。
— xx
:只更新已经存在的元素。永远不要添加新元素
— nx
:不要更新已经存在的元素。总是添加新元素。
— ch
:将返回值从添加的新元素数修改为已更改的(添加或更新)元素数
返回值:
— 当不使用可选参数时,添加到排序集中的元素数量(不包括分数更新)。
— 如果使用可选参数 ch
时,则为已更改(添加或更新)的元素数。
- geopos [member …] :
从键 key
里面返回所有给定位置元素的位置(经度和纬度)
- geodist [unit] :
返回两个给定位置之间的距离,如果两个位置之间的其中一个不存在,那么命令返回空值
指定单位的参数 unit
必须是以下单位的其中一个:
— m
表示单位为 米
(默认值)
— km
表示单位为 千米
— mi
表示单位为 英里
— ft
表示单位为 英尺
- geohash [member …] :
返回一个或多个位置元素的 geohash
Redis 事务 锁机制 秒杀
redis事务提供了一种“将多个命令打包, 然后一次性、按顺序地执行”的机制, 并且事务在执行的期间不会主动中断 —— 服务器在执行完事务中的所有命令之后, 才会继续处理其他客户端的其他命令。
使用MULTI
命令输入 Redis 事务。该命令始终以 回复OK
。此时用户可以发出多个命令。Redis 不会执行这些命令,而是将它们排队。一旦调用EXEC
,所有命令都会执行。所以Redis中一个事务从开始到执行会经历 开始事务 、 命令入队 和 执行事务 三个阶段。
相反,调用DISCARD
将刷新事务队列并退出事务。
-
watch [key …] :
监视一个或多个
key
,如果在事务执行之前这个(或这些)key
被其他命令所改动,那么事务将被打断 -
unwatch
取消
WATCH
命令对所有key
的监视。如果在执行
WATCH
命令之后,EXEC
命令或DISCARD
命令先被执行了的话,那么就不需要再执行UNWATCH
了。
end…