Redis学习笔记

Redis笔记

概览

简单介绍:
主从复制
一般 一台做master主机,多台slave从机
主节点只写,从节点只读,帮忙分担压力
redis加入哨兵,最好是奇数个,这样好投票
如果主节点挂了,投票大于一般后,哨兵会从slave里从新选取一个当主节点

io多路复用,
水龙头流水:
在这里插入图片描述

提高系统吞吐量
在这里插入图片描述

1、常用指令

redis-cli自带客户端

  1. select xxx 可以切换到别的库
  2. set imooc:users:1 zhangsan 层级概念 类似库表
  3. keys * 统计当前库有多少键
  4. info CPU 等查看信息
  5. flushall 清除所有数据

redis的java客户端 受欢迎的是jedis和lettuce

jedis是redis官方提供的,java redis的缩写

  1. jedis.ping() 心跳机制检测是否成功
  2. jedis.close() 关闭资源

2、实战项目

美食社交app,涉及用户单点登录,好友功能,排行榜,缓存,秒杀,订单,附近的人,feed
在这里插入图片描述
在这里插入图片描述

处理超卖,锁和事务,处理全球数据并发,缓存热点数据

微服务项目特定:

  • 职责单一【小】
  • 隔离性强【松】
  • 开发简单【便】

微服务搭建:
1、先建立父工程 parent
2、建立注册中心
3、建立网关服务(还需要添加路由,locator,routes)
在这里插入图片描述

4、建立服务模块(添加eureka client和web模块)

3、Redis的类型介绍

  1. strings
set k v
get k v
incr k
devr k
del k
  1. hashes 存储对象
hset k f v f v f v...
hget k v
hgetall k
hdel k
  1. 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);
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值