Redis 学习记录
Redis: Remote Dictionary Service 远程字典服务
SQL和NoSql的区别:
存储类型:
String:
存储类型:
可以用来存储字符串、整数、浮点数。
1、int:存储8 个字节的长整型(long,2^63-1)。
2、embstr: 代表embstr 格式的SDS(Simple Dynamic String 简单动态字符串),
存储小于44 个字节的字符串。
3、raw:存储大于44 个字节的字符串(3.2 版本之前是39 字节)。
应用场景:
1、热点数据缓存
2、对象缓存
redis 内部编码的转换,都符合以下规律:
编码转换在redis写入数据时完成,且转换过程不可逆,只能从小内存编码向大内存编码转换(不包括重新set)
Hash:
存储类型:
包含键值对的无序散列表。value 只能是字符串,不能嵌套其他类型。
Redis 的Hash 本身也是一个KV 的结构,类似于Java 中的HashMap。
1、ZipList(压缩列表):
当hash 对象同时满足以下两个条件的时候,使用ziplist 编码:
1)所有的键值对的健和值的字符串长度都小于等于64byte(一个英文字母
一个字节);
2)哈希对象保存的键值对数量小于512 个。
一个哈希对象超过配置的阈值(键和值的长度有>64byte,键值对个数>512 个)时,
会转换成哈希表(hashtable)。
2、HashTable(哈希表):
在Redis 中,hashtable 被称为字典(dictionary),它是一个数组+链表的结构。
应用场景:
存储对象类型的数据,如商品详情,个人详情等数据
List:
存储类型:
存储有序的字符串(从左到右),元素可以重复。可以充当队列和栈的角色。
quickList:
quicklist(快速列表)是ziplist 和linkedlist 的结合体。quicklist.h,head 和tail 指向双向列表的表头和表尾
typedef struct quicklist {
quicklistNode *head; /* 指向双向列表的表头*/
quicklistNode *tail; /* 指向双向列表的表尾*/
unsigned long count; /* 所有的ziplist 中一共存了多少个元素*/
unsigned long len; /* 双向链表的长度,node 的数量*/
int fill : 16; /* fill factor for individual nodes */
unsigned int compress : 16; /* 压缩深度,0:不压缩; */
} quicklist;
![]
Set:
存储类型:
String 类型的无序集合,最大存储数量2^32-1(40 亿左右)。
intSet : 如果元素都是整数类型,就用inset 存储。
HashTable: 如果不是整数类型,就用hashtable(数组+链表的存来储结构)。如果元素个数超过512 个,也会用hashtable 存储。
SortedSet:
存储类型:
sorted set,有序的set,每个元素有个score。
score 相同时,按照key 的ASCII 码排序。
zipList:
同时满足以下条件时使用ziplist 编码:1、元素数量小于128 个 2、所有member 的长度都小于64 字节,超过阈值之后,使用skiplist+dict 存储。skipList + dict:
内存回收:
持久化策略:
RDB:
RDB是Redis默认的持久化方案,当满足一定的条件,会把当前内存中的数据写入磁盘,生成一个快照文件dump.rdb。Redis可以通过加载这个文件来恢复数据。
AOF:
AOF采用日志的格式来记录每个写操作,并追加到文件中。开启后,执行redis的数据命令后,就会把命令写到aof文件中去。
Redis重启时会根据日志文件的内容把写指令从前向后执行一遍,以完成数据的恢复工作。