redis理论学习:数据结构
啥是redis
redis是一个基于内存的k-v数据库,支持多种数据结构,经常用于缓存和分布式锁,将数据存储在内存里实现高速读写
同时又主从复制,事务,持久化和lua脚本等功能,适用于高并发场景
主要用redis就是作为mysql和服务层中间的缓存层,让数据可以更高效地读取返回,同时也能防止mysql在高请求量下被打坏
redis常用的数据结构有哪些
- string字符串
- 三种编码方式,int,embstr,raw。数字就用int编码,字符串长度小于44就用embstr编码,大于就用raw编码
- 底层是一个叫SDS的结构,包含free,len和buf
- 因为有len,所以可以O1直接返回长度;因为有free,所以可以预留不用新分配内存
- 因为不再以\0为长度结尾,所以二进制安全
- list队列
- 双端操作对象,可以先入先出,可以后入先出,头尾都可以操作
- 底层之前是ziplist和linkedlist
- 之后改为quicklist和listpack
- set集合
- set底层实现有整数集合和字典,前者有序后者无序,但是使用都当无序来
- 整数集合编码节约内存,字典编码查找更快
- zset有序集合
- ziplist或者skiplist+字典编码
- hash哈希表
- ziplist和hashtable是底层实现,ziplist适用于元素少,单个元素长度较小的情况,其他用hashtable
- hashtable的扩容和go的map类似,都是渐进式扩容,翻倍扩容
redis执行
- redis本身是单线程的,因为redis本身基于内存已经够快,而且引入多线程需要考虑线程安全很麻烦;6.0版本针对网络IO引入了多线程,但整体还是单线程
- 普通机器每秒十几万的读性能,几万的写性能
- redis为啥那么快?
- 内存操作,本身就快
- 数据结构高效
- 单线程减少了切换开销
- IO多路复用,epoll(操作系统内容)
redis理论学习:数据结构
http://example.com/2024/04/24/redis理论学习:数据结构/