redis数据结构面试宝典
2023-11-04 17:42:05 0 举报
redis的面试点,看这个就够了!
作者其他创作
大纲/内容
编码类型
keyorange
valuehoupeng
lpushrpop
当使用hash时
连续内存空间,每个元素的大小不一样,元素中记录大小长度
4
3
next
1
127.0.0.1:6379> HGET article:1 prize\"1\"127.0.0.1:6379> HINCRBY article:1 prize 1(integer) 2127.0.0.1:6379> HGET article:1 prize\"2\"
使用字典实现,字典的键保存了键值对的键,字典的值,保存了键值对的值
将用户id放入set中
跳跃表skiplist
6
特征:无序,随机抽奖
整数集合or哈希
value
eg
value10
压缩列表ziplist
15
对某一时点做快照
pre
entry2
可通过命令主动生成RDB文件
string 在做数值运算的时候,字符串类型会发生变化
配置文件内参数配置save 900 1 // 15分钟,1个key发生改变会触发save 300 10 // 5分钟后,10个key发生改变会触发save 60 10000 //1分钟后,10000个key改变会触发dbfilename dump.rdb //快照文件名dir /var/lib/redis/6379 //保存路径
简单动态字符串
2
可以实现阻塞队列先进先出FIFO
127.0.0.1:6379> HSET userinfo:1 name houpeng(integer) 1127.0.0.1:6379> HSET userinfo:1 age 10(integer) 1127.0.0.1:6379> HGETALL userinfo:11) \"name\"2) \"houpeng\"3) \"age\"4) \"10\"
ziplist或skiplist
场景一:统计用户的登录天数,任意时间段分析:一年最多366天,366/8 约等 46,仅需46个字节即可
底层实现
数据类型
contents
free
127.0.0.1:6379> SETBIT zhangsan 0 1(integer) 0127.0.0.1:6379> SETBIT zhangsan 364 1(integer) 0127.0.0.1:6379> BITCOUNT zhangsan(integer) 2127.0.0.1:6379> STRLEN zhangsan(integer) 46
string
len
list混合使用后叫quicklist
快速列表(ziplist+linkedlist)
sorted_set二选一字典+以上两种二选一
encoding
压缩列表存储方式
1. memcache仅支持string类型,无法对value中的值进行灵活的存取和查询,只能一次性全部取出来2. redis的value支持多种类型,string/hash/list/set/sort_set、还有bitmap/hyperloglog等支持事务、持久化、\b哨兵、复制等特性
keybanana
30
127.0.0.1:6379> ZRANGE chengji 0 -11) \"xm\"2) \"hp\"127.0.0.1:6379> OBJECT encoding chengji\"ziplist\"//当添加一个较大的元素时(大于64个字节),编码变成了跳跃表127.0.0.1:6379> ZADD chengji 10 bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(integer) 1127.0.0.1:6379> OBJECT encoding chengji\"skiplist\"
entry1
redis和memcache的区别
整数集合intset
反向命令
key
链表越来越长时,redis怎么做的?1. redis维护了2个哈希桶,默认使用第一个,第二个暂不分配空间2. 当数据增多时,给第二个哈希桶分配第一个的2倍空间3. 随着客户端的请求,已渐进式的形式,逐步将数据从1切到更大第二个哈希桶,以此循环,待一全部迁移完后,释放空间
hash
场景一
使用hashtable时,字段的key作为集合元素,字段的value为空
用户详情
哈希桶1
20
非连续内存空间
持久化
哈希表hashtable
127.0.0.1:6379> SADD set a b c d e f g(integer) 7127.0.0.1:6379> OBJECT encoding set\"hashtable\"// 值为整数时,内部编码未intset127.0.0.1:6379> SADD intset 1 2 3 4(integer) 4127.0.0.1:6379> OBJECT encoding intset\"intset\"
RDB文件是单个的,只有一个文件,之前的会被覆盖,文件内容为二进制数据
点赞/收藏
list
场景
同向命令
keyage
null
127.0.0.1:6379> set a abcOK127.0.0.1:6379> OBJECT encoding a\"embstr\"127.0.0.1:6379> set a aOK127.0.0.1:6379> set a 1OK127.0.0.1:6379> OBJECT encoding a\"int\"
存了同一键值对的两个节点总是紧挨在一起, 保存键的节点在前, 保存值的节点在后
字符串
bitmap
value的类型多样
数值运算
keyname
手动触发
程序自动触发
set二选一
场景二
value18
fieldage
哈希冲突后
1. redis的string是二进制安全的,不仅可以存文本,还可以存图片、视频、等二进制数据2. C语言的string,遇到\\0 会认为已经到了末尾,而redis的字符使用的是len属性来判断字符长度的,不依托\\0
BGREWRITEAOF
lpushlpop
lpushbrpop
hash二选一
SDS - 简单动态字符串simple dynamic string
set
AOF
5
key经过哈希算法后,放到哈希桶中,哈希桶中存储着key和value的指针
bgsavefork子进程,不阻塞主进程
appendonly yes //开启AOF,恢复的话使用aof恢复appendfilename \"appendonly.aof\" //aof文件名称auto-aof-rewrite-percentage 100auto-aof-rewrite-min-size 64mb // 首次aof重写时,文件多大才会触发appendfsync always //aof写入时机,总是,同步写入,影响主进程性能appendfsync everysec //每秒写入appendfsync no //交由操作系统,根据系统的page cache刷盘策略
双向链表linkedlist
save场景:关机维护时,该命令会阻塞主进程
key => value全局哈希表
动态改变
压缩列表or哈希表
sorted_set
127.0.0.1:6379> SADD user:gift 1 2 3 4 5 6 7 8 9 10(integer) 10127.0.0.1:6379> SRANDMEMBER user:gift 11) \"6\"127.0.0.1:6379> SRANDMEMBER user:gift 11) \"5\"127.0.0.1:6379> SRANDMEMBER user:gift 11) \"4\"127.0.0.1:6379> SRANDMEMBER user:gift 11) \"6\"
fieldname
可以实现栈先进后出
keyapple
127.0.0.1:6379> SETBIT 20201109 100 1(integer) 0127.0.0.1:6379> SETBIT 20201110 100 1(integer) 0127.0.0.1:6379> SETBIT 20201111 100 1(integer) 0127.0.0.1:6379> SETBIT 20201110 200 1(integer) 0127.0.0.1:6379> SETBIT 20201111 200 1(integer) 0统计双十一期间,20201110 和20201111 两天都登录的用户数量BITOP and destkey 20201110 20201111 //并操作127.0.0.1:6379> BITCOUNT destkey 0 -1(integer) 2 2位用户
sds { buf 保存字节数组 free buf可用空间 len buf大小}sds在获取字符串长度的时候,效率更高为O(1)
127.0.0.1:6379> LPUSH queue 1 2 3 4 5(integer) 5127.0.0.1:6379> LRANGE queue 0 -11) \"5\"2) \"4\"3) \"3\"4) \"2\"5) \"1\"127.0.0.1:6379> RPOP queue\"1\"
AOF重写
开启AOF
可以实现队列先进先出FIFO
-50
存的是redis的执行命令
entry3
10
length
对应关系
5000
RDB
活跃用户统计用户id可作为第几位
redis
127.0.0.1:6379> LPUSH stack 1 2 3 4 5(integer) 5127.0.0.1:6379> LRANGE stack 0 -11) \"5\"2) \"4\"3) \"3\"4) \"2\"5) \"1\"127.0.0.1:6379> LPOP stack\"5\"
100
4.0版本之后,AOF中包含RDB全量,增加记录新的写操作
eg: 127.0.0.1:6379> set counter 100OK127.0.0.1:6379> type counterstring127.0.0.1:6379> INCRBY counter 11(integer) 111127.0.0.1:6379> type counterstring127.0.0.1:6379> get counter\"111\"127.0.0.1:6379> APPEND counter a(integer) 4127.0.0.1:6379> get counter\"111a\"127.0.0.1:6379> INCRBY counter 1(error) ERR value is not an integer or out of range
127.0.0.1:6379> HSET userinfo name hp(integer) 1127.0.0.1:6379> HSET userinfo age 18(integer) 1127.0.0.1:6379> OBJECT encoding userinfo\"ziplist\"127.0.0.1:6379> HSET userinfo address addddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd(integer) 1127.0.0.1:6379> OBJECT encoding userinfo\"hashtable\"
buffer
当哈希桶不足以存放大量数据时,链表会越来越长,效率降低
keyuser:1
二进制安全
收藏
0 条评论
下一页