Redis学习总结,如哟问题私聊_redis私聊-程序员宅基地

技术标签: java  缓存  redis  

为什么要用nosql?
    用户的个人信息,社交网络,地理位置,用户自己产生的数据,用户日志等等爆发式的增长!
    这时候我们就需要使用NoSQL数据库的,NoSQL可以很好的处理以上的情况!
什么是nosql:
    NoSQL= Not Only SQL(不仅仅是sql)
    泛指菲关系型数据库的,随着web2.0互联网的诞生,传统的关系型数据库很难对付web2.0时代!尤其是超大型的
    高并发的社区,宝露出很多难以克服的问题,NoSQl在当今数据环境下发展的十分迅速,redis是发展最快的

很多数据的类型 用户的个人信息,社交网络,地理位置,这些数据类型的储存不需要固定的格式,不需要
多余的的操作就可以横向扩展的!

NoSQL特点:
    1方便扩展
    2大数据量最高(redis一面写8万次,读11万次,nosql的缓存是一种粗粒度的缓存,性能会比较高)
    3数据类型是多样的(5种以上,不需要实现设计数据库,随取随用)
    4传统的RDBMS(关系型数据库) 和Nosql
    NoSQL:
        -不仅仅是数据
        -没有固定的查询语言
        -键值对存储,列存储,图形数据库(社交关系)
        -最终一致性
        -CAP定理和BASE(异地多活!,集群模式)
        -高可用,高性能,高可扩
 nosql的数据类型:
    kv键值对:
        新浪:redis
        美团:redis+Tair
        阿里 百度:redis+memecache
    文档数据库类型(bson和json一样):
        mongodb:是一个基于分布式文件储存的数据库,c++编写,主要来存储大量的文档
    列存储数据库
        HBase:(大数据)
        分布式文件系统
    图关系数据库:
Redis能干什么?
    1内存存储 持久化,内存中是断点即失,所以说持久化很重要 (rdb,aof)
    2效率高,可以用作高速缓存
    3发布订阅系统
    4地图信息分析
    5计时器 计数器(浏览量!)
特性:
    1多样的数据类型
    2持久化
    3集群
    4事务
redis基础:
    1默认有16哥数据库,默认使用的是第0个(0-15)可以用select进行切换 select 3表示切换到第3个数据库,
    2dbsize可以查看数据库大小(存储),keys * 查看所有的key
    3清空所有数据库的内容 flushall
    4rddis是单线程的,官方表示,redis是基于内存操作的,cpu不是redis性能瓶颈,redis的瓶颈是基于机器的
        内存和网络的带宽,既然可以使用单线程来实现,就使用单线程了,所以就是要单线程了
redis为什么单线程还这么快?
    1 redis是将所有数据放入到内存中的,所有单线程的去操作就是最高的
    2 多线程(cpu上线文切换:耗时间的操作),对于内存系统来说,如果没有上线文切换小路就是最好的
常用命令:(string)
    set get (keys *) type (查看key的类型) exists(存在的key)
    append(往摸个克重添加字符串)  append key “hello”  ,value+hello(在值上进行追加相当于stringBuffer)
    步长 (相当于java中的i++):incr views  (增加1) decr views i(减少1)
                                incrby views incr(增加i) decrby views i(减少i)
    getrange key 0 3 :截取字符串【0,3】
    setex(set with expire)设置过期时间
    
    List (列表):
        lpush list one 将一个或者多个值插入到列表头部
        rpush list two 将一个或者多个值插入到列表尾部
        lrange list 0 -1 查询list中的所有值
        lpop list 从左边第一个元素开始移除
        rpop list 从右边第一个元素开始移除
        lindex list 1 通过下表查询第一个元素的值
        llen 查看list的长度
        lrem 移除list集合指定的元素
        lset 将列表中制定下表的值替换成另外的值,更新操作
    set(集合):
        sadd myset "hello" 存值
        smembeers myset 查询集合中的数据
        sismember myset hello 查询某个值是否在集合中存在
        srem myset hell0 移除set集合中的某个指定元素
      *****    srandmemb myset 随机初选出指定个数的元素 (抽奖)
      sdiff key1 key2 差集  key1 a,b,c  key2 c,d,e
      sinter key1 key2 交集 (共同好友可以这样实现) c
      sunion key1 key2 并集(排除了相同的元素,然后相加)abcde
     
     hash(哈希):
        相当于map集合:key-map
        hset myhash filed hello 设置值
        hget myhash filed 获取值
        hgetall myhash 获取myhash中的所有制
        hdel myhash field 删除这个值
        hlen获取hash的长度
    zset(有序集合):
        zadd myset 1 one 添加一个值
        zadd myset 2 two 3 three 添加多个值
        zrange myset 0 -1 遍历得出集合中的值
        zcard salary 获取有序集合中的个数
        
        
        
    setnx(set if not exist)不存在在设置 (分布式索中会用)
