• redis


    redis

    1.Nosql数据库简介

    1.1 解决cpu及内存压力

    客户通过 nginx 来访问服务器,服务器有多台在第一个服务器登录后产生一个 session

    第二次登录进行服务器2而服务器2没有session 如何进行session的同步?

    1. 存储到客户端 cookie 但不安全
    2. session复制 造成数据的大量冗余
    3. nosql 数据库 从nosql数据库中进行读取 完全在内存中,数据结构简单

    1.2 解决 io 压力

    作为缓存使用一些常用的操作直接放在 nosql 中,减少数据库的压力

    1.3 nosql 概述

    not only sql 泛指非关系型数据库,以简单的 key-value 存储,极大的增加了数据库的扩展能力

    • 性能远超 sql
    • 不遵循 sql 标准

    适用场景

    • 高并发
    • 海量数据的读写
    • 对数据高可扩展性

    不适用

    • 需要事务支持
    • 需要处理复杂关系,需要即席查询

    redis 介绍相关知识

    redis 是单线程+多路io复用技术

    多路复用就像js中的异步任务,发布一个异步任务不需要等待排队,干其它事,等这个事干完了就使用会提醒你

    3. 常用数据类型

    redis 字符串(String)

    redis 列表(list)

    redis 集合(set)

    redis 哈希(hash)

    redis 有序集合 Zset 与set非常像但与set不同的是zset每一个成员都关联了一个评分,这个评分可以从最低到最高来排序集合中的成员

    阿里演进

    # 1. 商品的基本信息
    mysql,oracle
    # 2. 商品的描述
    mongodb
    # 图片
    分页式文件系统 fastDfs
    淘宝 tfs
    google gfs 
    hadoop hdfs
    阿里云的 oos
    # 商品的关键字
    solr elasticsearch
    iserach 多隆
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    5.redis的发布与订阅

    redis发布与订阅是一种消息模式:发送者发送信息,订阅者接收信息,中间通过监听一个频道来实现的。

    redis客户端可以订阅任意数量的频道

    6.redis新数据类型

    1、bitmaps

    现代计算机使用二进制位作为信息的基础单位,合理地使用操作位能够 有效地提高内存使用率和开发效率。

    redis提供了bitmaps这个数据类型可以实现对位的操作

    1. bitmaps本身不是一种数据类型,实际上它就是字符串,但它可对字符 串的位进行操作
    2. bitmaps单独提供了一套命令,所以使用bitmaps与使用字符 串不太相同
    • setbit key 偏移量[下标] 数字 如果偏移量太大会影响redis的速度

    • getbit key 偏移量 获取某个偏移量的值

    • bitcount key begin last 统计字符串被设计成1的bit数量last可为负数

    • bitcount key

    2. HyperLogLog

    在工作中,我们经常会遇到与统计相关的功能需求,比如统计pv(pageView页面访问量),可以使用redis的incr与incrby实现。

    但像uv(uniqueVisitor,独立访客)、独立ip数、搜索记录数等需要去重和计数的问题如何解决?这种求集合不重复元素的个数的问题简称基数问题。

    hyperLogLog优点是当输入元素的数量或者体积非常非常大的时候,所需要的空间问题固定的,并且很小的。

    但是,因为它只会根据输入元素的个数来计算基数,而不会储存输入元素本身,所以它不能像集合一样输出输入的各个元素。

    • pfadd[element…]添加元素到指定的hyperloglog中
    • pfcount [key…]计算hll的近似基数
    • pfmerge [sourcekey…]

    3.Geospatial

    在redis 3.2中增加了对geo类型的支持。geo->geographic 地理信息的缩写。就是元素的二维坐标,在地图上就是经纬度,redis基于该类型,提供了经纬度设置,查询,距离查询,经纬度hash等常见操作。

    • geoadd[longitude latitude member…]添加地理位置(经度,纬度,名称)

      两极无法添加,一般会下载城市数据,直接通过 java程序一次性导入,有效的经度从-180到180,有效的纬度从-85到85度,当坐标超出指定范围会报一个错误,已经添加的数据是无法两次添加的

    • geopos [member…]获得指定地区的值

    • geodist 获取两个位置意间的直线距离 单位 m表示单位为米 km表示单位为千米 mi代表单位为英里

      ft表示单位为英尺如果用户没有显式地指定单位参数,那么geodist默认使用m

    • geoadius radius m|km|ft|mi 以给定的经纬度为中心某一半径内的元素

    7、redis事务的定义

    redis事务是一个单独的隔离操作:事务中所有 命令都会序列化地按顺序地执行。事务在执行的过程中,不会被其他客户端送来的请求所打断。

    redis事务的主要作用就是串联多个命令防止别的命令插队

    Muti从输入Muti命令开始,输入的命令都会依次进入命令队列中,但不会执行,直至输入Exec后,redis会将之前的命令队列的命令依次执行,组队的过程中可以通过discard来放弃组队

    事务的错误处理

    组队中某个命令出现了报告错误,执行时整个队列都会被取消

    如果执行阶段某个命令出现错误,则只有报错的命令不会执行,而其他的命令都会执行不会回滚。

    redis 乐观锁

    在执行multi之前,先watch key1[key…],可以监视一个(多个key),如果在事务执行之前这个key其他命令所改动,那么事务将被打断。

    unwatch

    取消watch命令对所有key的监视

    如果执行watch命令之后,exec命令或discard先执行了的话那么就不需要再执行unwatch命令了

    8、持久化方式

    RDB (Redis database)

    隔一段时间将内存中的值写入磁盘,也就是行话讲的snapshot快照,恢复时是将文件直接读取到内存中。

    redis会单独创建(fork)-子进程来进行持久化,会将数据写到一个临时文件中,待持久化都结束了,再用这个临时文件替换上次持久化好的文件。整个过程中,主进程不进行任何io操作,确保了极高的性能如果需要进行大规模数据的恢复,且对数据恢复的完整性不是非常敏感,那RDB比aof的方式更加高效,RDB的缺点是最后一次的持久化的后的数据可能会丢失。

    在linux系统中,fork会产生一个父进程完全相同的子进程,但子进程在此后会调用 exec系统调用,出于效率考虑,linux中引用了’写时复制技术’,一般情况父进程和子进程会共用同一段物理内存,只有进程空间的各段的内容要发生才会将父进程复制一份子进程

    redis默认生成文件会生成登录的位置中,如果需要修改默认生成文件位置我们需要修改conf配置文件

    手动保存快照

    命令save:只管保存,其它不管,全部阻塞

    save vs bgsave

    • stop-writes-on-bgsave-error yes
      • 当redis无法写入磁盘的话直接关闭,redis写的操作
    • rdbcompression yes
      • 进行rdb保存时,将文件压缩
    • rdbchecksum yes
      • 在存储快照后,还可以让redis使用crc64算法来进行数据校验,但是这样做会增加大约10%的性能消耗,如果希望获取到最大的性能,可以关闭此功能。

    aof (Append of File)

    以日志的形式来记录每一个写操作,将redis执行中所有的写指令 记录下来,只许追加但不可以改写文件,redis启动之初会读取,重新构建数据,换言之,redis重启的话就根据日志的内容将写指令全部执行一遍完成恢复

    • aof默认没有开启,需要手动在配置文件中进行配置

    • 可以在redis.conf配置文件名,默认为appendonly.aof

    • aof文件保存路径默认与rdb的路径一致

    • 注意aof默认会记录所有写的操作如果不小心执行flushdb指令需要在日志文件中将这条指令清除才可以恢复。

    aof故障恢复

    • aof文件保存的路径,同rdb路径一致
    • 如遇到 aof 文件损坏可以通过 redis-check-aof --fix appendonly.aof 进行恢复

    aof同步频率设置

    • 始终同步,每次 redis 的写入都会立即记入日志
    • 每秒同步,每秒记入日志一次,如果宕机,本秒的数据可能会丢失
    • 不主动进行同步,把同步时机交给操作系统

    rewrite

    aof采用追加的方式,文件会越来越大,为避免这种情况,新增了重写机制,当aof文件的大小超过所设定的阈值时,redis就会启动aof文件的内容压缩,只保留可以恢复数据的最小指令集,可以使用指令 bgrewriteaof

    redis如何实现重写

    • aof文件持续增大而过大时,会fork出一条新进程来将文件重写,遍历新进程的内存中数据,每条记录有一条set语句。重写aof文件的操作并没有读取旧的aof文件,而是将整个内存中的数据库内容用命令的方式重写了一个新的aof文件,这点与快照有点类似

    何时重写

    • 重写虽然可以节约大量磁盘空间,减少恢复时间。但是每次重写还是会有一定的负担的,因此设定redis要满足一定条件才会重写。
    • 系统载入时,或者上次重写完毕时,redis会记录此时aof大小,设为base_size,如果redis的aof当前大小>=base_size+base_size*100%(默认)且当前大小>=64mb(默认)情况下,redis会对aof进行重写。

    9、主从复制

    • 主从复制,就是主机数据更新后根据配置和策略,自动同步到备机的master/slaver机制,master以写为主,slave以读为主

    读写分享,性能拓展,容灾快速恢复

    配从(服务器)不配主(服务器)

    • 拷贝多个redis.conf文件 include
    • 开启deamonize yes
    • pid 文件名字pidfile
    • 指定端口号port
    • log文件名字
    • dump.rdb名字
    • Appendonly关掉或者换名字
  • 相关阅读:
    失落的方舟台服预下载教程 一键下载+账号注册教程
    maven的生命周期
    关于 re.sub 部分替换的解决办法
    【状语从句练习题】综合训练
    Pandas如何对DataFrame排序和统计
    MySQL(进阶)--索引
    如何配置frp到linux服务器和windows本地,服务端支持自启动
    java-php-python-ssm志愿者网上服务平台的设计与实现计算机毕业设计
    【HTML学生作业网页】基于HTML+CSS+JavaScript仿南京师范大学泰州学院(11页)
    CEF 实现放大缩小视图功能
  • 原文地址:https://blog.csdn.net/qq_53008149/article/details/125427748