1. 核心数据结构
- string : 主要用于单值缓存,对象缓存,分布式锁,计数器, 集群session共享, 全局id
- hash: 对象缓存,电商购物车。优点是归类存储,方便数据管理,相比string消耗内存更小,cpu更少,更节省空间。
缺点是集群架构下不适合大规模使用,过期功能不能使用在field上。 - list: 微博微信消息流。
- set:
- 微信抽奖小程序
- sadd act:1000 1 2 3 :添加抽奖人数
- smembers act:1000 : 查看全部抽奖人
- srandmember act:1000 1 : 开奖
- 微博点赞,收藏,标签
- 点赞 sadd like:消息id {用户id}
- 取消点赞: srem like:消息id {用户id}
- 检查用户是否点赞: sismember like:消息id {用户id}
- 获取点赞的用户列表: smembers like:消息id
- 获取点赞用户数: scard like:消息id
- 关注模型:
- 我关注的 : meset {A,B,C}
- 他关注的 : heset {B,C,D}
- 你关注的 : yuset {D,E,F}
- 共同关注 : sinter meset heset
- 我关注的也关注他: sismember meset B,sismember heset B
- 我可能认识的人: sdiff yuset heset
- zset:
- 微博热搜:
- 点击新闻 zincyby hotnews:20180919 1 守护香港
- 排行前十 zrevrange hotnews:20180919 0 9 withscores
- 七日搜索榜单: zunionstore hotnews:20180919-20180925 7 hotnews:20180919 … hotnews:20180925
- 七日排行前十: zrevrange hotnews:20180919-20180925 0 9 withscores
2. redis线程模型
- 纯内存操作
- 核心是基于非阻塞的IO多路复用机制
- 单线程反而避免了多线程频繁切换上下文的问题
3. redis性能调优
4. 电商购物车的实现
- 用户id为key,商品id为field,商品数量为value。
- 添加商品: hset cart:10001 10000 1
- 增加数量: hincrby cart:1001 10000 1
- 商品总数: hlen cart:1001
- 删除商品: hdel cart:1001
- 获取购物车所有商品: hgetall cart:1001
5. list常用操作
- lpush
- rpush
- lpop
- rpop
- lrange
- blpop key timeout
- brpop key timeout: 从key列表表尾弹出一个元素,若列表中没有元素,则阻塞等待 timeout 秒,若
timeout = 0,则一直阻塞等待。
6. set常用操作
- set基本操作
- sadd key member [member…]: 往集合key中存入元素,元素存在则忽略,key不存在则新建。
- srem key member [member…]: 从集合key中删除元素
- smembers key : 获取集合key中所有元素
- scard key: 获取集合key的元素个数
- sismember key member: 判断member是否存在集合key中。
- srandmember key [count] : 从集合key中选出count个元素,元素不从key中删除
- spop key [count] : 从集合key中选出count个元素,元素从key中删除
- set集合运算
- sinter set1 set2 set3 : 交集运算
- sunion set1 set2 set3 : 并集运算
- sdiff set1 set2 set3 : 差集运算(以第一个集合为基准,减去后面所有集合的并集)
7. zset常用操作
- 常用操作
- zadd key score member [score member…] : 往有序集合key中插入带分值元素
- zrem key member : 从有序集合key中删除元素
- zscore key member: 返回有序集合key中member元素的分值
- zincyby key increment member: 为有序集合key中元素member的分值加上increment
- zcard key : 返回有序集合key中元素个数
- zrange key start stop : 正序获取下标从start到stop的元素
- zrevrange key start stop: 倒序获取
- zset集合运算
- zunionstore deskkey numkeys key 并集计算
- zinterstore deskkey numkeys key 交集计算
8. 分布式锁
- synchronized(this){}只适用于单机环境。
- setnx key value
- 将key的值设为value,如果key的值已经存在,则不做任何改变。用于加锁。
- 在jedis中分布式锁实现(依然无法解决机率锁失效的问题):
public String lock(){
String lockKey = "product_001";
String clientId = UUID.randomUUID().toString();
try{
Boolean result = stringRedisTemplate.opsForValue().setIfAbsent(lockKey,
clientId,
10,
TimeUnit.SECONDS
);
if(!result){
return "error_code";
}
int stock = Integer.parseInt(stringRedisTemplate.opsForValue().get("stock"));
if(scock > 0){
int realStock = stock - 1;
stringRedisTemplate.opsForValue().set("stock",realStock+"");
System.out.println("秒杀成功,剩余库存"+realStock);
}else{
System.out.println("秒杀已结束");
}
}finally{
if(clientId.equals(stringRedisTemplate.opsForValue().get(lockKey))){
stringRedisTemplate.delete(lockKey);
}
}
}
public String lock(){
String lockKey = "product_001";
Rlock redissonLock = redisson.getLock(lockKey);
try{
redissonLock.lock();
int stock = Integer.parseInt(stringRedisTemplate.opsForValue().get("stock"));
if(scock > 0){
int realStock = stock - 1;
stringRedisTemplate.opsForValue().set("stock",realStock+"");
System.out.println("秒杀成功,剩余库存"+realStock);
}else{
System.out.println("秒杀已结束");
}
}finally{
redissonLock.unlock();
}
}
9. zookeeper架构定义
- CAP架构:
- redis是AP架构, zookeeper是CP架构
- zookeeper的zab选举机制
10. 高并发式分布锁的实现
11. 一线大厂技术栈
- 分布式架构
- 微服务架构
- 源码分析
- 性能优化
- 数据结构与算法
- 高并发项目实战
- 工程化协作
- 并发编程
12. 微服务与分布式的区别
- 微服务算是分布式的一环。
- 微服务强调的是个体,分布式强调的是整体。
13. dubbo与spring cloud的区别
- dubbo相当于spring cloud下的一个子集
- spring cloud是微服务架构一个完整的解决方案
14. redis特性
- 非关系型的键值对数据库,可以以O(1)的时间复杂度快速插入或取出值。
- 数据是存在内存中的
- 键的类型可以是字符串,整型,浮点型,键是唯一的。
- 内置了复制,lua脚本,磁盘持久化,事务,ssl,客户端代理等功能
- 通过redis哨兵和自动分区提供高可用性。
- 存储海量数据与高性能存取