学习笔记2——Nosql

学习笔记系列开头惯例发布一些寻亲消息

链接:https://baobeihuijia.com/bbhj/contents/3/194205.html
在这里插入图片描述

跟学链接

跟学视频链接:https://www.bilibili.com/video/BV1S54y1R7SB/?spm_id_from=333.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 1
      • set name xxx
      • APPEND name xxx(补加,如果不存在那就相当于新建)
      • get name
      • DBSIZE
      • keys * :显示全部数据
      • flushdb:清除当前数据库
      • flushall 清空所有数据库
      • EXISTS name
      • move name x(x是哪个数据库)
      • 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 -1)
      • SETRANGE name 1 “shixh” (从第一个位置开始修改后边数据为shixh)
      • setnx (如果不存在就set,存在就算了,分布式锁)
      • setex (设置过期时间)
      • mset/ mget 一次性设置和get多个值,是原子性操作要么成功要么失败
      • set user:1:name zhangsan 作为对象缓存,更多的是用hash存
      • getset(先get后set)
    • List (可以作为消息队列、栈)

      • LPUSH name one (头插)
      • RPUSH name two (尾插 )
      • LPOP name
      • RPOP name
      • Lset name 1 rrr ( 修改name指定位置的值)
      • Lindex name 1(通过下表获取name中第一个值)
      • Llen name
      • Lrem 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 aaa
      • hget myhash filed1得到结果aaa
      • hmset myhash field1 hello field2 world
      • hmget
      • hgetall myhash 得到结果field1 hello filed2 world
      • hdelete myhash filed1
      • hlen myhash 获取键值对的数量
      • hexist myhash filed1
      • hkeys myhash / hvals myhash
      • hset myhash filed3 5
      • hincrby myhash filed3 -1
      • hsetnx myhash filed3 存在就失败
    • zset(有序集合)zset 成绩排序/ 对消息进行带权重执行/ 排行榜 ,热榜

      • zadd myset 1 one
      • zrange myset 0 1
      • zadd salary 2388 hong
      • zrem myset hong
      • zadd salary 300 zhansgan
      • zrangebyscore salary -inf +inf 对salary排序从最小到最大, -inf +inf是score排序区间范围
      • zrevrange myset 0 -1 从大到小排序
      • zrangebyscore salary -inf +inf withscores 就是排序并且加上score
      • zcard myset 获取有序集合中的个数
    • 三种特殊的数据类型

      • geospatial 地理位置 算地理位置 两地距离,算方圆几里的人

        • 底层实现原理是zset,官方没有给删除,但是可以自己关掉自己的定位信息 用zrange 查看全部,用zrem删掉
        • 超过南北极直接判定无法添加 先经度后维度
        • geoadd china:city 115.00 39.00 beijing
        • geopos 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 限定返回数量为1
        • georadiusbymember china:city shanghai 400 km 以上海为中心的400km以内的 【用于定位】
      • Hyperloglog 占用的内存是固定的 12kb 底层是布隆过滤器, 无法判断即将到来的庞大数据流,且不能查看内存,容忍错误率

        • 基数就是不重复的元素
        • 统计网页的UV(一个人访问网站多次,但还是算一个人)
        • 传统方式是用set来保存id,因为set不允许重复,因此可以用set元素统计数量
          • PFadd myket abcdefg
          • PFCOUNT 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是内存数据库,所以需要持久化操作

  • RDB(redis database):在指定时间间隔内,将内存的中的数据写到磁盘,也就是Snapshot快照,恢复的时候将快照读到内存

    • dump.rdb

    • 规则

      • 触发生成rdb文件的规则
        • save的规则满足的时候 save 60 5(60s进行五次修改操作)
        • 执行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过期,那么在过期的瞬间,大量请求涌入数据库,直接击穿缓存

    • 解决方案
      • 热点数据永不过期
      • 加分布式锁,这样的话数据请求就会以分布锁的形式控制只有一个线程能进入到持久化数据库,其余线程等待
  • 缓存雪崩:在一个时间段,缓存中的数据全失或者集中过期失效

    • 所有的数据全部砸在了数据库,此时对数据库产生周期性压力波峰,存储层调用量暴增,由于此时压力不可预知的,可能数据库瞬间压垮
    • 双十一:停掉别的服务:比如退款请求(保证主要服务可用)
    • 解决方案:
      • 集群:异地多活
      • 限流降级:(缓存失效后,通过加锁限制数据库的访问量)
      • 数据预热:先模拟访问一遍,先加载到缓存中,并且手动设置不同过期时间,使失效时间尽量均匀

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/114385.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

