基本概念
数据结构
- SDS: simple dynamic string
- List: 双向链表
- Set: Hash的一种变种,通过hash存储于数组中;
- Hash:类似java语言的HashMap,
- ZSet:底层实现skipList
对于set,zset, hash和list类型,当键-值为整型或短字符串时,
底层实现使用压缩列表(内存连续且耗用内存小)
对于set,当全是整型时,使用整数集合
位操作及其使用场景
| 操作 | 解释 | 操作范例 |
|---|---|---|
| setbit | 设置 | SETBIT key offset value |
| getbit | 获取 | GETBIT key |
| bitcount | 计算被设置为 1 的比特位的数量 | BITCOUNT key [start] [end] |
| bitpos | 位图中第一个值为 bit 的位置 | BITPOS key bit [start] [end] |
| bitop | 对一或多个字符串 key 进行位元操作, destkey保存结果 | BITOP operation destkey key [key …] |
| BITFIELD|||
bitmap用以记录网站登陆次数
架构
- single 单机模式
- Replica 副本模式(5.0.4前称master-slave模式) - 保证数据安全
适合读写分离,且读多写少。副本节点负责读操作,主节点负责写操作。
主节点写操作完成后,副节点信息同步问题
- Sentinel 哨兵模式 ----保证高可用 Availability
基于主从复制架构,分布式系统中增加setinel来保证主节点工作
- Cluster 集群模式
持久化
- RDB
快照保存方式。属于全量复制。可采取save(同步阻塞)和bgsave(异
步非阻塞)两种方式。定期持久化,恢复耗时短,无法实时持久化
- AOF
保存数据增删改查操作。增量方式保存。实时持久化
垃圾回收
- 定时回收
- 惰性回收:再次访问时确定是否回收并执行回收操作
垃圾回收算法
noeviction: 报错
volatile-lru:超时键值的时间上来说最少访问算法 (访问一次即替换
表头,linkedhashmap的实现
allkeys-lru
volatile-lfu:超时键值的频次上来说最少访问,堆的实现
allkeys-lfu
volatile-random:随机删除
allkeys-random
volatile-ttl
Redis分布式锁 vs Zookeeper分布式锁
锁概念
| 锁/异同 | 互斥 | 抢占等待 | 中断 | 资源访问者队列 | ||
|---|---|---|---|---|---|---|
| 线程锁 | 是 | 是 | 超时中断/阻塞中断 | 有,如AQS | ||
| 分布式锁 | 是 | 是 | 超时中断 | 根据实现方式 |
| 分布式锁/异同 | 死锁解决 | 等待队列 | 锁操作 | 问题/锁失效 | |||
|---|---|---|---|---|---|---|---|
| memcached分布式锁 | |||||||
| redis分布式锁 | 超时释放 | 无 | set+nx+ex | 锁早释放;del归属和原子性 | 适合业务耗时不长 | ||
| zookeeper分布式锁 | |||||||
| chubby分布式锁 |
Redis分布式锁解决框架
Redis vs Spring
-
spring-boot内置redis的自动装配机制,提供两种 1. Jedis 2. Lettuce(响应式开发)
-
spring-boot 2.0及其后续版本优先支持Lettuce相关连接,当lettuce相关依赖不存在时,使用Jedis, 可通过排除lettuce相关api实现jedis的选用。
延伸
-
lfu 不适合作为热点数据查询算法,热点数据存在阶段性,历史访问频次会影响新数据查询。较适合随机访问场景,数据的平均访问量相当
-
paxos--选举算法