缓存:根据键值过期时间设置
请求频率限制:比如短信验证码120秒内只能发送一次,则将标志性的key-value键值对设置过期时间为120秒,用户请求的时候判断一下【SET key value EX 120 NX】
排行榜:利用zset数据类型
计数器:利用 INCR KEY 命令,key不存在初始化为0,存在则自增1
用户爱好:利用set集合,其特有的命令方法能够计算用户共同爱好
消息队列:利用list数据类型的lpush和brpop
分布式锁:利用 SET key value [EX seconds] [PX milliseconds] [NX|XX]
- 纯内存访问
- 底层I/O用多路复用技术epoll实现
- 单线程避免了线程切换和竞争
- 字符串(String):内部编码【8个字节长整型:int】【小于等于39个字节的字符串:embstr】【大于39个字节的字符串:raw】
- 哈希(Hash):内部编码【元素个数小于512个并且每个值都小于64字节:ziplist-压缩列表】【否则是hashtable-哈希表】
- 列表(List):内部编码【元素个数小于512个并且每个值都小于64字节:ziplist-压缩列表】【否则是linkedlist-链表】
- 集合(Set):内部编码【元素都是整数并且个数小于512个:intset-整数集合】【否则是hashtable-哈希表】
- 有序集合(ZSet):内部编码【元素个数小于128个并且每个值都小于64字节:ziplist-压缩列表】【否则是skiplist-跳跃表】
触发:save或者bgsave命令。不同的是save会阻塞服务器,直到持久化完成;bgsave会fock子进程,子进程负责完成持久化的任务,这种只在fock的时候会阻塞很短一部分时间。
RDB持久化流程:
Redis默认采用LZF算法对生成的RDB文件做压缩处理,压缩后的文件远远小于内存大小。
工作流程:
AOF重写流程:
首先主进程会fock一个子进程。Redis会维护一个AOF重写缓冲区,该缓冲区会在子进程创建新的AOF文件期间,记录服务器执行的所有写命令。当子进程完成创建新AOF文件之后,服务器会将重写缓冲区中的所有内容追加到新的AOF文件的末尾。最后,服务器用新的AOF文件替换旧的AOF文件,以此来完成AOF文件重写操作。
如果同时配置了RDB和AOF,则Redis会优先加载AOF
分布式环境下要解决把数据映射到多个节点的问题。
A:节点取余分区
【对key取hash】%【节点数量】,来决定数据打到哪一个节点上。
B:一致性哈希分区
为系统中每个节点分配一个token,范围为2的32次幂,这些token构成一个hash环。读写数据的时候,根据key取hash,然后顺时针找到第一个大于等于该hash值的token所对应的节点。
一致性哈希存在的问题:
C:虚拟槽分区
Redis Cluser采用虚拟槽分区,所有的键根据哈希函数映射到0~16383整数槽内,计算公式:slot=CRC16(key)&16383。每一个节点负责维护一部分槽以及槽所映射的键值数据
优点:解耦数据和节点之间的关系,简化了节点扩容和收缩难度。
不支持批量操作比如:mget,mset
不支持多数据库空间,即只有一个db0
原因:请求不存在的数据,而导致每次请求都要跳过缓存直接去存储层拿数据,失去了缓存保护后端存储的意义。
解决:
原因:比如有个热点key承载了大量请求,在key失效的一瞬间,大量请求跳过缓存直接去请求了数据库
解决:
原因:
解决:
这6种策略的前提都是:当内存不足以容纳新写入数据时
noeviction:新写入操作会报错(默认策略)
范围:在主键空间中
allkeys-lru:移除最近最少使用的key
allkeys-random:随机移除某个key
范围:在设置了过期时间的键空间中
volatile-lru:移除最近最少使用的key
volatile-random:随机移除某个key
volatile-ttl:有更早过期时间的key优先移除
原文:https://www.cnblogs.com/LUA123/p/12877791.html