Redis
本文会有一些Redis和Java容器对象的对比,一个是分布式数据库,一个是JVM内部数据容器,应用场景不同,仅仅是为了加深对Redis”数据库“的认识,加深对Redis使用场景的认识。
1.什么是Redis
Redis 是一个开源(BSD许可)的,内存中的数据结构存储系统,它可以用作数据库、缓存和消息中间件。 它支持多种类型的数据结构,如字符串(strings), 散列(hashes), 列表(lists), 集合(sets), 有序集合(sorted sets) 与范围查询, bitmaps, hyperloglogs 和 地理空间(geospatial) 索引半径查询。 Redis 内置了 复制(replication),LUA脚本(Lua scripting), LRU驱动事件(LRU eviction),事务(transactions) 和不同级别的 磁盘持久化(persistence), 并通过 Redis哨兵(Sentinel)和自动 分区(Cluster)提供高可用性(high availability)
2. Redis数据类型有哪些?
提供给用户的数据类型 有String,List,Hash,Set,ZSet
Redis内部数据结构有:SDS(简单动态字符串),链表,字典,跳跃表,整数集合,压缩列表
那么数据类型和内部数据结构的对应关系是什么样子的呢?
2.1 Redis数据类型与内部数据结构的关系是什么样的?
Redis没有直接使用基础数据结构来实现键值对数据库,而是基于这些数据结构创建了一个对象系统,这些对象是供用户直接使用的。Redis数据库中的每个键值对的键和值都是一个对象,五种类型的对象至少都支持两种或者两种以上的基础数据结构,不同的数据结构可以在不同的使用场景上优化对象的使用效率。
String是唯一一个会被其它四种对象嵌套使用的对象。List、Hash、Set、ZSet之所以会虚线指向SDS也是嵌套使用String的原因。
3.什么是SDS?
3.1 SDS数据结构是什么样的?
Redis 3.0及以前:
Redis没有直接使用C语言字符串,而是自己创建了一个名为简单动态字符串(Simple Dynamic String)的抽象类型来表示字符串。
SDS的基本结构:
struct sdshdr{
int len;
int free;
char buf[];
}
Redis 3.0及以后: Redis 的SDS分为了5种数据结构,分别是sdshdr5,sdshdr8,sdshdr16,sdshdr32,sdshdr64。以为sdsshdr8举例:
struct sdshdr8 {
// 当前字符串长度,最长支持2^8-1=255个字符(不包括\0)
uint8_t len;
// 记录了当前字节数组总共分配的内存大小(不包括\0)
uin