Redis7实战加面试题-基础篇(Redis10大数据类型)

说明

刚看完尚硅谷Redis零基础到进阶,最强redis7教程,阳哥亲自带练(附redis面试题)
趁热打铁,根据脑图和视频,对视频中的知识点进行总结,方便以后复习

Redis入门概述

Remote Dictionary Server(远程字典服务)是完全开源的,使用ANSIC语言编写遵守BSD协议,是一个高性能的Key-Value数据库提供了丰富的数据结构,例如String、Hash、List、Set、SortedSet等等。数据是存在内存中的,同时Redis支持事务、持久化、LUA脚本、发布/订阅、缓存淘汰、流技术等多种功能特性提供了主从模式、Redis Sentinel和Redis Cluster集群架构方案。
Redis能干嘛?
主流功能与应用:1.分布式缓存,挡在mysql等数据库之前的带刀护卫
在这里插入图片描述
2.内存存储和持久化(RDB+AOF),redis支持异步将内存中的数据写到硬盘上,同时不影响继续服务
3.高可用架构搭配(单机,主从,哨兵,集群)
4.缓存穿透、击穿、雪崩
5.分布式锁
6.队列:Reids提供list和set操作,这使得Redis能作为一个很好的消息队列平台来使用。我们常通过Reids的队列功能做购买限制。比如到节假日或者推广期间,进行一些活动,对用户购买行为进行限制,限制今天只能购买几次商品或者一段时间内只能购买一次。也比较适合适用。
7.排行榜加点赞。在互联网应用中,有各种各样的排行榜,如电商网站的月度销量排行榜、社交APP的礼物排行榜、小程序的投票排行榜等等。Redis提供的zset数据类型能够快速实现这些复杂的排行榜。比如小说网站对小说进行排名,根据排名,将排名靠前的小说推荐给用户
总功能概览:
在这里插入图片描述
优势:
1.性能极高–Redis能读的速度是110000次/秒,写的速度是81000次/秒。
2.Redis数据类型丰富,不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据结构的存储
3.Redis支持数据的持久化,可以将内存中的数据保持在磁盘中,重启的时候可以再次加载进行使用
4.Redis支持数据的备份,即master-slave模式的数据备份
总结:
在这里插入图片描述
对应网站:
英文官网 中文官网 中文文档
下载安装包 源码地址 在线测试
Redis命令参考

在这里插入图片描述
Redis7.0新特性概述:
Redis releases
部分新特性总览:
1.Redis Functions
在这里插入图片描述
2.Client-eviction
在这里插入图片描述
3.Multi-part AOF
在这里插入图片描述
4.listpack替代ziplist
在这里插入图片描述

Redis10大数据类型

