1、redis的五种数据类型
string:
命令:设置值:set key value,取值get key
内部原理:字符串对象可以使用 int、raw、emstr三种encoding;
int :set num 100,100a是 raw编码
emstr:保存的值小于40则使用emstr,set num 111111111111111111111111111111111111111
raw:保存的值大于等于40,使用raw
list:
命令:左插入:lpush key val1 val2 val3 … valn,左弹出:lpop key ,右插入: rpush,右弹出: rpop
内部原理:列表对象的编码支持ziplist、linkedlist;
ziplist:采用压缩列表实现,每个列表节点保存一个列表中的元素
linkedlist:采用双向链表实现,每个列表节点保存一个列表中的元素
编码装换规则:同时满足以下两个条件,是ziplist类型,否则是linkedlist类型
条件1:列表中所有元素长度都小于66字节
条件2:列表中元素的个数小于512个
set:
命令:添加元素:sadd key value ,取值:smembers key ,如果值是数字类型取出时自动排序,例:sadd num 213,smembers num 是123
内部原理:集合对象的编码可以是intset和hashtable;
intset:intset编码集合对象使用整数集合作为底层实现,集合对象包含的所有元素都被保存在整数集合里面
hashtable:底层字典作为底层实现,每个键都是一个字符串对象,每个字符串对象包含了一个集合元素,而字典的值则全部被设置为null
编码装换规则:当创建结合类型时,如果集合的元素个数小于512个,且元素都为整数编码为intset,如果元素和元素值不满足intset编码条件,则采用hashtable编码保存
zset(有序结合):
命令:添加元素:zadd score 112 xiaohong 113 xiaoming,正序输出:zrange 0 -1(元素从小到大),倒序输出:zrevrange 0 -1
内部实现:编码的内部实现是ziplist和skiplist(跳表)
ziplist:压缩列表实现,第一个节点保存元素的成员,第二个节点保存与元素的分值,压缩列表内的集合元素按分值从小到大进行排序
skiplist:底层采用zset结构,一个zset包含一个字典和一个跳表
hash:
命令:添加元素:hset pig leg “26rmb”,获取值:hget pig leg,批量添加、获取分别是:hmset、hmget
内部实现:内部编码支持ziplist和hashtable
ziplist:添加键值对时,先将key加入到列表队尾,然后将value加入到列表队尾
编码转换规则:
同时满足以下两个条件是ziplist,否是是hashtable
条件1:哈希对象所有的键值对,key和value的长度均小于46字节
条件2:哈希对象中键值对的个数小于512个
消息队列:
实时消息队列:
可以使用list实现:rpush——>blpop 或 lpush——>brpop
延时消息队列:
采用zset实现,插入队列时,通过将发送时间赋值给score,来进行发送时间的排序
采用jedis.zrangeByScore(delayQueue, 0, System.currentTimeMills(), 0, 1)来获取一个时间段的一条消息
采用jedis.zrem(delayQueue, 消息),如果执行成功,说明消息消费成功,解析消息逻辑处理
redis持久化:
RDB:
RDB持久化产生的文件是一个压缩过的二进制文件,是dump.rdb格式。服务器启动,自动加载RDB文件,加载过程处于阻塞状态,直到加载完成,由于AOF文件的更新频率比RDB高,所以,如果服务器开启了AOF持久化功能,优先加载AOF文件
由于BGSAVE命令执行时是不阻塞主服务进程的,所以可以通过save选项来实现每一段时间执行BGSAVE命令
设置自动保存,redis.conf文件中
save 900 1 //900秒内,执行1次修改操作
save 300 10 //300秒内,执行10次修改操作
save 60 10000 //60秒内,执行10000次修改操作
满足任意一个,即会执行BGSAVE命令
AOF:
appendonly yes // 默认为no,打开为yes
AOF持久化分为3步:命令追加(append)——>文件写入——>文件同步(sync)
追加:每次执行完一个写命令之后,都会把写命令以请求协议格式保存到aof_buf缓冲区的末尾
写入和同步:redis服务器进程是一个事件循环,在每一次的事件循环结束之前,都会调用flushAppendOnlyFile函数,判断是否将aof_buf缓冲区的内容写入和同步到AOF文件中