Redis高级_分布式锁
分布式锁基本原理和实现方式对比
分布式锁:满足分布式系统或集群模式下多线程课件并且可以互斥的锁
分布式锁的核心思想就是让大家共用同一把锁,那么我们就能锁住线程,不让线程进行,让程序串行执行,这就是分布式锁的核心思路
那么分布式锁应该满足一些什么条件呢?
可见性:多个线程都能看到相同的结果。
注意:这里说的可见性并不是并发编程中指的内存可见性,只是说多个进程之间都能感知到变化的意思
互斥:互斥是分布式锁的最基本条件,使得程序串行执行
高可用:程序不易崩溃,时时刻刻都保证较高的可用性
高性能:由于加锁本身就让性能降低,所以对于分布式锁需要他较高的加锁性能和释放锁性能
安全性:安全也是程序中必不可少的一环
常见的分布式锁有三种
MySQL:MySQL本身就带有锁机制,但是由于MySQL的性能一般,所以采用分布式锁的情况下,使用MySQL作为分布式锁比较少见
Redis:Redis作为分布式锁是非常常见的一种使用方式,现在企业级开发中基本都是用Redis或者Zookeeper作为分布式锁,利用SETNX这个方法,如果插入Key成功,则表示获得到了锁,如果有人插入成功,那么其他人就回插入 ...
Redis高级_优惠劵秒杀
优惠券秒杀Redis实现全局唯一ID
在各类购物App中,都会遇到商家发放的优惠券
当用户抢购商品时,生成的订单会保存到tb_voucher_order表中,而订单表如果使用数据库自增ID就会存在一些问题
id规律性太明显
受单表数据量的限制
如果我们的订单id有太明显的规律,那么对于用户或者竞争对手,就很容易猜测出我们的一些敏感信息,例如商城一天之内能卖出多少单,这明显不合适
随着我们商城的规模越来越大,MySQL的单表容量不宜超过500W,数据量过大之后,我们就要进行拆库拆表,拆分表了之后,他们从逻辑上讲,是同一张表,所以他们的id不能重复,于是乎我们就要保证id的唯一性
那么这就引出我们的全局ID生成器了
全局ID生成器是一种在分布式系统下用来生成全局唯一ID的工具,一般要满足一下特性
唯一性
高可用
高性能
递增性
安全性
为了增加ID的安全性,我们可以不直接使用Redis自增的数值,而是拼接一些其他信息
ID组成部分
符号位:1bit,永远为0
时间戳:31bit,以秒为单位,可以使用69年(2^31秒约等于69年)
序列号:32bit,秒内的计数器,支持每秒传输 ...
Redis高级_商户查询缓存
商户查询缓存什么是缓存
什么是缓存?
缓存就像自行车、越野车的避震器
举个例子
越野车、山地自行车都有避震器,防止车体加速之后因惯性,在U型地形上飞跃硬着陆导致损坏,像个弹簧意义
同样,在实际开发中,系统也需要避震器,防止过高的数据量猛冲系统,导致其操作线程无法及时处理信息而瘫痪
在实际开发中,对企业来讲,产品口碑、用户评价都是致命的,所以企业非常重视缓存技术
缓存(Cache)就是数据交换的缓冲区,俗称的缓存就是缓冲区内的数据,一般从数据库中获取,存储于本地,例如
本地用高并发
1Static final ConcurrentHashMap<K,V> map = new ConcurrentHashMap<>();
用于Redis等缓存
1static final Cache<K,V> USER_CACHE = CacheBuilder.newBuilder().build();
本地缓存
1Static final Map<K,V> map = new HashMap();
由于其被stati ...
Redis高级_短信登录
内容概述
短信登录
这部分会使用Redis共享session来实现
但其实我在之前的瑞吉外卖的项目优化部分就做过了,用Redis替换session来存储邮箱验证码
商户查询缓存
这部分要理解缓存击穿,缓存穿透,缓存雪崩等问题,对于这些概念的理解不仅仅是停留在概念上,更是能在代码中看到对应的内容
优惠券秒杀
这部分我们可以学会Redis的计数器功能,结合Lua(之前一直想学Lua然后写饥荒mod)完成高性能的Redis操作,同时学会Redis分布式锁的原理,包括Redis的三种消息队列
附近的商户
利用Redis的GEOHash(新数据结构,前面没有应用场景就没介绍)来完成对于地理坐标的操作
UV统计
主要是使用Redis来完成统计功能
用户签到
使用Redis的BitMap数据统计功能
好友关注
基于Set集合的关注、取消关注,共同关注等等功能,这部分在上篇的练习题中出现过,这次我们在项目中来使用一下
达人探店
基于List来完成点赞列表的操作,同时基于SortedSet来完成点赞的排行榜功能
短信登录导入项目在实现功 ...
Redis基础
初识RedisRedis是一种键值型的NoSQL数据库,这里有两个关键字
键值型
NoSQL
其中键值型是指Redis中存储的数据都是以Key-Value键值对的形式存储,而Value的形式多种多样,可以使字符串、数值甚至Json而NoSQL则是相对于传统关系型数据库而言,有很大差异的一种数据库
认识NoSQLNoSql可以翻译做Not Only Sql(不仅仅是SQL),或者是No Sql(非Sql的)数据库。是相对于传统关系型数据库而言,有很大差异的一种特殊的数据库,因此也称之为非关系型数据库。
结构化与非结构化传统关系型数据库是结构化数据,每张表在创建的时候都有严格的约束信息,如字段名、字段数据类型、字段约束等,插入的数据必须遵循这些约束而NoSQL则对数据库格式没有约束,可以是键值型,也可以是文档型,甚至是图格式
关联与非关联传统数据库的表与表之间往往存在关联,例如外键约束而非关系型数据库不存在关联关系,要维护关系要么靠代码中的业务逻辑,要么靠数据之间的耦合
12345678910111213141516171819{ id: 1, name: "张 ...
类加载器、反射
1.类加载器1.1类加载器【理解】
作用负责将.class文件(存储的物理文件)加载在到内存中
1.2类加载的过程【理解】
类加载时机
创建类的实例(对象)
调用类的类方法
访问类或者接口的类变量,或者为该类变量赋值
使用反射方式来强制创建某个类或接口对应的java.lang.Class对象
初始化某个类的子类
直接使用java.exe命令来运行某个主类
类加载过程
加载
通过包名 + 类名,获取这个类,准备用流进行传输
在这个类加载到内存中
加载完毕创建一个class对象
链接
验证确保Class文件字节流中包含的信息符合当前虚拟机的要求,并且不会危害虚拟机自身安全(文件中的信息是否符合虚拟机规范有没有安全隐患)
准备负责为类的类变量(被static修饰的变量)分配内存,并设置默认初始化值(初始化静态变量)
解析将类的二进制数据流中的符号引用替换为直接引用(本类中如果用到了其他类,此时就需要找到对应的类)
初始化根据程序员通过程序制定的主观计划去初始化类变量和其他资源(静态变量赋值以及初始化其他资源)
小结
当一个类被使用的时候,才会加载到内存
类加载的过程: 加载 ...
docker网络_docker-compose
3 Docker微服务实战3.1 通过IDEA新建一个普通微服务模块建Moduledocker_boot改POM
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061<?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersio ...
docker_3
1 Docker复杂安装详说1.1 安装MySQL主从复制1.1.1 主从复制原理MySQL主从复制原理_牛奔的博客-CSDN博客
1.1.2 主从搭建步骤
新建主服务器容器实例3307
123456docker run -p 3307:3306 --name mysql-master \-v /mydata/mysql-master/log:/var/log/mysql \-v /mydata/mysql-master/data:/var/lib/mysql \-v /mydata/mysql-master/conf:/etc/mysql \-e MYSQL_ROOT_PASSWORD=root \-d mysql:5.7
进入/mydata/mysql-master/conf目录下新建my.cnf
vim my.cnf
12345678910111213141516[mysqld]## 设置server_id,同一局域网中需要唯一server_id=101 ## 指定不需要同步的数据库名称binlog-ignore-db=mysql ## ...
docker_2
4 Docker镜像4.1 是什么是一种轻量级、可执行的独立软件包,它包含运行某个软件所需的所有内容,我们把应用程序和配置依赖打包好形成一个可交付的运行环境(包括代码、运行时需要的库、环境变量和配置文件等),这个打包好的运行环境就是image镜像文件。只有通过这个镜像文件才能生成Docker容器实例(类似Java中new出来一个对象)。
4.1.1 分层的镜像以我们的pull为例,在下载的过程中我们可以看到docker的镜像好像是在一层一层的在下载
4.1.2 UnionFS(联合文件系统)UnionFS(联合文件系统):Union文件系统(UnionFS)是一种分层、轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下(unite several directories into a single virtual filesystem)。Union 文件系统是 Docker 镜像的基础。镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。特性:一次同时加载多个文件系统,但从外面看起来 ...
springboot
学习目标
基于SpringBoot框架的程序开发步骤
熟练使用SpringBoot配置信息修改服务器配置
基于SpringBoot的完成SSM整合项目开发
一、SpringBoot简介1. 入门案例问题导入SpringMVC的HelloWord程序大家还记得吗?
SpringBoot是由Pivotal团队提供的全新框架,其设计目的是用来简化Spring应用的初始搭建以及开发过程
1.1 入门案例开发步骤①:创建新模块,选择Spring初始化,并配置模块相关基础信息②:选择当前模块需要使用的技术集
③:开发控制器类
123456789@RestController@RequestMapping("/books")public class BookController { @GetMapping("/{id}") public String getById(@PathVariable Integer id) { System.out.println("id ==& ...