在这里插入图片描述
这里说的数据类型是value的数据类型,key的类型都是字符串。
1.redis字符串(String)
string是redis最基本的类型,一个key对应一个value。string类型是二进制安全的,意思是redis的string可以包含任何数据,比如jpg图片或者序列化的对象 。一个redis中字符串value最多可以是512M。
2.redis列表(List)
Redis列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边)。它的底层实际是个双端链表,最多可以包含 2^32 - 1 个元素 (4294967295, 每个列表超过40亿个元素)。
3.redis哈希表(Hash)
Redis hash 是一个 string 类型的 field(字段) 和 value(值) 的映射表,hash 特别适合用于存储对象。Redis 中每个 hash 可以存储 2^32 - 1 键值对(40多亿)
4.redis集合(Set)
Redis 的 Set 是 String 类型的无序集合。集合成员是唯一的,这就意味着集合中不能出现重复的数据,集合对象的编码可以是 intset 或者 hashtable。Redis 中Set集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是 O(1)。集合中最大的成员数为 2^32 - 1 (4294967295, 每个集合可存储40多亿个成员)
5.redis有序集合(ZSet)
zset(sorted set:有序集合)。Redis zset 和 set 一样也是string类型元素的集合,且不允许重复的成员。不同的是每个元素都会关联一个double类型的分数,redis正是通过分数来为集合中的成员进行从小到大的排序。zset的成员是唯一的,但分数(score)却可以重复。zset集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是 O(1)。 集合中最大的成员数为 2^32 - 1
6.redis地理空间(GEO)
Redis GEO 主要用于存储地理位置信息,并对存储的信息进行操作,包括添加地理位置的坐标。获取地理位置的坐标。计算两个位置之间的距离。根据用户给定的经纬度坐标来获取指定范围内的地理位置集合
7.redis基数统计(HyperLogLog)
HyperLogLog 是用来做基数统计的算法,HyperLogLog 的优点是,在输入元素的数量或者体积非常非常大时,计算基数所需的空间总是固定且是很小的。在 Redis 里面,每个 HyperLogLog 键只需要花费 12 KB 内存,就可以计算接近 2^64 个不同元素的基 数。这和计算基数时,元素越多耗费内存就越多的集合形成鲜明对比。但是,因为 HyperLogLog 只会根据输入元素来计算基数,而不会储存输入元素本身,所以 HyperLogLog 不能像集合那样,返回输入的各个元素。
8.redis位图(bitmap)
在这里插入图片描述
9.redis位域(bitfield)
通过bitfield命令可以一次性操作多个比特位域(指的是连续的多个比特位),它会执行一系列操作并返回一个响应数组,这个数组中的元素对应参数列表中的相应操作的执行结果。说白了就是通过bitfield命令我们可以一次性对多个比特位域进行操作。
10.redis流(Stream)
Redis Stream 是 Redis 5.0 版本新增加的数据结构。Redis Stream 主要用于消息队列(MQ,Message Queue),Redis 本身是有一个 Redis 发布订阅 (pub/sub) 来实现消息队列的功能,但它有个缺点就是消息无法持久化,如果出现网络断开、Redis 宕机等,消息就会被丢弃。简单来说发布订阅 (pub/sub) 可以分发消息,但无法记录历史消息。而 Redis Stream 提供了消息的持久化和主备复制功能,可以让任何客户端访问任何时刻的数据,并且能记住每一个客户端的访问位置,还能保证消息不丢失
redis常见数据类型操作命令查询网站:
英文官网 中文

Redis 键(key)

常用:
在这里插入图片描述
案例:
key *:查看当前库所有的key
exists key:判断某个key是否存在
type key:查看你的key是什么类型
del key: 删除指定的key数据
unlink key:非阻塞删除,仅仅将keys从keyspace元数据中删除,真正的删除会在后续异步中操作。
ttl key:查看还有多少秒过期,-1表示永不过期,-2表示已过期
expire key秒钟:为给定的key设置过期时间

设置 Key 过期时间,默认-1表示永不过期,-2表示已过期 Redis 的过期时间设置有四种形式:
• EXPIRE 秒——设置指定的过期时间(秒),表示的是时间间隔。 • PEXPIRE 毫秒——设置指定的过期时间,以毫秒为单位,表示的是时间间隔。 •
EXPIREAT 时间戳-秒——设置指定的 Key 过期的 Unix 时间,单位为秒,表示的是时间/时刻。
• PEXPIREAT 时间戳-毫秒——设置指定的 Key 到期的 Unix 时间,以毫秒为单位,表示的是时间/时刻。
expire key seconds [NX|XX|GT|LT]

move key dbindex 【0-15】:将当前数据库的key移动到给定的数据库db当中
select dbindex:切换数据库【0-15】,默认为0
dbsize:查看当前数据库key的数量
flushdb:清空当前库
flushall:通杀全部库

数据类型命令及落地运用

