Redis 基础数据结构
1. 背景
为什么会产生NoSQL数据库? 和传统的RDBM的区别在哪里? 有什么突出优势吗?
传统数据库如MySQL, 更多的是表格结构化的行存储数据, 固定的模式(需要数据适应表结构), 通过事务特性控制数据一致性;存在问题: 扩展性-面临表结构修改困难导致的存储数据格式受限, 读写性能-传统关系型数据库由于会将数据持久化到磁盘, 并发和海量数据的情况下, 磁盘读写压力大.
NoSQL的特性: 存储非结构化的数据-如文本, 图片, 音频, 视频; 扩展性强-表与表之间没有关联, 能分片存储, 扩缩容简单; 最终一致性(BASE理论)-保证数据的最终一致性;高频读写支持-海量数据的存储; 针对不同的存储类型: 可分为K-V存储(Redis), 文档存储(MongoDB), 列存储(HBase), 图存储(Neo4j), 对象存储(OSS); NoSQL 产品汇总(https://hostingdata.co.uk/nosql-database/)
NewSQL则是前两者的结合, 如TiDB(PingCAP), ScaleDB
2. 基础数据类型
数据结构: String, Hash, Set, List, Zset
2.1 String字符串
(1)存储数据类型: int, float, string
(2)存储原理⭐
SDS
, redisObject
, 内部编码格式比较
- int: 存储8个字节的长整型(long, 2^64 - 1)
- embstr: emdstr格式的SDS, 存储小于44个字节的字符串
- raw: 存储大于44个字节的字符串.
(3)底层分析:
SDS: Simple Dynamic String 简单动态字符串, (本质字符串数组) 空间换时间
为什么采用SDS实现字符串? C语言本身没有字符串类型, 只能是使用字符数组:
a.使用字符串数组需要给目标变量分配足够的空间, 否则可能会溢出
b.获取字符串长度需要遍历整个字符串
c.C 中字符串长度变更会对字符串数组做内存重分配
d.存储图片, 音视频, 压缩文件等二进制文件的不安全性
引入SDS带来的优势
1.不用担心内存溢出, 会对SDS扩容
2.通过空间换时间方式, 获取字符串的长度
3.通过"空间预分配" 和 “惰性空间释放”, 防止多次重分