Redis常见面试题

时间:2022-07-28
本文章向大家介绍Redis常见面试题,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

说说你用过的Redis的数据类型

String:最基本的数据类型,二进制安全 (可以包含任何对象:序列化对象,JPG)

/*
* 保存字符串对象的结构
*/
struct asshdr {
  // buf 中已占用空间的长度
  int len;
  
  // buf 中剩余可用空间的长度
  int free;
  
  // 数据空间
  char buf[];
};

Hash:String元素组成的字典,适合用于存储对象

hmset lilei name "LiLei" age 26 title "Senior"

hget lilei age

hset lilei title "Pricipal"

List:列表,按照String元素插入顺序排序

lpush mylist aa
lpush mylist bb
lpush mylist cc
lrange mylist 0 10

后进先出的特定,轻松实现栈的功能

Set:String元素组成的无序集合,通过哈希表实现,不允许重复

sadd myset 111
sadd myset 222
sadd myset 333
sadd myset 222

smembers myset
sadd myset abd

所有的关注人存为Set

Sorted Set:有序集合

通过分数来为集合中的成员进行从小到大的排序,分数可以相同,成员值必须唯一

zadd myzset 3 abc
zadd myzset 1 abd
zadd myzset 2 abb

zrangebyscore myzet 0 10

用于计数的HyperLogLog

用于支持存储地理位置信息的Geo

底层数据类型基础

  1. 简单动态字符串
  2. 链表
  3. 字典
  4. 跳跃表
  5. 整数结集合
  6. 压缩列表
  7. 对象

从海量Key里查询出某一固定前缀的Key

留意细节:

  • 摸清数据规模,即问清楚边界
  1. 利用 KEYS pattern:查询所有符合给定模式pattern的key
keys k1*
  • KEYS指令一次性返回所有匹配的key
  • 键的数量过大会使服务 卡顿
  1. SCAN cursor [MATCH pattern] [COUNT count]
  • 基于游标的迭代器,需要基于上一次的游标延续之前的迭代过程
  • 以0作为游标开始一次新的迭代,直到命令返回游标0完成一次遍历
  • 不保证每次执行都返回某个给定数量的元素,支持模糊查询
  • 一次返回的数量不可控,只能是大概率符合count参数
scan 0 match k1* count 10

如何通过Redis实现分布式锁

分布式锁需要解决的问题:

  • 互斥性
  • 安全性
  • 死锁
  • 容错

SETNX key value:如果key不存在,则创建并赋值

  • 时间复杂度:O(1)
  • 返回值:设置成功,返回1;设置失败,返回0
get locknx

setnx locknx test

setnx locknx task

get locknx

原子性,实现分布式锁