Redis笔记
概览
简单介绍:
主从复制
一般 一台做master主机,多台slave从机
主节点只写,从节点只读,帮忙分担压力
redis加入哨兵,最好是奇数个,这样好投票
如果主节点挂了,投票大于一般后,哨兵会从slave里从新选取一个当主节点
io多路复用,
水龙头流水:
提高系统吞吐量
1、常用指令
redis-cli自带客户端
- select xxx 可以切换到别的库
- set imooc:users:1 zhangsan 层级概念 类似库表
- keys * 统计当前库有多少键
- info CPU 等查看信息
- flushall 清除所有数据
redis的java客户端 受欢迎的是jedis和lettuce
jedis是redis官方提供的,java redis的缩写
- jedis.ping() 心跳机制检测是否成功
- jedis.close() 关闭资源
2、实战项目
美食社交app,涉及用户单点登录,好友功能,排行榜,缓存,秒杀,订单,附近的人,feed
处理超卖,锁和事务,处理全球数据并发,缓存热点数据
微服务项目特定:
- 职责单一【小】
- 隔离性强【松】
- 开发简单【便】
微服务搭建:
1、先建立父工程 parent
2、建立注册中心
3、建立网关服务(还需要添加路由,locator,routes)
4、建立服务模块(添加eureka client和web模块)
3、Redis的类型介绍
- strings
set k v
get k v
incr k
devr k
del k
- hashes 存储对象
hset k f v f v f v...
hget k v
hgetall k
hdel k
- lists 类似java中的linkedList 双向链表 查找很快
lpush k v v v...
rpush k v v v...
l pop k
r pop k
lrange k 区间
5. 类似java中的hashSet,内部是一个value永远为空的hashMap
sadd key value1 value2
smembers key
srem key
spop key
sinter key
(交集实现共同好友)
7. sorted sets 有序集合
zadd key value
zrange
二分查找:在一个有序的列表里 收尾相加除于二得到mid 不断的迭代查找左右部分,直到找到最终数据
zset Skip list实现的
4、业务:用户注册
单点登录
用户只登陆一次,访问到大的系统的任何地方随意访问。
spring security 认证 oAuth2授权 token令牌
网关 授权认证中心
4.1、公共项目环境搭建
一些基本返回、异常接口、非空判断工具类等
4.2、授权中心搭建
包含令牌返回增强,可以加入需要给前端的一些参数
/**
* 配置授权以及令牌的访问端点和令牌服务
*
* @param endpoints
* @throws Exception
*/
@Override
public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception {
// 认证器
endpoints.authenticationManager(authenticationManager)
// 具体登录的方法
.userDetailsService(userService)
// token 存储的方式:Redis
.tokenStore(redisTokenStore)
// 令牌增强对象,增强返回的结果
.tokenEnhancer((accessToken, authentication) -> {
// 获取登录用户的信息,然后设置
SignInIdentity signInIdentity = (SignInIdentity) authentication.getPrincipal();
LinkedHashMap<String, Object> map = new LinkedHashMap<>();
map.put("nickname", signInIdentity.getNickname());
map.put("avatarUrl", signInIdentity.getAvatarUrl());
DefaultOAuth2AccessToken token = (DefaultOAuth2AccessToken) accessToken;
token.setAdditionalInformation(map);
return token;
});
}
4.3、登录相关逻辑
会通过远程调用来调用/oauth/token的接口,传入用户名和密码即可
校验完会返回令牌和封装的信息
用户中心user/me 可以直接拿access_token 访问用户信息
退出逻辑,清除access和refresh的Token
4.5、网关
全局校验,看看有没有令牌,有没有效,有才放行
idea:使用技巧 rundashboard 在 3-10章节 配置
4.6、Redis具体应用
4.6.1、抢购代金券
秒杀特点:
1.并发,大量请求
2.请求量大于库存
可以限流,漏斗,异步(消息队列)
4-2 有压测的模拟 Jmeter5.0
一、5000的并发,2000的账号,结果是230多订单超卖了,库存变为负数了(要解决超卖问题)
二、一个用户,抢10000次(要解决一个用户只能买一件商品)结果是一个人买了4个
4-3 使用 hash
解决:
使用redis防止超卖:使用lua脚本保证redis的原子性(查询和更新库存在一个线程里做)
使用redis的分布式锁防止一人多单
生产一般都用Redisson
4.6.2、好友互助取关
通过redis构建两个set
/**
* 添加关注列表到 Redis
*
* @param dinerId
* @param followDinerId
*/
private void addToRedisSet(Integer dinerId, Integer followDinerId) {
redisTemplate.opsForSet().add(RedisKeyConstant.following.getKey() + dinerId, followDinerId);
redisTemplate.opsForSet().add(RedisKeyConstant.followers.getKey() + followDinerId, dinerId);
}
/**
* 移除 Redis 关注列表
*
* @param dinerId
* @param followDinerId
*/
private void removeFromRedisSet(Integer dinerId, Integer followDinerId) {
redisTemplate.opsForSet().remove(RedisKeyConstant.following.getKey() + dinerId, followDinerId);
redisTemplate.opsForSet().remove(RedisKeyConstant.followers.getKey() + followDinerId, dinerId);
}