Redis常见面试题
2020-10-01 本文已影响0人
宇宙之一粟
说说你用过的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
底层数据类型基础
- 简单动态字符串
- 链表
- 字典
- 跳跃表
- 整数结集合
- 压缩列表
- 对象
从海量Key里查询出某一固定前缀的Key
留意细节:
- 摸清数据规模,即问清楚边界
- 利用 KEYS pattern:查询所有符合给定模式pattern的key
keys k1*
- KEYS指令一次性返回所有匹配的key
- 键的数量过大会使服务 卡顿
- 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
原子性,实现分布式锁