数据结构
String:缓存对象、常规计数、分布式锁、共享session信息
hash:(包含键值对的无序散列表)
list:消息队列
set:聚合计算、点赞、公共关注、抽奖活动
zset:(格式key、value、score根据score进行排序)排名,排序
@Override
public Boolean zAdd(String key, Object value, long score) {
return redisTemplate.opsForZSet().add(key,value,score);
}
zset是使用跳表实现的:实现了一种「多层」的有序链表
第一层有五个节点、第二层有三个节点、第三层有1个节点
比如当查找4节点时,先跳到3节点,然后再跳到4节点。时间复杂度O(logn)
线程模型
1.为什么redis快(10w/s)?
-
操作都是在内存中进行的。
-
单线程,没有线程的切换。
-
redis的io多路复用
2.redis的单线程
单线程:接收客户端请求–》解析请求—》进行数据读写操作—》发送数据给客户
redis为耗时的操作单独开辟线程,比如关闭文件、AOF刷盘、删除大key值
Redis 6.0 版本之后,也采用了多个 I/O 线程来处理网络请求
事务
lua脚本
日志
1.AOF日志
每次对数据的操作都把命令写入日志。当redis重启时,会读取文件中的命令,重新执行。
写回策略:always、everysec(秒)、no
AOF日志记录的是全量的操作命令,恢复的时候需要全部执行,恢复缓慢。
优点:数据安全性更好、有多种重写策略、可以通过aof文件重写机制优化
缺点:消耗磁盘空间大,当aof文件大且没开启aof重写机制时,恢复慢
2.RDB快照
将某一时刻的内存数据以二进制的形式写入磁盘
rdb比aof效率高,因为rdb是快照的形式恢复。
生成rdb文件的命令:save(阻塞主线程)、bgsave(创建子线程生成rdb文件)
优点::备份速度快,文件体积小。fork子进程,不会阻塞主进程
**缺点:**两次快照之间如果故障就会数据丢失
缓存淘汰和过期删除
1.内存淘汰策略:在内存快满的时候,触发内存淘汰策略。
策略:
–不进行数据淘汰,当满了之后再插入就通知禁止写入。
–进行淘汰:
-----淘汰设置了过期时间:随机淘汰、淘汰更早的、淘汰最久没使用
淘汰最少使用
------在所有范围内淘汰:随机、最久没使用、最少使用
2.过期删除策略:删除过期的key,采用的是惰性删除+定期删除。
每隔一段时间「随机」从数据库中取出一定数量的 key 进行检查,并删除其中的过期key。