Q:为什么需要Redis 数据从单表,演进出了分库分表 MySQL从单机演出了集群: 1、数据量增长, 2、读写数据压力不断大增加 数据分冷热: 热数据,经常被访问到的数据 将热数据存储到内存(Redis)中,经常读取 读场景: 服务器判断数据在内存中是否存在,存在直接返回 写场景: 变更写入Redis Redis基本工作原理: 1、数据从内存中读写 2、数据保存到硬盘上防止重启数据丢失 (1)增量数据保存到AOF文件 (2)全量数据RDB文件 3、单线程处理所有操作命令(顺序执行) 服务器重启,内存数据丢失,利用Redis,数据可实现持久化 使用RESP协议 案例: 1、连续签到 incr在现有数字上加一 string数据结构; sds 可以存储字符串、数字、二进制数据 通常和expire配合使用 场景:存储计数、Session buf:寻址 2、消息通知 用list作为消息队列 使用场景:消息通知例如当文章更新时,将更新后到文章推送到 ES、用户就能搜索到最新的文章数据 队列:先进先出 List数据结构Quicklist: Quicklist由一个双向链表和listpack实现 为了节省内存,一个节点存很多个数据 num记录元素 listpack对应32位 3、计数 一个用户有多项计数需求,可通过Hash结构存储 每次只对应当中的元素 写多条记录:利用pipe,减少传输 Hash数据结构dict rehash;将ht[0]中的数据全部迁移到ht[1]中,数据量小到场景下,直接将数据从0拷贝到1速度时较快的,数据量大的场景迁移过程明显会阻塞用户请求 渐进式rehash;基本原理,每次用户访问时都会迁移少量数据,将整个迁移过程平摊到所有访问用不请求过程中 0槽位不够时需要扩容,每次扩容一部分key,扩容后迁移至1 扩容完毕0指向1,1指向null,即指针进行交换 核心:不能阻塞用户访问 4、排行榜 结合dict后,可通过实现key操作跳表功能 zadd初始化榜单 zscore增加积分 zset 数据结构zskiplist 查找7到路径: head,3,3,7 dict;key操作跳表