1. 特性:
- key-value存储服务系统.
- 有点类似java的map、python的dict.
- 速度快、持久化、多种数据结构、主从复制、高可用、分布式.
- 不依赖外部库.
2. 数据结构:
其它衍生的数据类型:
- bitmaps位图 => 本质是string类型
- HyperLogLog => 本质是string类型
- GEO地图信息定位 => 本质是有序集合 a. 适合O2O产品计算附近的餐馆 b. 可以计算经度和纬度
(1). 内部编码:
- 时间与空间的切换: a. 如果元素比较小的时候,就算是压缩过的,处理起来也比较快,就可以用空间换时间. b. 在元素进行遍历、查找,不会消耗很多时间和CPU,使用更小的空间来达到更优的内存使用效果. c. 如hash结构,内部编码可能hashtable(哈希表)或ziplist(压缩列表).
- 为什么要给每种数据结构设置内部编码? a. 一旦改进内部编码,无需改动外部数据结构和命令. b. 多种内部编码实现可以在不同场景下发挥各自的优势. 1. 如ziplist比较节省内存,但在列表元素比较多的情况下,性能会有所下降. 2. 此时,Redis会根据配置选项将列表类型的内部实现转换为linkedlist.
- redis源码有一个redisObject的结构体,面向接口编程: typedef struct redisObject { // 数据类型:string、hash、list、set、sorted set unsigned type:4; // 编码方式:raw、int、ziplist、linkedlist、hashmap、intset unsigned encoding:4; unsigned lru:REDIS_LRU_BITS; /* lru time (relative to server.lruclock) */ int refcount; // 数据指针 void *ptr; } robj;
3. 速度快:
- 计算机的存储介质: 寄存器、一级缓存、二级缓存、内存、本地硬盘、移动硬盘 fast ---------------------------------------> slow small ---------------------------------------> big
- 存储在内存中,电寻址.
- c语言实现的.
- 线程模型是单线程.
4. 持久化:
redis所有数据保存在内存中,对数据的更新将异步地保存到磁盘中.
5. 功能丰富:
- 基于消息的发布订阅功能
- lua脚本自定义,实现自定义的命令
- 事务
- pipeline