Redis面试常见问题

本文面向Redis基础八股文,主要是常见概念、操作命令,不涉及源码、原理解析。

1. 什么是redis?redis有哪些应用场景?

答:Redis 是 Remote Dictionary Service 的简称;也是远程字典服务;redis是一个基于内存的键值数据库。

常见的应用场景有以下几个:

(1)作为关系型数据库的缓存。mysql等关系型数据库查询数据需要进行磁盘上的io比较耗时,可以在一次查询后把结果存储到redis里面,后面再查询直接从redis中读取数据。尤其是一些公共的、高频访问的静态资源,例如网页上的静态图片等。

(2)作为cookie的替代存储用户会话。

(3)作为消息队列使用。可以考虑使用list和stream实现消息队列的功能。

(4)作为分布式锁。在分布式环境中,使用 Redis 实现互斥锁,防止并发冲突,如库存扣减、秒杀活动等

2. redis有哪些具体的数据结构?

答:基础的数据类型蛀牙有五个,分别是string,list, hash,set和zset。

string:安全的二进制字符串

list:有序的双端队列

hash: 散列表,对顺序不关注,field是唯一的

set:无序集合面对顺序不关注,里面的值都是唯一的

zset:有序集合,里面的值是唯一的,根据memeber确定唯一, 根据score确定有序

整体示意图如下:

3. redis常用的基础命令有哪些?

答:string类型的操作:字符数组,该字符串是动态字符串 raw,字符串长度小于1M 时,加倍扩容;超过 1M 每次只多扩 1M;字符串最大长度为 512M;

# 设置 key 的 value 值
SET key val
# 获取 key 的 value
GET key
# 执行原子加一的操作
INCR key
# 执行原子加一个整数的操作
INCRBY key increment
# 执行原子减一的操作
DECR key
# 执行原子减一个整数的操作
DECRBY key decrement
# 如果key不存在,这种情况下等同SET命令。 当key存在时,什
么也不做
# set Not eXist   ok 这个命令是否执行了 0,1 是不是操
作结果是不是成功
SETNX key value
# 删除 key val 键值对
DEL key

# 极少修改,对象属性字段很少改变的时候,可以使用这种形式直接存储哈希表
SET role:10001 '{["name"]:"mark",["sex"]:"male",
["age"]:30}'
SET role:10002 '{["name"]:"darren",["sex"]:"male",
["age"]:30}'



加锁:

setnx lock 1   # 不存在才能设置 定义加锁行为 占用锁  
setnx lock uuid  # expire 30 过期
set lock uuid nx ex 30

# 格式
setnx 锁名 key 参数

del lock
if (get(lock) == uuid)
 del(lock);

位运算:

# 获取给定 key 对应字符串值的指定偏移量上的比特值
GETBIT key offset

# 设置给定 key 对应字符串值的指定偏移量上的比特值为 0 或 1,并返回设置前的比特值
SETBIT key offset value

# 计算给定 key 对应字符串值在指定范围内比特值为 1 的数量。如果不指定范围,默认计算整个字符串
BITCOUNT key [start end]

# key 对应字符串值中第一个等于给定比特值的比特的位置。如果比特值没有找到,则返回 -1。
BITPOS key bit [start [end]]

# 对一个或多个 key 执行位运算,并将结果存储到 destkey 中。
# 支持的位运算包括 AND、OR、XOR 和 NOT
BITOP operation destkey key [key ...]

list:list是一个双向链表,增删操作时间复杂度O(1),查找中间元素的时间复杂度是O(n)。列表中的元素长度小于48不能压缩,压缩前后长度差不超过8,不压缩。

# 从队列的左侧入队一个或多个元素
LPUSH key value [value ...]
# 从队列的左侧弹出一个元素
LPOP key
# 从队列的右侧入队一个或多个元素
RPUSH key value [value ...]
# 从队列的右侧弹出一个元素
RPOP key
# 返回从队列的 start 和 end 之间的元素 0, 1 2 负索引
LRANGE key start end
# 从存于 key 的列表里移除前 count 次出现的值为 value 的
元素
# list 没有去重功能
LREM key count value
# 它是 RPOP 的阻塞版本,因为这个命令会在给定list无法弹出
任何元素的时候阻塞连接
BRPOP key timeout  # 超时时间 + 延时队列

hash:散列表,在很多高级语言当中包含这种数据结构;c++ unordered_map 通过 key 快速索引 value;节点数量大于 512(hash-max-ziplist-entries) 或所有字符串长 度大于 64(hash-max-ziplist-value),则使用 dict 实现;节点数量小于等于 512 且有一个字符串长度小于 64,则使用 ziplist 实现;