备注: 命令不区分大小写,而key是区分大小写的。可以使用help @类型 寻求帮助(help @string
,help @list,help @hash,help @hyperloglog,。。。。。)
Redis字符串(String):
常用命令:
在这里插入图片描述
在这里插入图片描述
String是单值单value,最常用的命令是set key value,get key
在这里插入图片描述
同时设置/获取多个键值:MSET key value [key value …],MGET key [key…],mset/mget/msetnx
在这里插入图片描述
在这里插入图片描述
获取指定区间范围内的值:getrange/setrange
在这里插入图片描述
数值增减:一定要是数字才能进行加减。递增数字(INCR key),增加指定的整数(INCRBY key increment),递减数值(DECR key),减少指定的整数(DECRBY key decrement)
获取字符串长度和内容追加:STRLEN key,APPEND key value
分布式锁:
在这里插入图片描述

setnx key value,setex(set with expire)键秒值/setnx(set if not exist)
在这里插入图片描述
getset(先get再set):
在这里插入图片描述
应用场景:比如抖音无限点赞某个视频或者商品,点一下加一次
在这里插入图片描述
Redis列表(List)
在这里插入图片描述
list属于单key多value。
在这里插入图片描述
案例:
lpush/rpush/lrange
lpop/rpop:
在这里插入图片描述
lindex,按照索引下标获得元素(从上到下)
在这里插入图片描述
llen:获取列表中元素的个数
lrem key 数字N给定值v1 解释(删除N个值等于v1的元素)
在这里插入图片描述
ltrim key开始index 结束index,截取指定范围的值后再赋值给key
在这里插入图片描述
rpoplpush 源列表 目的列表
在这里插入图片描述
lset key index value