解决 Windows 7 激活信息失败报错 0xC004F057

文章目录 步骤一:以管理员身份运行命令提示符步骤二:卸载当前密钥信息步骤三:清除产品密钥信息步骤四:重新启动 Windows Activation Technologies 服务步骤五:重启电脑 🎉解决 Windows 7 激活信息失败报错 …

【Java 进阶篇】深入理解 Bootstrap 导航条与分页条

Bootstrap 是一个强大的前端框架,为网页和应用程序开发提供了丰富的组件和工具。其中,导航条和分页条是两个常用的组件,用于创建网站的导航和分页功能。本篇博客将深入探讨 Bootstrap 导航条和分页条的使用,适用于那些希望提升网页…

常用Web安全扫描工具合集

漏洞扫描是一种安全检测行为,更是一类重要的网络安全技术,它能够有效提高网络的安全性,而且漏洞扫描属于主动的防范措施,可以很好地避免黑客攻击行为,做到防患于未然。那么好用的漏洞扫描工具有哪些? 1、AWVS Acunetix Web Vulnerability Scanner(简称AWVS)是一款知名…

关于CW32单片机pack包安装 KEIL IAR

CW32 系列微控制器软件开发工具入门 芯片包 1. 下载芯片包 官方下载链接:武汉鑫源半导体 2. 安装芯片包 双击芯片包.pack文件 支持 CW32F 系列的 IDE 支持 CW32F 系列的工具链: • • EWARM v7.70 或更高版本 MDK-ARM v5.17 或更高版本 2.1 EW…

简单宿舍管理系统(springboot+vue)

简单宿舍管理系统(springbootvue) 1.创建项目1.前端2.数据库3.后端 2.登陆1.前端1.准备工作2.登陆组件3.配置 2.后端1.链接数据库2.创建用户实体类3.数据操作持久层1.配置2.内容3.测试 4.中间业务层1.异常2.业务实现3.测试 5.响应前端控制层 3.前后对接4…

大模型背景下软件工程的机遇与挑战

点击链接了解详情 本文作者:汪晟杰 导语:AISE(AI Software Engineering)有人说是软件工程 3.0,即基于大模型(LLM - Large Language Model)时代下的软件工程。那么究竟什么是 AISE,他的发展历程对…

简单的聊一聊如何使用CSS的父类Has选择器

最近的:has()选择器允许您对父元素和其他祖先应用样式,本文将向您展示如何在Web应用程序开发中使用它。 在CSS的世界中,选择器是驱动我们在网页上看到的美丽且响应式设计的工作的马。它们允许开发者根据元素的属性、位置和关系来选择和样式化HTML元素。 …

汽车屏类产品(五):中控IVI车载信息娱乐系统

前言: 车载信息娱乐系统(IVI)的起源可以追溯到20世纪,按钮调幅收音机被认为是第一个功能。从那以后,IVI系统在创造壮观的车内体验方面变得不可或缺,以至于汽车被称为“车轮上的智能手机”。但随着包括自动驾驶汽车在内的汽车技术的进步,以及对个性化体验的需求不断增长…

【合集】Redis——Redis的入门到进阶 结合实际场景的Redis的应用