# 获取 key 对应 hash 中的 field 对应的值
HGET key field
# 设置 key 对应 hash 中的 field 对应的值
HSET key field value
# 设置多个hash键值对
HMSET key field1 value1 field2 value2 ... fieldn
valuen
# 获取多个field的值
HMGET key field1 field2 ... fieldn
# 给 key 对应 hash 中的 field 对应的值加一个整数值
HINCRBY key field increment
# 获取 key 对应的 hash 有多少个键值对
HLEN key
# 删除 key 对应的 hash 的键值对,该键为field
HDEL key field


hmset hash:10001 name mark age 18 sex male
# 与 string 比较
set hash:10001 '{["name"]:"mark",["sex"]:"male",
["age"]:18}'
# 假设现在修改 mark的年龄为19岁
# hash:
 hset hash:10001 age 19
# string:
 get hash:10001
 # 将得到的字符串调用json解密,取出字段,修改 age 值
 # 再调用json加密
 set hash:10001 '{["name"]:"mark",
["sex"]:"male",["age"]:19}'

set:集合;用来存储唯一性字段,不要求有序。元素都为整数且节点数量小于等于 512(set-max-intsetentries),则使用整数数组存储;元素当中有一个不是整数或者节点数量大于 512,则使用字典 存储;

# 添加一个或多个指定的member元素到集合的 key中
SADD key member [member ...]
# 计算集合元素个数
SCARD key
# SMEMBERS key
SMEMBERS key
# 返回成员 member 是否是存储的集合 key的成员
SISMEMBER key member
# 随机返回key集合中的一个或者多个元素,不删除这些元素
SRANDMEMBER key [count]
# 从存储在key的集合中移除并返回一个或多个随机元素
SPOP key [count]
# 返回一个集合与给定集合的差集的元素
SDIFF key [key ...]
# 返回指定所有的集合的成员的交集
SINTER key [key ...]
# 返回给定的多个集合的并集中的所有成员
SUNION key [key ...]


# 添加抽奖用户
   sadd Award:1 10001 10002 10003 10004 10005
10006
   sadd Award:1 10009
# 查看所有抽奖用户
 smembers Award:1
# 抽取多名幸运用户
 srandmember Award:1 10


# 共同关注
sadd follow:A mark king darren mole vico
sadd follow:C mark king darren
sinter follow:A follow:C

# 推荐好友
sadd follow:A mark king darren mole vico
sadd follow:C mark king darren
# C可能认识的人:
sdiff follow:A follow:C

zset:有序集合,可以用来实现排行榜,它是一个有序唯一。节点数量大于 128 或者有一个字符串长度大于 64,则使用跳表 (skiplist)。节点数量小于等于 128(zset-max-ziplist-entries)且所有字符 串长度小于等于 64(zset-max-ziplist-value),则使用 ziplist 存储。

# 添加到键为key有序集合(sorted set)里面
ZADD key [NX|XX] [CH] [INCR] score member [score
member ...]
# 从键为key有序集合中删除 member 的键值对
ZREM key member [member ...]
# 返回有序集key中,成员member的score值
ZSCORE key member
# 为有序集key的成员member的score值加上增量increment
ZINCRBY key increment member
# 返回key的有序集元素个数
ZCARD key
# 返回有序集key中成员member的排名
ZRANK key member
# 返回存储在有序集合key中的指定范围的元素   order by id
limit 1,100
ZRANGE key start stop [WITHSCORES]
# 返回有序集key中,指定区间内的成员(逆序)
ZREVRANGE key start stop [WITHSCORES]

4. Redis 和 Memcached 有什么区别?

答: 从功能上来看redis全面优于Memcached。Redis支持多种数据结构,Memcached 主要支持字符串和整数的简单键值对存储。redis还支持持久化、集群模式、发布订阅模型、Lua 脚本、事务等特性,Memcached都不支持。

Redis 因为其丰富的数据结构和持久化能力,更适合需要复杂数据操作和数据持久性的场景;而 Memcached 以其简单性和高吞吐量,更适合于纯缓存场景,尤其是读取密集型应用。

5. 为什么使用Redis作为Mysql的缓存?

答:高性能读取:Redis 是一个内存中的数据结构存储系统,读取速度极快,比基于磁盘的 MySQL 快得多。通过将经常访问的数据存储在 Redis 中,可以显著减少对 MySQL 数据库的查询,从而减轻数据库的负载并加快应用响应时间

       高并发处理:Redis 的内存存储特性使其能够处理高并发读取请求,而不会像磁盘 I/O 密集型的 MySQL 那样成为瓶颈

这是一条吃饭博客,由挨踢零声赞助。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值