五大数据类型:
    1 String(字符串)
    2 List(列表):所有list操作命令都是以L开头的
    3 set(集合):set中的值是不能重复的
    4 Hash(哈希)
    5 zset(有序集合)
三种特殊类型:
    geospatial 地理位置    
        朋友的定位,附近的人,打车距离计算 ,redis3.2以后推出的,这个功能可以推算出地理位置的信息
        两地之间的距离,方圆几公里内的人?
        通过录入地理位置的经纬度,使用命令去完成!
    Hyperloglog:
        简介:基数统计的算法,优点占用内存是固定的,2^64不通的元素的技术,只需要12kb的内存
            网页的ui(一个人访问一个网站多次,但还是算作一个人)
            传统方式用set保存用户的id,然后就可以统计set中元素的数量作为标准判断,
            这个方式如果保存大量的用户id,就会比较麻烦,我们的目的是为了技术,额不是保存用户的id。
    bitmaps:
        位存储,位图
事务:
    redis单条命令是保存原子性的,但事务不保证原子性
    redis事务本质:一组命令集合,一个事务中的所有命令都会被序列化,在事务执行过程中会顺序执行
    一次性,顺序性,排他性
    redis事务没有隔离级别的概念:
        所有的命令在事务中,并没有立即去执行,只有发起执行命令的时候才会执行!Exec
redis的事务:
    开启事务(multi)(可以取消事务 discard)
    命令入队
    执行事务(exec)
编译时异常: 代码有问题,命令有错,事务中所有命令都不会被职性
运行时异常:如果事务队列中存在语法错误,那么执行名列的时候其他命令都会正常执行,错误命令抛出异常

悲观锁:
    很悲观,认为什么时候都会出问题,无论做什么都回加锁!(影响性能)
乐观锁:
    很乐观,任务什么时候都不会出现问题,所以不会上锁,只有在更新数据的时候去判断下
    再次之前是否有人修改过这个数据,一般只比较一下version
redis的监视watch相当于乐观锁的功能,测试多线程修改值使用watch可以当做乐观锁的操作
        
springboot整合:
    springboot操作数据源:spring-data jpa jdbc mongodb redsi
    说明在springboot2.x之后,原来是用的jedis被替换成lettuce
    jedis:用的是直连,多个线程操作的话,是不安全的,如果想避免不安全,使用
      jedis pool连接池!
    lettuce:采用netty,实力可以在多线程中进行共享,不存在线程不安全的情况
redis持久化:
    rdb(快照):
        1.save的规则满足的情况下,会自动出发rdb规则,生成.rdb文件
        2.执行flushall命令,也会出发我们的rdb规则
        3.退出redis,也会产生rdb文件
        备份就会自动生成一个dump.rdb文件。
      如何恢复rdb文件:
        只需要将rdb文件放在redis启动目录就可以,redis启动时会自动检查dump.rdb文件回复其中的数据
      优点:
        1.适合大规模的数据恢复
        2.对数据的完整性要求不高
      缺点:
        1.需要一点的时间间隔进程操作!如果redis意外当机了,最后一次修改数据就没有了
        2.fork进程的时候,会占用一定的内存空间(问题不大,默认就是用rdb形式的持久化)
        3.生产环境时,会有dump.rdb文件是的备份
       aof(Append Only File):
        将我们的所有命令都记录下来,history,恢复的时候就把这个文件所有的命令再执行一遍
        aof保存的是appendonly.aof文件,和rdb方式相同,在redis.conf文件中进行修改,aof默认每秒修改一次(写操作)
        如果aof文件有问题(被破坏),这时候redis是启动不了的,我们需要修复aof文件,redis给我们提供了一个工具
        redis-check-aof --fix 进行修复就可以了,然后启动redis,就会修复数据
        
        优点:
          1每一次修改都同步,文件的完整性会更好!
          2美妙同步一次,可能丢失一秒的数据
          3充不同步,效率高
        缺点:
            1相对于数据文件来说,aof远大于rdb(占用的内存),修复的速度比较慢
            2aof运行的小路也要比rdb慢,所以redis默认的配置就是rdb持久化
redis发布订阅:
    第一个消息的发送者,第二个频道,第三个消息订阅者
    使用场景:
        1实时消息系统
        2实时聊天
        3订阅,关注系统都可以