前言 Redis是一个开源的内存数据结构存储系统,也被称为键值存储系统。它支持多种数据结构,如字符串、哈希表、列表、集合、有序集合等,并提供了丰富的操作命令,可以对这些数据结构进行快速的读写操作。Redis具有高性能、高可用性…

FreeSWITCH 1.10.10 简单图形化界面12 - 注册IMS

FreeSWITCH 1.10.10 简单图形化界面12 - 注册IMS 0、 界面预览1、IMS注册-SIP中继基本设置界面2、IMS注册-SIP中继呼叫设置3、IMS中继-代理设置界面4、IMS注册-SIP中继状态界面5、IMS注册-SIP中继详细状态界面6、IMS注册-SIP中继代拨号码优先界面 FreeSWITCH界面安装参考&#…

postgresql14-用户与角色(二)

介绍 查看 SELECT rolname FROM pg_roles;postgres是系统初始化时默认创建的角色,为超级管理员。 \duList of rolesRole name | Attributes | Member of ------------------------------------------------------…

RPA的尽头是超自动化?

超自动化在经过数年的发酵期后,已从一个科技概念崛起为市值近千亿元的新赛道,包括各大互联网巨头、科技公司都纷纷围绕超自动化进行战略布局。 一方面,是行业巨头选择纷纷跻身超自动化新赛道,另一方面,RPA行业的领军企…

软件测试(五)自动化 selenium

文章目录 自动化测试单元测试:单元测试:UI自动化 selenium工具定义特点:原理:seleniumjava环境搭建SeleniumAPI获取测试结果:添加等待浏览器操作键盘事件鼠标事件多层框架/窗口定位下拉框处理弹窗处理上传文件操作关闭…

怎样才能去除视频中的背景音乐,保留人声?

做视频剪辑,二次创作的朋友,需要去除视频中的背景音乐,保留人声;或者去除人声,保留背景音乐。如果请身边做视频的朋友帮忙,可有时不能沟通到位,完成后的效果并不是很理想,就很尴尬了…

26. 通过 cilium pwru了解网络包的来龙去脉

pwru是一种基于eBPF的工具,可跟踪Linux内核中的网络数据包,并具有先进的过滤功能。它允许对内核状态进行细粒度检查,以便通过调试网络连接问题来解决传统工具(如iptables TRACE或tcpdump)难以解决甚至无法解决的问题。在本文中,我将介绍pwru如何在不必事先了解所有内容的…

低代码助力软件开发

低代码开发工具正在日益变得强大,它正不断弥合着前后端开发之间的差距。对于后端来说,基于低代码平台开发应用时,完全不用担心前端的打包、部署等问题,也不用学习各种框架(Vue、React、Angular等等)&#x…

Mysql中的RR 隔离级别,到底有没有解决幻读问题

Mysql 中的 RR 事务隔离级别,在特定的情况下会出现幻读的问题。所谓的幻读,表示在同一个事务中的两次相同条件的查询得到的数据条数不一样。 在 RR 级别下,什么情况下会出现幻读 这样一种情况,在事务 1 里面通过 update 语句触发当…

一款简单漂亮的WPF UI - AduSkin

前言 经常会有同学会问,有没有好看简单的WPF UI库推荐的。今天就给大家推荐一款简单漂亮的WPF UI,融合多个开源框架组件:AduSkin。 WPF是什么? WPF 是一个强大的桌面应用程序框架,用于构建具有丰富用户界面的 Windo…

大模型基础——大模型范式

大模型背后的范式 整个预训练语言模型的使用范式: 对于预训练模型,最核心的要素是从无标注的数据中去学习,通过自监督的一些任务去做预训练,得到丰富的知识。在具体的应用中,会引入一些任务相关的数据,去调…

C++学习之多态详解

目录 多态的实现 例题 重载 重写 重定义的区别 抽象类 多态实现原理 多态的实现 C中的多态是指,当类之间存在层次结构,并且类之间是通过继承关联时,就会用到多态。多态意味着调用成员函数时,会根据调用函数的对象的类型来执…