在这里插入图片描述
linsert key before/after 已有值 插入的新值
在这里插入图片描述
Redis哈希(Hash):
在这里插入图片描述
KV模式不变,但V是一个键值对。Map<String,Map<Object,object>>
案例:
hset/hget/hmset/hmget/hgetall/hdel
在这里插入图片描述
hlen:获取某个key内的全部数量
hexists key在key里面的某个值的key
hkeys/hvals
在这里插入图片描述
hincrby/ hincrbyfloat
在这里插入图片描述
hsetnx
在这里插入图片描述
应用场景:JD购物车早期设计目前不再采用,当前小中厂可用
在这里插入图片描述
在这里插入图片描述
Redis集合(Set):
在这里插入图片描述
set是单值多value,且无重复。
案例:
SADD key member [member…]:添加元素
SMEMBERS key:遍历集合中的所有元素
SISMEMBER key member:判断元素是否在集合中
SREM key member [member …]:删除元素
scard,获取集合里面的元素个数
在这里插入图片描述
SRANDMEMBER key[数字],从集合中随机展现设置的数字个数元素,元素不删除
在这里插入图片描述
SPOP key[数字]:从集合中随机弹出一个元素,出一个删一个
在这里插入图片描述
smove key1 key2在key1里已存在的某个值:将key1里已存在的某个值赋给key2
在这里插入图片描述
集合运算:集合A(abc12)、B(123ax),
1.集合的差集运算A-B (属于A但不属于B的元素构成的集合)SDIFF key [key…]
2.集合的并集运算AUB(属于A或者属于B的元素合并后的集合)SUNION key [key…]
3.集合的交集运算A∩B(属于A同时也属于B的共同拥有的元素构成的集合)
1)SINTER key [key…]
2)SINTERCARD numkeys key [key…] [ LIMIT limit ] redis7新命令。它不返回结果集,而只返回结果的基数。返回由所有给定集合的交集产生的集合的基数。案例:
在这里插入图片描述
应用场景:微信抽奖小程序
在这里插入图片描述
微信朋友圈点赞查看同赞朋友
在这里插入图片描述
QQ内推可能认识的人
在这里插入图片描述
Redis有序集合Zset(sorted set)
在set基础上,每个val值前加一个score分数值。之前set是k1v1 v2 V3,现在zset是k1 score1 v1 score2 v2。
在这里插入图片描述
案例:
向有序集合中加入一个元素和该元素的分数。ZADD key score member [score member …],添加元素
在这里插入图片描述
ZRANGE key start stop [WITHSCORES]:按照元素分数从小到大的顺序返回索引从start到stop之间的所有元素
zrevrange:
在这里插入图片描述
ZRANGEBYSCORE key min max [WITHSCORES] [ LIMIT offset count ]:获取指定分数范围的元素,( 是不包含,limit 作用是返回限制,limit开始下标步,多少步
在这里插入图片描述
ZSCORE key member:获取元素的分数
在这里插入图片描述
在这里插入图片描述
ZCARD key:获取集合中元素的数量
zrem key 某score下对应的value值,作用是删除元素
在这里插入图片描述
ZINCRBY key increment member:增加某个元素的分数
ZCOUNT key min max:获得指定分数范围内的元素个数
ZMPOP:从键名列表中的第一个非空排序集中弹出一个或多个元素,它们是成员分数对
在这里插入图片描述
zrank key values值,作用是获得下标值
zrevrank key values值,作用是逆序获得下标值
在这里插入图片描述
应用场景:根据商品销售对商品进行排序显示
在这里插入图片描述
Redis位图(bitmap):
由0和1状态表现的二进制位的bit数组
看需求:1.用户是否登陆过Y、N,比如京东每日签到送京豆。2.电影、广告是否被点击播放过 3.钉钉打卡上下班,签到统计
是什么:
在这里插入图片描述
能干嘛:用于状态统计,Y、N,类似AtomicBoolean
基本命令:
在这里插入图片描述
setbit:setbit key offset value,setbit键 偏移位 只能零或者1,Bitmap的偏移量是从零开始算的
在这里插入图片描述
getbit:getbit key offset
strlen:统计字节数占用多少
bitcount:全部键里面含有1的有多少个?
在这里插入图片描述
BITOP operation destkey key [key …]
对一个或多个保存二进制位的字符串 key 进行位元操作,并将结果保存到 destkey 上。
operation 可以是 AND 、 OR 、 NOT 、 XOR 这四种操作中的任意一种:
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 。
在这里插入图片描述
setbit和getbit案例说明:按照天统计
在这里插入图片描述
应用场景:一年365天,全年天天登陆占用多少字节
在这里插入图片描述

在这里插入图片描述
Redis基数统计( HyperLogLog):
在这里插入图片描述
看需求:
1.统计某个网站的UV、统计某个文章的UV(Unique Visitor,独立访客,一般理解为客户端IP),需要考虑去重
2.用户搜索网站关键词的数量
3.统计用户每天搜索不同词条个数
是什么:去重复统计功能的基数(是—种数据集,去重复后的真实个数)估计算法-就是HyperLogLog,去重脱水后的真实数据

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
Redis地理空间(GEO):
在这里插入图片描述
原理:
在这里插入图片描述
命令:
GEOADD 多个经度(longitude)、纬度(latitude)、位置名称(member)添加到指定的 key中
GEOPOS 从键里面返回所有给定位置元素的位置(经度和纬度)
GEODIST 返回两个给定位置之间的距离。
GEORADIUS 以给定的经纬度为中心,返回与中心的距离不超过给定最大距离的所有位置元素。
GEORADIUSBYMEMBER 跟GEORADIUS类似
GEOHASH 返回一个或多个位置元素的Geohash表示
命令实操:
GEOADD 添加经纬度坐标
在这里插入图片描述
处理中文乱码
在这里插入图片描述
GEOPOS 返回经纬度
在这里插入图片描述
GEOHASH 返回坐标的geohash表示,geohash算法生成的base32编码值
在这里插入图片描述
GEODIST 两个位置之间距离
在这里插入图片描述
GEORADIUS:以半径为中心,查找附近的XXX
在这里插入图片描述
GEORADIUSBYMEMBER
在这里插入图片描述
Redis流(Stream):
redis5.0之前痛点:Redis消息队列的2种方案,
1).List实现消息队列,List 实现方式其实就是点对点的模式
在这里插入图片描述
2).(Pub/Sub) Redis5.0版本新增了一个更强大的数据结构-----Stream,Redis版的MQ消息中间件+阻塞队列,实现消息队列,它支持消息的持久化、支持自动生成全局唯一ID、支持ack确认消息的模式、支持消费组模式等,让消息队列更加的稳定和可靠
在这里插入图片描述
底层结构和原理说明:
在这里插入图片描述
基本命令理论简介
队列相关指令:
在这里插入图片描述
消费组相关指令:
在这里插入图片描述
四种特殊符号:
“- + ”:最小和最大可能出现的ld
“$ ”:$表示只消费新的消息,当前流中最大的id,可用于将要到来的信息
“> ”:用于XREADGROUP命令,表示迄今还没有发送给组中使用者的信息,会更新消费者组的最后ID
“ * ”:用于XADD命令中,让系统自动生成id
基本命令代码实操:
队列相关指令:
XADD:添加消息到队列末尾,消息ID必须要比上个ID大,默认用星号表示自动生成规矩,“ * ”用于XADD命令中,让系统自动生成id
在这里插入图片描述XRANGE ,用于获取消息列表(可以指定范围),忽略删除的消息,start表示开始值,-代表最小值。end表示结束值,+代表最大值。count表示最多获取多少个值

