Redis学习
文章目录
1. Redis-10大数据类型
数据类型是value的类型,key的类型都是String
数据类型是value的类型,key的类型都是String
数据类型是value的类型,key的类型都是String
命令不区分大小写,但key是区分大小写的
命令不区分大小写,但Key是区分大小写的
命令不区分大小写,但Key是区分大小写的
去官网查询操作数据类型的命令(commands)
永远的帮助命令:help @类型,可以查看指定数据类型的所有命令介绍
0. 常用操作
1. ttl key:查看剩余过期时间,以s返回
2. pttl key:以ms返回
3. config get 参数名:返回配置文件中指定参数的值
- 字符串(String)
- 介绍
- String字符串是redis最基本的数据类型
- key都是String类型
- 且是二进制安全的,可以包含任何数据(最多可以是512M)![[Pasted image 20241020140513.png]]
- 常用操作
- set key value
[键值] [返回值] [时间]
- SET指令不仅可以创建键值对,也可以更新键值对
- NX:当该键不存在时才创建(相当于初始化(只有第一次));XX:当该键以及存在时才会创建(相当于更新)
- GET:在添加之前先返回当前键的值,然后再添加
- EX、PX:设置当前键的存活时间,时间单位不同
- KEEPTTL:保留设置前指定键的生存时间,否则每次设置修改指定键后都是永不过期
- get key
- 获取指定键的值,不存在则返回nil
- 同时设置/获取多个键值 MSET / MGET
- MSET key value
[key value key value...]
- MGET key
[key key...]
- MSETNX key value
[key value...]
:必须整体全部生效,有一个不成功则全部不成功
- MSET key value
- 获取指定区间范围内的值 SETRANGE / GETRANGE
- GETRANGE key start end:对指定的键的String数据进行切片,类似substring,左闭右闭,且 0 -1 是返回整个字符串
- SETRANGE key offset value:对指定键的String从offset开始设置value
- 数值增减 INCR / DECR
- 指定键的值一定要是数字才可以加减
- 获取字符串长度 STRLEN key
- 内容追加 APPEND key value
- 分布式锁 SETNX / SETEX key time value
- 使用 setnx 命令来创建分布式数据,此时只会同时存在一份,当用完之后使用 del 删除,此时才可以继续创建,这样就可以保证某个数据只可同时存在一份,实现分布式
- SETEX key time value:将set和expire(设置过期时间)两个命令合为一个原子操作,也可以set key value ex time 来实现
- GETSET:先get再set,和set key value get 一样
- set key value
- 介绍
- 列表(List):单key多value
- 介绍
- List(ArrayList)是字符串列表,可以插入头部也可以插入尾部
- 底层是双端链表,在两端均可以进行插入和删除
- 单key多value,底层是双端链表
- 最多 2^32 - 1个元素
- 常用操作(命令不区分大小写)
- LPUSH / RPUSH / LRANGE
- LPUSH key v1 v2 v3是将输入的values依次从左端插入列表,此时顺序是v3 v2 v1倒序排列
- RPUSH key v1 v2 v3是将输入的values依次从右端插入列表,此时顺序是v1 v2 v3顺序排列
- LRANGE key start end:根据指定的顺序从左向右遍历列表中的所有元素,0 -1 表示返回所有元素,且遵循左闭右闭原则
- 没有RRANGE命令
- LPOP / RPOP
- LPOP key:将列表中最左端的元素弹出去
- RPOP key:将列表中最右端的元素弹出去
- LINDEX
- LINDEX key index:根据下标获得列表中的值
- LLEN:获取长度
- LLEN key:获取指定列表中元素个数
- LREM:删除k个指定元素
- LREM key n val:从列表中删除n个值为val的元素
- LTRIM:裁剪
- LTRIM key startIndex endIndex:将列表指定范围元素截取后再重新赋值给指定的列表
- 下标遵循左闭右闭
- RPOPLPUSH
- RPOPLPUSH list1 list2:将左边列表最后一个元素弹出RPOP加入到右边列表第一个中LPUSH
- 将两个命令合为一个原子操作
- LSET
- LSET key index value:修改列表指定下标位置的值,下标从0开始
- LINSERT
- LINSERT key before/after 已有值 新的值:在列表的指定已存在的值的前面/后面插入新的值
- LPUSH / RPUSH / LRANGE
- 介绍
- 哈希表(Hash)
- 介绍
- Map(HashMap)是一个string的field字段和value的KV映射表
- 哈希表的 value 是一个键值对:key {key:value} ~ Map< String, Map<> >
- 常用操作(命令不区分大小写)
- HSET / HGET / HMSET / HMGET / HGETALL / HDEL
- HSET key field value:对指定哈希表的某个字段赋值,不存在时就创建,存在时就修改,一次只可操作一个键值对;哈希表的value是一组键值对
- HGET key field:获取指定哈希表的指定字段的值
- HMSET key …:可以一次性为key插入多个字段和值
- HMGET key field1 field2…:可以一次性获取指定哈希表的多个字段的值
- HGETALL key:返回指定哈希表的所有字段以及值
- HDEL key field:删除哈希表的某个字段
- HLEN key
- HLEN key:返回哈希表的字段个数
- HEXISTS key field
- HEXISTS key field:判断指定哈希表中某个字段field是否存在,存在则返回1,不存在返回0
- HKEYS / HVALS
- HKEYS key:返回指定哈希表中所有的字段
- HVALS key:返回指定哈希表中所有的字段的值
- HINCRBY / HINCRFLOAT key field num
- HINCRBY key field num:对哈希表某个整数类型的字段+num
- 小数类型
- HSETNX key field value
- HSETNX key field value:当哈希表的某个字段不存在时才会对该字段赋值,存在时失败
- HSET / HGET / HMSET / HMGET / HGETALL / HDEL
- 介绍
- 集合(Set):无需无重复
- 介绍:类似HashSet的String集合,无序无重复
- Set(HashSet)是String类型的无序无重复,集合成员是唯一的,单key多value
- 通过哈希表实现,添加、删除和查找都是O(1)
- 常用操作(命令不区分大小写)
- SADD key member1 …
- SADD key member1 …:向集合中添加成员,可以同时添加多个,如果有重复则会自动删除
- SMEMBERS key
- 遍历指定集合中的所有元素
- SISMEMBER key member
- 判断某个元素是否在集合中
- SREM key member1 m…
- 删除指定集合中存在的元素,如果不存在则删除失败,可以同时删除多个
- SCARD key
- 返回指定集合中元素的个数
SRANDMEMBER key [数字]
- 从集合中随机展示指定数字个成员(默认1个),且不会删除成员,只是展示不会删除
- 只是随机展示集合中的元素,不会删除
SPOP key [count]
- 随机删除集合中的元素并展示,出一个删除一个
- 可以用来直接做抽奖小程序,直接随机弹出指定个数的元素
- SMOVE key1 key2 key1member
- 将第一个集合中的某个存在的元素移动到第二个集合中,且第一个集合的该元素会删除
- 集合运算:- ∪ ∩
- SDIFF 差集运算
- SDIFF key1 key2…:对指定的集合做差集运算,即key1 - key2(属于key1但不属于key2的元素),并返回结果集合
- SUNION 并集运算 ∪
- SUNION A B C…
- 将指定的所有集合做并集,并返回结果集合
- SINTER 交集运算 ∩
- SINTER A B C…:将指定的所有集合做交集运算,并返回结果集合
SINTERCARD numkeys k1 k2 [key...] [LIMIT limit]
- 对指定个数的集合做交集后,返回结果集合的个数,不是返回结果集,而是返回结果集合的个数
- SDIFF 差集运算
- SADD key member1 …
- 介绍:类似HashSet的String集合,无序无重复
- 有序集合(ZSet):有序无重复
- 介绍:和Set类型,但加了一个score
- 也是String类型元素集合,且有序无重复,通过关联一个分数score来进行排序
- 通过哈希表实现,添加、删除和查找都是O(1)
- 在SET集合的基础上,为每个value前加上一个score分数值,根据分数值对每个value排序即 ZSET key score value
- 常用操作(命令不区分大小写)
- ZADD key score1 value1…
- 向有序集合中加入元素,必须要指定元素value的score,要根据score对value进行排序
- ZRANGE key start end
[withscore]
- 返回有序集合中指定下标范围内的元素,可以设置带不带score
- ZREVERSE key
- 以翻转的方式返回指定范围元素
- 等价于ZRANGER key REV
- ZRANGEBYSCORE key min max
[withscore] [LIMIT limit]
- 根据指定的score范围返回元素
- 默认是左闭右闭,可以使用 (min 表示开
- ZSCORE key value
- 获取指定元素的分数
- ZCARD key
- 获取所有元素个数
- ZREM key member
- 根据元素的值删除集合中的元素
- ZINCRBY key incrScore value
- 对集合中指定元素的分数加上指定的数
- ZCOUNT key min max
- 对指定分数范围内的元素的个数进行统计
ZMPOP count key MIN|MAX [COUNT count]
- 从键名列表中的第一个非空排序集中弹出一个或多个元素
- ZRANK key value
- 获取指定元素的下标值,即排名数
- ZREVRANK key value
- 逆序获取指定元素的下标值,即倒数排名值
- ZADD key score1 value1…
- 介绍:和Set类型,但加了一个score
- 地理空间(GEO)
- 介绍:经纬度
- 底层使用的是redis的ZSET数据类型,相当于对某个位置value添加一个额外信息(经纬度):GEO key 经纬度 value
- 故可以使用ZSETRANGE key来得到GEO中的value,如果有中文乱码,则在启动redis-cli时添加 --raw 参数
- 存储地理位置信息(经纬度)
- 常用操作(命令不区分大小写)
- GEOADD key longitude latitude member
- 向GEO类型的key中添加一个位置的经纬度,使用member对位置进行命名,必须使用经纬度格式进行添加
- 用经纬度来标识地图上的某个点
- GEOPOS key value…
- 返回GEO中指定元素的经纬度
- GEOHASH key value
- 返回位置经纬度的hash编码,将二维数据转换为一维
- GEODIST key v1 v2 单位
- 以指定的单位返回GEO中存在的两处位置的距离
- GEORADIUS
- 在指定的GEO的集合中,返回距离以给定经纬度为中心的半径内的位置
- GEORADIUSBYMEMBER
- 和GEORADIUS一样,只不过不是显示输入经纬度,而是输入某个位置,要保证该集合内存在该位置
- GEOADD key longitude latitude member
- 介绍:经纬度
- 基数统计(HyperLogLog)
- 介绍:统计集合中不重复元素个数
- 统计UV(独立访客,一般是访问者IP),IP一样认为是同一个
- HyperLogLog是用来做基数统计的算法,基数就是去掉重复后的数字
- 基数统计就是统计一个集合中不重复的元素个数,就是去重脱水后的真实数据
- 只可以得到不重复元素个数,无法获得内部的元素
- 属于String类型的数据,不会保存数据,无法获得内部元素
- 根据数字的基数进行统计
- 常用操作(命令不区分大小写)
- PFADD key ele1 ele2…
- 将元素加入hyperLogLog中,其会进行去重操作
- PFCOUNT key
- 返回指定key中元素个数,去重后的元素个数
- PFMERGE key1 key2
- 将两个去重的HyperLogLog合并为一个不重复的HyperLogLog
- PFADD key ele1 ele2…
- 介绍:统计集合中不重复元素个数
- 位图(bitmap)
- 介绍:由0/1状态表现的二进制位的bit数组
- 用String类型作为底层数据结构实现的统计二值状态的数据类型
- 本质是数组,基于String类型的按位操作
- 用于状态统计
- 常用操作(命令不区分大小写)
- SETBIT key offset value
- 对指定的位图的第offset位置进行赋值value,位图的偏移量从0开始,值value只可以是 0 或者 1,其余会报错
- GETBIT key offset
- 获得指定位图指定偏移量上的元素值
- GET key
- 因为位图是基于String数据类型,故可以使用GET来获得位图的值,此时是将位图的每个二进制根据ASCII码来返回对应的字符,如果使用GETBIT则只返回二进制值,每8个bit形成一个ASCII码
- STRLEN key
- 统计占用了多少字节数,每8bit是一个字节,不是字符串长度
BITCOUNT key [start end]
- 返回位图指定范围内值为1的元素个数,不指定范围则返回所有的1
- BITOP oper destKey key1 key2
- 对给出的两个位图进行指定的位运算,并将结果保存到指定的destkey位图中
- SETBIT key offset value
- 介绍:由0/1状态表现的二进制位的bit数组
- 位域(bitfield)
- 介绍
- 进行位域修改和溢出控制
- 将一个Redis看做一个存放二进制位的数组
- 常用操作(命令不区分大小写)
- BITFEILD key GET TYPE offset
- 将字符串转换为二进制位数组,并根据类型和偏移量获取由type指定的位数![[Pasted image 20241021145811.png]]
- BITFIELD key SET TYPE offset value
- 将指定offset开始的由type指定的位数修改为指定的value
- BITFIELD key INCRBY TYPE OFFSET increment
- 将指定offset开始的指定的type中的bit位增加指定大小
- 默认使用WRAP循环移除参数,当溢出时会循环
- OVERFLOW(溢出控制)
- BITFEILD key GET TYPE offset
- 介绍
- 流(Stream)
- 介绍
- redis-stream就是redis版本的MQ消息队列
- redis的消息队列可以用list实现,支持点对点,但无法多对多,也可以用pub/sub(消息订阅/发布)来实现多对多,但无法持久化,会被丢弃,也无法保证可靠性
- 故引入Redis版的MQ消息中间件+阻塞队列:redis-stream
- 类似于消息中间件,提供了消息的持久化和主备复制功能
- 常用操作(命令不区分大小写)
- 队列相关指令
- XADD key id|* field value …
- 向消息队列中插入消息,必须要有指定的ID( * 是指使用默认生成的ID),后面跟着该消息的键值对
- 传入的ID必须由两部分组成:毫秒时间戳+当前毫秒中消息编号,以保证消息的ID唯一
- XRANGE key start end (count)
- 在指定的消息队列中获取指定范围内的消息,-代表最小值,+代表最大值
- ![[Pasted image 20241021140104.png]]
- XREVRANGE key end start
- 以倒序返回
- XDEL key ID
- 删除消息队列中指定ID的消息
- XLEN key
- 获得消息队列中总消息个数,只根据ID进行统计
- XTRIM
- XTRIM key maxlen count:将消息队列的最大长度的消息进行截取并覆盖之前的队列
- XTRIM key mindi id:根据传入的id作为最小值进行截取
- ![[Pasted image 20241021140547.png]]
- XREAD
- block time:阻塞读取,就是当没有时会一直阻塞指定的时间,直到读取成功或者时间结束,若设置time=0,则会无限期阻塞
- 默认非阻塞,就是如果有则读取,没有则直接返回,不会等待
- XADD key id|* field value …
- 消费组相关指令
- XGROUP CREATE key group id
- 为指定的Stream创建消费组,必须指定消费组开始消费的ID
- XREADGROUP GROUP
- 使得某个消息队列的某个组的消费者对该队列进行消费,即从设置的指定id开始读取队列中的消息
- Stream中的消息一旦被消费组里任一个消费者读取了就不可以再继续读取
- XPENDING
- 查看指定消息队列某个消费组里面已经读了但还未确认的消息个数,以及某个消费者读了哪些数据
- XACK
- 对消息队列中消费者已读但未确认的消息进行确认
- XGROUP CREATE key group id
- XINFO打印Stream\Consumer\Group的信息
- 队列相关指令
- 介绍
- Redis键(Key)操作
- 一个redis默认携带16个数据库DB(下标0-15),默认使用0号库
- keys * :查看所有的key,太多时不要用
- exists key1 key2…:判断key是否存在,返回存在的个数
- del key:以原子操作形式删除key
- unlink key:非阻塞删除key
- ttl key:time to leave:查询剩余过期时间,-1永不过期,-2已过期
- expire key sencond:给key设置过期时间
- select index:切换当前数据库到指定的下标【0-15】,默认0号库
- move key dbindex:将指定的key从当前数据库移到指定的数据库
- dbsize:查看当前数据库key的个数
- flushdb:情况当前库
- flushall:情况所有库
2. Redis持久化
- 总体介绍
- 持久化就是如何把redis在内存中的数据保存进入磁盘中
- 当redis宕机时,内存中的数据会消失,故要对内存中的数据进行保存进入磁盘中
- redis提供了多种持久化类型,常用的有RDB(Redis DataBase)和AOF(Append Only File)两种
- 持久化双雄
- RDB(快照)
- 介绍
- RDB文件就是某一个时刻redis所有数据和状态所组成的快照文件
- RDB就是以指定的时间间隔得到快照文件并保存到磁盘中
- RDB持久化:以指定的时间间隔执行数据集的时间点快照
- 快照:把某一时刻的数据和状态以文件的形式写到磁盘上
- 这个快照文件就是RDB文件
- 在指定的时间间隔内将该时刻的数据和状态保存为快照文件RDB文件,并将该文件保存到磁盘中
- 保存备份时执行的是全量快照,将所有的数据和状态保存到RDB文件(dump.rdb)中,然后把快照保存到磁盘里
- 案例演示
- 配置
2. RDB保存时间配置:在配置文件中设置 save second changes:即在指定的second内改变了changes次则会进行RDB持久化将此时的快照保存到磁盘中
3. Redis7之前是自动触发,此时的触发频率很高
4. Redis7配置:此时触发频率进行了降低 - 操作步骤
- 自动触发
- 配置
- 在redis.conf配置文件中通过 save second changes命令来设置RDB持久化的触发频率,此时若在secodn时间内修改了change次,则就自动触发进行RDB持久化
- 修改dump.rdb的保存路径
- 要确保配置的文件夹存在
- 修改dump.rbd文件的名字
- 在redis.conf文件中配置dbfilename属性
- 触发备份
- 此时就设置好了redis的RDB持久化的自动触发,当设置的时间间隔内改变了指定次数,就会自动触发RDB持久化,生成指定的dump.rdb文件并保存到指定的dir路径下
- 只要修改次数超过了设置的次数changes,则就会自动触发
- 当执行flushdb/flushall清除指令时,redis也会自动生成一个dump.rdb文件,但该文件是空的,保存的是删除后的数据和状态
- 恢复备份
- 将生成的备份文件直接移动到redis安装目录并启动服务即可恢复备份
- 要注意flushdb/flushall执行后也会生成dump.db文件,但是空的无意义,故要恢复必须对有数据的rdb文件进行备份,然后将该文件移动进去
- 且shutdown关闭服务器时也会自动触发RDB持久化生成最后的快照保存到指定的位置,一定要将服务和备份分机隔离
- 物理恢复,一定要将服务和备份分机隔离
- 通过在redis-cli中使用config get 参数名来获得所设置的参数的值
- 配置
- 手动触发
- 对于必须现在保存的数据进行手动触发,通过save和bgsave命令来生成rdb文件,就是开一个子线程去保存rdb文件
- SAVE:不推荐使用!会阻塞redis主线程
- save会开一个子线程保存rdb文件,但会阻塞redis主线程,直至持久化工作结束,禁止使用
- BGSAVE(默认)(不阻塞,推荐使用)
- 会创建(fork)一个异步的子线程去执行RDB持久化工作,不会阻塞redis的主线程,redis主线程可以同时执行请求
- LASTSAVE:获取最后一次成功执行快照RDB保存的时间戳,然后在linux命令行使用 date -d @时间戳 转换为标准时间
- 自动触发
- 配置
- RDB文件(快照)优缺点
- 优势
- 适合大规模的数据恢复(文件比较小)、按照业务定时备份、对数据完整性和一致性要求不高、RDB文件在内存中的加载速度比AOF更快
- 劣势
- 在上次保存后下次还未保存时的数据可能会丢失;每次保存都是全量保存,数据量太大时会导致I/O严重影响性能;RDB依赖主进程的fork()形成子进程进行持久化,导致内存占用太大
- 优势
- 如何检查修复dump.rdb文件
- 使用redis自带的redis-check-rdb(在redis-cli同一个文件夹内)来对指定的RDB文件进行修复
- 哪些情况会触发RDB快照
- flushdb/flushall(空的)/shutdown
- save/bgsave
- 修改次数超过conf文件中配置的changes
- 如何禁用快照
- 如何禁用RDB模式:修改redis.conf配置文件,对save命令的参数设置为"",此时就不会自动触发RDB持久化(可以在redis-cli下使用config set save “” 来设置,但不如直接在配置文件内设置)
- RDB配置项详解
- redis.config配置文件的SNAPSHOTTING模块
- stop-writes-on-bgsave-erroe
- 当bgsave持久化出错时,是否停止redis主线程的写请求,通过不停止则会导致数据的不一致性
- rdbcompression
- 是否对rdb文件进行压缩,默认开启
- rdbchecknum
- 是否对RDB文件中的数据进行数据校验,会消耗10%的性能
- rdb-del-sync-files
- redis主从复制时是否删除rdb
- 介绍
- RDB(快照)