怎么做转载小说网站,aspx网站架设,网络规划设计师教程第二版下载,珠宝网站制作学习笔记系列开头惯例发布一些寻亲消息
链接#xff1a;https://baobeihuijia.com/bbhj/contents/3/194205.html
跟学链接
跟学视频链接#xff1a;https://www.bilibili.com/video/BV1S54y1R7SB/?spm_id_from333.999.0.0 #xff08;建议有java基础的同学学习或者一直…学习笔记系列开头惯例发布一些寻亲消息
链接https://baobeihuijia.com/bbhj/contents/3/194205.html
跟学链接
跟学视频链接https://www.bilibili.com/video/BV1S54y1R7SB/?spm_id_from333.999.0.0 建议有java基础的同学学习或者一直跟着狂神系列的同学学习
Nosql 发展历史 Structured Query Language 单机mysql-读写分离cache-集群MyISAM表锁-行锁 Innodb-分库分表mysql集群mysql关系数据库- NoSQL非关系型数据库不需要关注数据的类型 3V3高 海量多样实时并发可扩性能 NoSql的四大类型 KV键值对redis 内容缓存查找快文档形式 MongoDB 基于分布式文件存储处理大量文档MongoDB是一个介于关系和非关系数据库的产品 列存储 HBase容易进行分布式扩展 图关系数据库 社交拓扑图存储的是关系朋友圈社交网络广告推荐InfoGrid Redis远程字典服务 内存存储、持久化存储内存中断电即失但是redis可以做到持久化效率高、高速缓存发布、订阅系统地图信息分析计时器、计数器、浏览量
Redis 基本语法 redis默认有16个数据库 redis为什么单线程还这么快 cpu内存硬盘,所以cpu不是redis的性能瓶颈redis是将所有数据全部放入内存中而多线程操作的话cpu会有切换上下文的耗时操作对于内存系统没有上下文切换操作效率就是最高的 redis是内存中的数据结构存储系统可以用作数据库缓存和消息中间件 value数据类型 String/还可以是数字可以增减计数器/实时粉丝数量 select 1set name xxxAPPEND name xxx补加如果不存在那就相当于新建get nameDBSIZEkeys * 显示全部数据flushdb清除当前数据库flushall 清空所有数据库EXISTS namemove name xx是哪个数据库EXPIRE name 10 控制name十秒过期ttl name 剩余过期时间type name查看name即key的类型STRLEN name求name的长度incr/decr name 浏览量±INCRBY name 5 (一次性增加5)GETRANGE name 0 3 类似substring全部的话就是 0 -1SETRANGE name 1 “shixh” 从第一个位置开始修改后边数据为shixhsetnx 如果不存在就set存在就算了分布式锁setex 设置过期时间mset/ mget 一次性设置和get多个值是原子性操作要么成功要么失败set user:1:name zhangsan 作为对象缓存更多的是用hash存getset先get后set List 可以作为消息队列、栈 LPUSH name one 头插RPUSH name two 尾插 LPOP nameRPOP nameLset name 1 rrr ( 修改name指定位置的值)Lindex name 1通过下表获取name中第一个值Llen nameLrem name 3 one (移除从上到下3个one)Ltrim name 0 1只截取这部分保留下来LRANGE name 0 -1 获取全部RpopLpush name othername(移除name结尾并将该元素加到othername开头) set无序不能有重复 sadd myset ”hello“sremove myset ”hello“scard myset 求长度smembers myset 查看所有值sismember myset ”hello“ 判断是否在set中srandmember 随机抽取元素spop 随机删除元素smove myset1 myset2 ”hello“ 将制定的值移动到另外一个set共同关注 sdiff key1 key2 差集sinter key1 key2 交集 共同好友的实现微博b站好友推荐sunion key1 key2 并集 Hash key-map集合用作一个用户多个信息的保存尤其是经常变动的信息 hset user name 崔志雅 age 23 ismarried no hset myhash filed1 aaahget myhash filed1得到结果aaahmset myhash field1 hello field2 worldhmgethgetall myhash 得到结果field1 hello filed2 worldhdelete myhash filed1hlen myhash 获取键值对的数量hexist myhash filed1hkeys myhash / hvals myhashhset myhash filed3 5hincrby myhash filed3 -1hsetnx myhash filed3 存在就失败 zset有序集合zset 成绩排序/ 对消息进行带权重执行/ 排行榜 热榜 zadd myset 1 onezrange myset 0 1zadd salary 2388 hongzrem myset hongzadd salary 300 zhansganzrangebyscore salary -inf inf 对salary排序从最小到最大 -inf inf是score排序区间范围zrevrange myset 0 -1 从大到小排序zrangebyscore salary -inf inf withscores 就是排序并且加上scorezcard myset 获取有序集合中的个数 三种特殊的数据类型 geospatial 地理位置 算地理位置 两地距离算方圆几里的人 底层实现原理是zset官方没有给删除但是可以自己关掉自己的定位信息 用zrange 查看全部用zrem删掉超过南北极直接判定无法添加 先经度后维度geoadd china:city 115.00 39.00 beijinggeopos china:city beijing 获取北京的经纬度geodist china:city beijing shanghai km 求两人定位之间的距离georadius china:city 110 30 1000 km 满足半径的我附近的人 【我附近的人】georadius china:city 110 30 1000 km withcoord 返回他人的带经纬度georadius china:city 110 30 1000 km withdist count 1 限定返回数量为1georadiusbymember china:city shanghai 400 km 以上海为中心的400km以内的 【用于定位】 Hyperloglog 占用的内存是固定的 12kb 底层是布隆过滤器 无法判断即将到来的庞大数据流且不能查看内存容忍错误率 基数就是不重复的元素统计网页的UV一个人访问网站多次但还是算一个人传统方式是用set来保存id因为set不允许重复因此可以用set元素统计数量 PFadd myket abcdefgPFCOUNT mykey (统计不重复元素)PFMETGE mykey3 mykey mykey2 (mykey mykey2 的并集) Bitmaps 位图数据结构位存储 只有两个状态的 如何筛选用户是最快的用0101表示用户统计大数量的感染人数用户信息活跃和不活跃的登录和未登录的打卡或者没打卡的 setbit sign 0 1 getbit sign 6 bitcount sign 统计打卡天数 事务本质就是一组命令的集合命令直到执行事务才会执行 关系数据库的事务 ACID (原子性一致性隔离性持久性) redis的单条命令保证原子性but redis事务是不保证原子性的redis一个事务中所有命令都会序列化顺序执行满足一次性、顺序性、排他性没有隔离级别开启事务multi给出命令 set k1 v1 ……执行事务exec取消事务 discard 编译时异常整个事务的命令都不执行运行时异常只有运行错误的代码不执行其余都要执行
监控watch,是乐观锁 悲观锁认为什么时候都出问题 无论做什么都加锁 乐观锁认为什么时候都不会出问题 不会上锁更新数据的时候判断一下在此期间是否有人修改过获取version更新的时候对比version redis监控测试 watch money watch会检测到另一个程序是否修改过该值修改过那么就不能执行事务 unwatch 原始事务失败就解锁 watch money 重新监视
Springboot整合redis——lettuce jedis已经改版为lettuce jedis是直连采用多个线程操作是不安全的需要用jedis pool连接池 BIO lettuce采用netty实例可以在多个线程中共享 NIO 三种IO模型即为BIO【同步阻塞IO】、NIO【同步非阻塞IO】、AIO【异步非阻塞IO】。 首先可以先简单地体会一下三种IO模型的情景假设你需要等待开水的煮开 1. 同步阻塞你蹲在开水壶旁边什么都不做等着开水的煮开。 2. 同步非阻塞你跑去看书学习隔一段时间来看看开水是否煮开。 3. 异步非阻塞你跑去看书学习当开水煮开的时候会发出响声听到响声后你再回来。 redis的config配置文件 快照 在规定时间内执行了多少次操作则会持久化到文件生成快照否则数据会断电即失 client如果内存达到上限后六种处理策略和JUC并发一致 1.noeviction(默认策略)对于写请求不再提供服务直接返回错误DEL请求和部分特殊请求除外2.allkeys-lru从所有key中使用LRU算法进行淘汰LRU算法即最近最少使用算法3.volatile-lru从设置了过期时间的key中使用LRU算法进行淘汰4.allkeys-random从所有key中随机淘汰数据5.volatile-random从设置了过期时间的key中随机淘汰6.volatile-ttl在设置了过期时间的key中淘汰过期时间剩余最短的
Redis持久化RDB AOF RDB AOF,两种都开启的话优先AOF的数据载入 redis是内存数据库所以需要持久化操作 RDBredis database:在指定时间间隔内将内存的中的数据写到磁盘也就是Snapshot快照恢复的时候将快照读到内存 dump.rdb 规则 触发生成rdb文件的规则 save的规则满足的时候 save 60 560s进行五次修改操作执行flushall命令退出redis 恢复rdb文件只需要将rdb文件放在启动目录即可redis启动会自动检查dump.rdb恢复其中的数据 优点 redis宕机也可以通过dump恢复数据所以很适合大规模的数据恢复父进程继续处理client子进程的fork不会影响父进程 缺点 对数据的完整性要求不高redis意外宕机最后一次修改数据就没有了fork进程的时候会占用一定的内存空间 AOF(append only file):以日志形式记录每个写操作redis启动时通过命令重建数据库 appendonly.aof 每秒钟往aof中追加 如果这个文件有问题那么redis无法启动可以通过redis-check-aof --fix xxx.aof 优点 每一次修改都同步/每秒同步/从不同步 相比于rdb完整性更好 缺点 aof文件远大于rdb修复速度比rdb慢 运行效率也比rdb漫长 这样文件是不是会越来越大 如果上一次文件大于限定的64m就会fork一个新进程新进程会把数据转为写指令存入到aof文件
Redis的发布订阅
是一种消息通信模式有发送者pub有订阅者sub SUBSCRIBE 订阅频道监听等待推送的信息 PUBLISH 发布者往频道里边发布消息 PSUBSCRIBE 退订 用途简单场景难得场景会使用消息中间件MQ 实时消息系统关注系统微信公众号博主是发布者我们可以订阅博主此时的结构是一个发布者产生一个订阅队列向队列中发送消息 是字典结构频道是key值是订阅者形成的一个链表 Redis主从复制集群 从主节点服务器单向复制到从节点服务器master以读slave以写为主 主从复制的作用 是持久化之外另一种数据冗余形式故障恢复读写分离负载均衡一般读比写要多用多个节点可以分担负载提高服务器的并发承受量高可用集群基石防止一台redis宕机情况 info replication 查看当前主从信息 配置的时候要每一个服务器拥有一个单独的config 修改内部的dumb文件名端口号pid进程文件名字log日志文件名字 给从机配老大 SLAVEOF 127.0.0.1 6379 如果是永久配置的话要在config中写死否则一旦断开从机就会认为自己是主机 slave启动后会给所属master发一个同步命令Master收到命令后自动后台存盘进程将数据文件同步到slave 当主机断开连接不影响从机的响应从机之间彼此也不会影响重新加进来的slave会重新执行一次全量复制 全量复制新连接过来的就将全部数据都给它增量复制将新收集到的修改命令传给slave Resid主从复制方式二——人体蜈蚣模式 哨兵模式——自动选取老大 原始方式是手动切换一台从服务器到主服务器现在就是谋朝篡位的自动版后台监控主机是否故障如果故障那么就投票来选择从库作为主库
1、多个哨兵之间也在互相监控避免某个哨兵自身挂掉
2、当某个哨兵发现master一直不回应此时为哨兵一的主观下线
3、当别的一定数量哨兵也发现这一现象后哨兵之间就会进行一次投票投票由随机某个哨兵发起进行统计
4、根据投票结果选出下一个主节点
5、该哨兵通过发布订阅模式让各个哨兵更改自己监控的主机此时为客观下线
6、此时如果原始的主机回来了那么会自动成为当前新主机的从机
优点 冗余、持久化主从故障转移切换系统的可用性更好哨兵模式的自动化更加健壮 缺点 redis的在线扩容很麻烦当前服务器满了需要迁移到另一台服务器上时哨兵模式配置
Redis缓存穿透和雪崩(服务器的高可用问题) 缓存穿透查不到查询的数据在缓存中没有命中于是向持久层数据库查询这次查询也没有查询到——如果用户很多缓存都没有命中就会频繁请求持久层数据库出现缓存穿透穿透的意思大概就是此时缓存就像不存在一样 解决方法 请求的时候加一个过滤器——布隆过滤器 是一种数据结构对所有查询以hash形式存储先校验再给到底层数据库 当持久层数据库没有的话也把这条信息存入到缓存中但是不知道哪个空请求会被频繁执行——缓存空对象 缓存击穿查的量太大了缓存过期请求全部集中在一个点key大并发集都对这一个点进行访问当key失效的瞬间大并发涌入击穿缓存涌入数据库就像在屏障上凿出一个洞 比如微博热搜所有人都在高并发访问一个点的数据但是这个点在缓存中比如60s过期那么在过期的瞬间大量请求涌入数据库直接击穿缓存解决方案 热点数据永不过期加分布式锁这样的话数据请求就会以分布锁的形式控制只有一个线程能进入到持久化数据库其余线程等待 缓存雪崩在一个时间段缓存中的数据全失或者集中过期失效 所有的数据全部砸在了数据库此时对数据库产生周期性压力波峰存储层调用量暴增由于此时压力不可预知的可能数据库瞬间压垮双十一停掉别的服务比如退款请求保证主要服务可用解决方案 集群异地多活限流降级缓存失效后通过加锁限制数据库的访问量数据预热先模拟访问一遍先加载到缓存中并且手动设置不同过期时间使失效时间尽量均匀 比如微博热搜所有人都在高并发访问一个点的数据但是这个点在缓存中比如60s过期那么在过期的瞬间大量请求涌入数据库直接击穿缓存 解决方案 热点数据永不过期加分布式锁这样的话数据请求就会以分布锁的形式控制只有一个线程能进入到持久化数据库其余线程等待 缓存雪崩在一个时间段缓存中的数据全失或者集中过期失效 所有的数据全部砸在了数据库此时对数据库产生周期性压力波峰存储层调用量暴增由于此时压力不可预知的可能数据库瞬间压垮双十一停掉别的服务比如退款请求保证主要服务可用解决方案 集群异地多活限流降级缓存失效后通过加锁限制数据库的访问量数据预热先模拟访问一遍先加载到缓存中并且手动设置不同过期时间使失效时间尽量均匀