数据结构
dict
字典表有两个dictht哈希表,为了方便rehash。<br>在扩容时,将一个dictht的键值对rehash到另一个dictht上,然后释放空间、并交换角色<br>
跳跃表
可以理解为多层有序链表,下层元素一定包含上层元素,<br>且每个元素有指向下一个元素和下一层元素的指针<br>
插入时是否上浮由概率决定,1/2概率效率最高<br>
使用场景
缓存
常见问题
缓存穿透
数据库中不存在key导致
<ul><li>设置key为null</li></ul>
<ul><li>增加布隆过滤器过滤,false不再去查询db</li></ul>
缓存击穿
热点数据失效,导致大量请求打到db
<ul><li>更新热点缓存数据加锁</li></ul>
<ul><li>同时设置缓存标识(30分钟过期)、缓存数据(60分钟过期),<br>当缓存标识过期时,主动更新缓存,其他请求依然返回原有缓存数据</li></ul><br>
缓存雪崩
大量缓存同时过期
在原有过期时间的基础上价格随机值,避免大量缓存数据同时失效<br>
业务层请求db加锁,避免大量请求同时打到db-治标不治本<br>
解决方案
文档:Redis缓存穿透、雪崩.note<br>链接:http://note.youdao.com/noteshare?id=08eb142f139e10289cc50963ba057608&sub=0181347F60B1404397BED27EFBE85A1B
消息队列-发布订阅,建议使用kafka、rocketmq
会话session管理
Redis Memcached
数据类型<br>
<ul><li>redis支持string/list/set/zset/hash</li></ul>
<ul><li>memcached支持string</li></ul>
持久化
<ul><li>redis支持rdb、aof持久化</li></ul>
<ul><li>memcached不支持持久化</li></ul>
分布式
<ul><li>redis支持客户端、代理、服务端(RedisCluster)分片</li></ul>
<ul><li>memcached支持客户端hash分布式存储</li></ul>
内存管理机制<br>
<ul><li>redis并不是所有的数据都在内存中,可以将一些很久不用的value交换到磁盘,<br>memcached所有数据都在内存中</li></ul><br>
<ul><li>memcached将内存分割成固定大小的块,以解决内存碎片的问题,内存利用率不高</li></ul>
过期时间
可以为每个键设置过期时间
对于hash类型,只能为整个键设置过期时间(整个散列表)<br>
淘汰策略
失效算法
LRU
Least Recently Used、最近最少使用
LFU
Least Frequently Used、使用频率最少
失效策略
volatile-lru/volatile-random/volatile-lfu<br>
allkeys-lru/allkeys-random/allkeys-lfu
持久化
rdb
数据快照--将某个时间点的所有数据存储在硬盘<br>
原子性
事务
事务中的多条命令会一次发送到服务端,减少客户端与服务端通信<br>
watch key
mutil
dosomething
exec
watch类似于乐观锁,exec时发现有其他客户端修改了key,则执行失败
lur脚本
复制
通过slave of host port实现一个服务器成为另一个服务器的从<br>
<ul><li>主服务器创建快照文件并发送给从服务器,在发送期间将写命令记录在缓冲区,</li></ul>发送完快照后,将缓冲区的写命令发送给从服务器<br>
<ul><li>从服务器丢弃所有旧数据,加载主服务器发送过来的快照,之后接收主服务器的写命令</li></ul>
<ul><li>主服务器没执行一次写命令,就向从服务器发送相同的写命令</li></ul>