redis主从复制读写分离:
    主从复制,试讲一台redis服务器的数据,复制到其他redis服务器,前者称为主节点(master/leader),
      后者称为从节点(slave/follower),数据的复制是单向的,只能由主节点到从节点,master以写为主,slave以读为主
      默认情况下,每台redis服务器都是主节点;且一个主节点可以有很多从节点(也可以没有),但是一个从点
      只能有一个主节点
    
    主从复制读写分离:80%的情况下都是进行读的操作,这样可以减缓服务器的压力
                        最低配 一主二从(3台机器)
    复制原理:
        salve启动成功连接master后会发送一个sync同步命令,master接受命令后,启动后台的存盘进程,master将
        整个数据温江转到salve,并完成一次完全同步。
        全量复制:salve服务在接收到数据文件后,将其存盘并加载到内存中。
        增量复制:master继续将新的所有手机打的修改命令一次传给salve,完成同步
                但是只要将重新连接master,一次完全同步(全量复制)将被自动执行
                        
    作用:数据冗余:主从复制实现了数据的热备份,是持久化之外的一种数据冗余的方式。
          故障恢复:当主节点故障时,从节点可以暂时替代主节点提供服务,是一种服务冗余的方式
          负载均衡:在主从复制的基础上,配合读写分离,由主节点进行写操作,从节点进行读操作,
                分担服务器的负载;尤其是在多读少写的场景下,通过多个从节点分担负载,提高并发量。
          高可用基石:主从复制还是哨兵和集群能够实施的基础
为什么使用集群:
        1.单台服务器难以负载大量的请求
        2.单台服务器故障率高,系统崩坏概率大
        3.单台服务器内存容量有限
哨兵模式:
    在redis集群模式下,列如一主二从,需要配置哨兵,以防止主节点宕机后没有主节点,哨兵模式会通过选举
    重新选出一台机器作为主节点,
    1 需要在bin目录下创建sentinel.conf文件 
    2 文件中这么写 sentinel monitor (被监控的名称) host port 1
    3 列如 sentinel monitor Iredis 127.0.0.1 6379 1
    4 启动哨兵
    优点:
    1 哨兵集群,基于主从复制模式,所有主从复制的优点,它都有
    2 主从可以切换,故障可以转移,系统的可用性更好
    3 哨兵模式是主从模式的升级,手动到自动,更加健壮
    缺点:
    1 Redis不好在线扩容,集群容量一旦达到上限,在线扩容就十分麻烦
    2 实现哨兵模式的配置其实是很麻烦的,里面有很多配置项
redis缓存穿透(查不到):
        在默认情况下,用户请求数据时,会先在缓存(Redis)中查找,若没找到即缓存未命中,再在数据库中进行查找,
        数量少可能问题不大,可是一旦大量的请求数据(例如秒杀场景)缓存都没有命中的话,就会全部转移到数据库上,
        造成数据库极大的压力,就有可能导致数据库崩溃。网络安全中也有人恶意使用这种手段进行攻击被称为洪水攻击
    解决方法:
        1、布隆过滤器
        2、缓存空对象(有缺点 即失返回null放入redis中也是占用内存的)
redis缓存击穿(量太大,缓存过期):
        相较于缓存穿透,缓存击穿的目的性更强,一个存在的key,在缓存过期的一刻,同时有大量的请求,
        这些请求都会击穿到DB,造成瞬时DB请求量大、压力骤增。这就是缓存被击穿,
        只是针对其中某个key的缓存不可用而导致击穿,但是其他的key依然可以使用缓存响应。
        比如热搜排行上,一个热点新闻被同时大量访问就可能导致缓存击穿
    解决方案:
            1、设置热点数据永不过期
            2、加互斥锁(分布式锁)
                在访问key之前,采用SETNX(set if not exists)来设置另一个短期key来锁住当前key的访问,访问结束再删除该短期key。
                保证同时刻只有一个线程访问。这样对锁的要求就十分高
redis缓存雪崩:
        大量的key设置了相同的过期时间,导致在缓存在同一时刻全部失效,造成瞬时DB请求量大、
        压力骤增,引起雪崩
    解决方案:
        1、redis高可用(集群)
        2、限流降级(这个解决方案的思想是,在缓存失效后,通过加锁或者队列来控制读数据库写缓存的线程数量。
            比如对某个key只允许一个线程查询数据和写缓存,其他线程等待。)
        3 、数据预热(数据加热的含义就是在正式部署之前,我先把可能的数据先预先访问一遍,这样部分可能大量
            访问的数据就会加载到缓存中。在即将发生大并发访问前手动触发加载缓存不同的key,
            设置不同的过期时间,让缓存失效的时间点尽量均匀。)

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_41060547/article/details/109479496

智能推荐

C3P0和Druid数据库连接池的简单使用;几种设计模式简介;简略介绍自定义数据库连接池注意点_c3p0连接池用的设计模式-程序员宅基地