在这里插入图片描述

XREVRANGE:与XRANGE的区别在于,获取消息列表元素的方向是相反的,end在前,start在后
在这里插入图片描述
XDEL
在这里插入图片描述

XLEN :用于获取Stream队列的消息的长度
在这里插入图片描述
XTRIM:用于对Stream的长度进行截取,如超长会进行截取,MAXLEN:允许的最大长度,对流进行修剪限制长度
MINID:允许的最小id,从某个id值开始比该id值小的将会被抛弃
在这里插入图片描述
在这里插入图片描述

XREAD:用于获取消息(阻塞/非阻塞),只会返回大于指定ID的消息
在这里插入图片描述
非阻塞
在这里插入图片描述
阻塞
在这里插入图片描述

小总结(类似java里面的阻塞队列)
在这里插入图片描述消费组相关指令:
XGROUP CREATE,用于创建消费者组
在这里插入图片描述

XREADGROUP GROUP:
">”,表示从第一条尚未被消费的消息开始读取,消费组groupA内的消费者consumer1从mystream消息队列中读取所有消息,
在这里插入图片描述

但是,不同消费组的消费者可以消费同一条消息
在这里插入图片描述

消费组的目的:
在这里插入图片描述

重点问题:
在这里插入图片描述
XPENDING:查询每个消费组内所有消费者「已读取、但尚未确认」的消息
在这里插入图片描述
查看某个消费者具体读取了哪些数据
在这里插入图片描述

XACK:向消息队列确认消息处理已完成
在这里插入图片描述
XINFO用于打印Stream\Consumer\Group的详细信息
在这里插入图片描述
使用建议:Stream还是不能100%等价于Kafka、RabbitMQ来使用的,生产案例少,慎用
Redis位域(bitfield):
了解即可。将一个Redis字符串看作是一个由二进制位组成的数组,并能对变长位宽和任意没有字节对齐的指定整型位域进行寻址和修改
在这里插入图片描述
在这里插入图片描述
用于位域修改,溢出控制。
命令基本语法:
在这里插入图片描述
基本命令实操:
BITFIELD key [GET type offset]
在这里插入图片描述

BITFIELD key [SET type offset value]
在这里插入图片描述

BITFIELD key [INCRBY type offset increment],默认情况下,INCRBY使用WRAP参数
在这里插入图片描述

溢出控制OVERFLOW [WRAP|SAT|FAIL],
WRAP:使用回绕(wrap around)方法处理有符号整数和无符号整数的溢出情况,
在这里插入图片描述

SAT:使用饱和计算(saturation arithmetic)方法处理溢出,下溢计算的结果为最小的整数值,而上溢计算的结果为最大的整数值,
在这里插入图片描述

FAIL:命令将拒绝执行那些会导致上溢或者下溢情况出现的计算,并向用户返回空值表示计算未被执行

在这里插入图片描述

下一篇

Redis7实战加面试题-基础篇(Redis持久化,Redis事务,Redis管道,Redis发布订阅)

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值