文章浏览阅读577次。数据库连接池负责分配、管理和释放数据库连接;它允许应用程序重复使用一个连接,而不是新建连接,提高了程序的效率;由于新建数据库连接也是要耗费性能和时间的,当访问量十分巨大的时候,对程序性能的影响就极为显著,为了解决这个问题出现了数据库连接池的技术;C3P0连接池使用步骤1、导入jar包;2、导入配置文件到src目录下;(配置文件会自动导入,但是名字必须是c3p0-config.xml或者c3p0-config-properties)3、创建C3P0连接池对象;4、获取连接;5、使用连接;_c3p0连接池用的设计模式

vue修改config后怎么生效_vue.config.js 配置无效?-程序员宅基地

文章浏览阅读6.2k次。vue.config.js 位于根目录下使用vue-cli3构建的项目constpath=require("path");functionresolve(dir){returnpath.join(__dirname,dir);}module.exports={lintOnSave:true,//生产环境是否生成sourceMap文件producti..._vue.config.js 生效

SpringBoot 系列教程(三十):SpringBoot整合Mybatis增删改查注解版_springboot mybatis 使用查锁-程序员宅基地

文章浏览阅读2.9k次。源码:https://github.com/Thinkingcao/SpringBootLearning/tree/master/springboot-mybatis本文主要讲解如何使用SpringBoot整合Mybatis,并访问数据库。由于Mybatis这个框架太过于流行,所以这里不过多涉及Mybatis的知识。一、创建SpringBoot项目,引入配置信息0、项目结构1..._springboot mybatis 使用查锁

bzoj1047【haoi2007】理想正方形-程序员宅基地

文章浏览阅读832次。单调队列

linux addr2line 定位ASan Dump信息-程序员宅基地

文章浏览阅读1k次,点赞25次,收藏19次。解决linux user层代码出现crash定位大难题_linux addr2line 定位asan dump信息

关于interface接口的使用与理解-程序员宅基地

文章浏览阅读4.1k次,点赞2次,收藏21次。1、什么是interface接口?首先,接口是与类平行的结构,两者都是独立的一个结构,都有自己的定义与规则,接口不属于类2、如何定义interface接口?定义接口中的成员:在jdk7以前只能定义全局常量(使用public static final修饰的变量,通常可以省略不写)与抽象方法(类似于方法,但是没有方法体,使用public abstract修饰变量名)。注意在接口中不能定义构造器!意味着接口不可以被实例化new出对象。3、如何使用interface?只要编写了接口,意_interface接口

随便推点

ssh远程登陆执行命令:未找到命令_sshpass命令找不到-程序员宅基地

文章浏览阅读5.1k次。ssh远程登陆执行命令:未找到命令_sshpass命令找不到

浅谈Linux的locale,LC_ALL和LANG_lc——time-程序员宅基地

文章浏览阅读4.4k次。如果你是一个Linux新手,并且刚刚安装了一个新的英文系统但想要设置成中文系统,肯定会接触到上面几个变量,在网上搜索了一系列解决方法,给一些变量赋一下值,再export一下,或者写到配置文件里面,然后就搞定了,但究竟为什么要这样做,可能还是一知半解。通过这两天自己对网上看到的一些文章的整理和自己的试验,在这里记录一下自己的理解。一、什么是localelocale这个单词中文翻译成地_lc——time

Vue实现前端本地打包为一个zip文件_vant打包完项目,再次打包文件夹内容为zip-程序员宅基地

文章浏览阅读989次。1、应用场景:打包下载的批量二维码图片2、实际后端返回数据格式:图片联机数组集合,每个图片链接打开都是一张二维码图片3、代码实现如下:元素代码<el-button type="primary" icon="el-icon-download" size="mini" @click="downloadCode"> 下载二维码</el-button>js代码第一步安装依赖包_vant打包完项目,再次打包文件夹内容为zip

Java面向对象1----类与对象的定义和使用_java类和对象的定义和使用答案头歌-程序员宅基地

文章浏览阅读821次。介绍面型对象的概念,以及Java中类的定义和使用方法_java类和对象的定义和使用答案头歌

Java 搭建一个可交互的窗体程序_java窗体程序的主程序-程序员宅基地

文章浏览阅读2k次。简单地显示一个窗口所需的最少代码import javax.swing.JFrame;public class main { static class Win extends JFrame{//static不能少 Win() { setVisible(true);//setv } } public static void main(String[] args) { // TODO new Win(); }}报错:No enclosing instan_java窗体程序的主程序

Anti ptrace:去掉AlipayWallet的ptrace 反调试保护,进行lldb调试---仅用于参考学习-程序员宅基地

文章浏览阅读1.8k次。新的博客学习笔记前言code软件环境:Xcode硬件环境:iPhone5越狱手机、Mac开发工具: Cycript、LLDB、logos Tweak、hopper、MonkeyDev、AFLEXLoader、dumpdecrypted、debugserver、ssh、class_dump、hook本文采用tweak 的方式进行M..._lldb 绕过ptrace反调试

推荐文章

热门文章

相关标签