技术栈-拓展延伸-redis学习总结

  1. 三类技术

    功能性:java,jsp
    扩展性:spring,mybatis
    性能:nosql,mq
  2. 解决问题

    解决cpu和内存压力:
    session放到nosql中,完全在内存中,速度快
    解决io压力:
  3. nosql是不仅仅是sql

    适用场景:
    高并发读写
    海量读写
    数据的高可扩展性
    不适用场景:
    需要事务支持
    基于sql的结构化查询存储
  4. 大数据:行式数据库,列式数据库,图关系数据库

  5. redis底层技术

    单线程+多路io复用技术:如黄牛买票,黄牛主动通知
    端口号6379:Merz-女演员
    默认16个数据库,0-15,默认0号库
  6. redis-key操作

    查看当前库的key:keys *
    设置key value:set key value
    判断key是否存在:exists key
    判断key的类型:type key
    删除key:del key
    删除key:unlink key-选择非阻塞删除
    设置key的过期时间:expire key 10-秒
    查看过期时间:ttl key-[-2表示已经过期,-1表示永不过期]
    切换库:select index
    查看当前库有多少key:dbsize
    清空当前库:flushdb
    通杀全部库:flushall
  7. Redis-string操作

    二进制安全,图片等
    value:max=512M
    添加:set key value——相同key,后面加的会覆盖
    取value:get key
    追加:append key value
    得到长度:strlen key
    key 不存在时才能设置:setnx key value
    数字值加一/减一:incr/decr key-原子性操作
    数字值加步长/减步长:incrby/decrby key 步长
    【
    i++过程:取值 ++ 赋值
    】
    同时设置一个或多个key-value:mset key value key value...
    同时获取多个value:mget key key...
    同时设置一个或多个key-value(当且仅当key不存在):msetnx key value key value...——原子性,一个失败都失败
    获得值的范围:getrange key start end
    从某个位置开始覆盖:setrange key start value
    设置键值,同时设置过期时间:setex key 过期时间 value
    设置新值,同时获得旧值:getset key value
    数据结构:简单动态字符串,类似于arraylist
  8. Redis-list

    单键多值
    底层:双向链表
    从左边/右边插入一个或多个值:lpush/rpush key value value...-从左/右边放
    取值:lrange key start end-[0 -1表示取所有值]
    从左/右边吐出一个值:lpop/rpop key -[值在键在,值光键亡]
    从key1列表右边吐出一个值,插到key2列表左边:rpoplpush key1 key2
    按下标获得元素(从左到右):lindex key index
    获得列表长度:llen key
    在value的前面/后面插入新值:linsert key before/after value newvalue
    从左边删除n个value-(从左向右):lrem key n value
    将列表key下标为index的值替换成value:lset key index value
    数据结构:快速链表-链表+压缩列表
  9. Redis-set操作

    类似于list,但是自动去重
    底层:哈希表
    将一个或多个member元素加入key中,已经存在的member元素将被忽略:sadd key value value...
    取出集合中的所有值:smembers key
    判断集合key是否含有该value值,有1,没有0:sismember key value
    返回该集合的元素个数:scard key
    删除集合中的某个元素:srem key value1 value2...
    随机从集合中突出一个值:spop key
    随机从集合中取出n个值,不会从集合中删除:srandmember key n
    把集合中的一个值从一个集合移动到另一个集合:smove source destination value
    返回两个集合的交集元素:sinter key1 key2
    返回两个集合的并集元素:sunion key1 key2
    返回两个集合的差集元素-key1中的,不包含key2中的:sdiff key1 key2
  10. redis-数据结构hash

    key-value集合-【filed value】
    给key集合中的filed键赋值value:hset key filed value
    从key集合filed取出value:hget key filed
    批量设置hash的值:hmset key filed1 value1 filed2 value2...
    查看hash表key中,给定域filed是否存在:hexists key filed
    列出该hash集合的所有filed:hkeys key
    列出该hash集合的所有value:hvals key
    为hash表key中的域filed的值加上增量:hincrby key filed increment
    将哈希表中的域filed的值设置为value,当且仅当域filed不存在时:hsetnx key filed value
    数据结构:压缩列表,哈希表
  11. Redis-zset

    有序集合-关联评分
    将一个或多个member元素及其score值加入到有序集合key中:zadd key score1 value1 score2 value2...
    返回有序集合key中,下标在start - stop 之间的元素:zrange key start stop [withscores]
    返回有序集合key中,所有score值介于【min,max】之间的成员,按递增排列:zrangebyscore key min max [withscores] 
    同上,改为从大到小排列:zrevrangebyscore key max min [withscores]
    为元素的score加上增量:zincrby key increment value
    删除该集合下指定值的元素:zrem key value
    统计该集合,分数区间内的元素个数:zcount key min max
    返回该值在集合中的排名,从0开始:zrank key value
    数据结构:一方面等价于map<string,double>,一方面类似于treeset
    底层:hash+跳跃表 【三层间隔跳跃】
  12. Redis-配置文件

    支持bytes,不支持bit
    大小写不敏感
    网络:bind:127.0.0.1只支持本地
    protected-mode no 保护模式:不支持远程访问
    tcp-backlog 511 :backlog是一个连接队列,backlog队列总和=未完成三次握手队列+已完成三次握手队列
    timeout 0:redis连接用不超时
    tcp-keepalive 300:心跳检测周期,释放连接
    daemonize yes: redis后台启动
    pidfile: 进程号放入文件
    logfile:日志输出路径
    日志文件级别-4个级别
    database:默认16个库
    maxclient:设置redis同时可以与多少个客户端进行连接
    maxmemory:redis可以使用的内存量
    maxmemory-policy:移除规则
    maxmemory-samples:样本数量 
  13. redis-发布订阅

    消息通信模式:发送者发送消息,订阅者接受消息-redis客户端可以订阅任意数量的频道
    打开客户端订阅:subscribe channel1
    打开客户端发布:publish channel1 hello
  14. redis-新数据类型-bitmaps

    位操作
    不是数据类型,实际上就是key-value字符串
    设置:setbit key offset value-偏移量大,会慢
    取值:getbit key offset
    统计字符串被设置为1的数量:bitcount key
    如上,还可以加下标:bitcount key start end 【-2表示倒数第二个,-1表示最后一个】
    复合操作(交集,并集,与或非),操作结果保存到destkey中:bitop and(or/not/xor)destkey 【key...】
    bitmaps&set:bitmaps内存小,
  15. redis-新数据类型-hyperloglog

    统计页面访问量,搜索记录,独立ip
    计算基数(去重):不重复元素
    添加指定元素到hyperloglog中:pfadd key element...
    计算hll的进似基数:pfcount key
    将一个或多个hll合并,结果放到另一个hll中:pfmerge destkey sourcekey...
  16. redis-新数据类型-geospatial

    地理信息的缩写
    添加地理位置(经度,纬度,名称):geoadd key longgitude latitude member...
    获得指定坐标的坐标值:geopos key member...
    获得两个位置之间的直线距离:geodist key member1 member2 [m/km...]
    以给定的经纬度为中心,找出某一半径内的元素:georadius key longitude latitude radius [m/km ]
  17. redis-jedis操作-测试

    客户端工具-通过java操作redis
    maven导入依赖
    创建jedis对象:Jedis jedis=new Jedis(host:"主机号",port:"端口号-6379");
    测试:String value=jedis.ping();//bind 绑定的主机-注释掉,protected-mode no:保护模式改成no,虚拟机的防火墙也要关闭
    jedis-api:
  18. springboot整合redis

    pom.xml加入redis依赖,common-pool2连接池依赖
    配置redis,||如地址,端口号...
    添加redis配置类
  19. redis-事务和锁机制

    单独的隔离操作
    串联多个命令,防止别的命令插队
    muti:开启事务,命令组队阶段
    exec:执行阶段
    discard:组队过程中,可以通过discard放弃组队
    悲观锁:先上锁
    乐观锁:版本号要同步更新,在执行muti之前,先执行watch key...,可以监视一个或多个key,如果在事务执行之前,这个(这些)key被改动,那么事务将被打断
    redis事务三特性:【1:单独的隔离操作。2:没有隔离级别的概念。3:不保证原子性-没有回滚】
  20. 秒杀案例-基本实现

    商品库存-1。 秒杀成功者+1
    ​
  21. redis-持久化操作-rdb

    内存中的数据直接写到文件中去
    在指定的时间间隔内,将内存中的数据集快照写入磁盘
    dump.rdb 持久化文件
    save:全部阻塞,手动保存
    bgsave:后台异步,自动保存
    rdb持久化配置文件
    过程:redis单独创建一个fork子进程来进行持久化,会先将数据写入到一个临时文件中,待持久化过程结束了,再用临时文件替换上次持久化好的文件(dump.rdb)
    临时文件的作用,是为了不修改原文件,在挂掉的时候还能恢复
    如果需要大规模数据的恢复,且对于数据恢复的完整性不敏感时,rdb比aof高效
    rdb的缺点:最后一次持久化的时候可能造成数据的丢失 -redis持久化一部分后突然挂掉
    fork:写时复制技术
    redis的恢复:【1:备份。2:改一下名字。】
    rdb优势:适合大规模恢复,且数据完整性不敏感
    劣势:fork过程中,内存中的数据被复制一份,空间的浪费
  22. redis-持久化操作-aof

    append only file
    以日志的形式来记录每个写操作(增量保存) ,将redis执行过的所有写指令记录下来,只追加文件不可以改写文件
    aof默认不开启
    aof文件的保存路径,同rdb的保存路径相同
    aof和rdb同时开启,系统默认取aof的数据(数据不会存在丢失)
    aof的恢复同rdb
    aof的异常恢复:如遇到aof文件损坏,可恢复
    aof配置:【1:aof同步频率设置。2:rewrite压缩-繁琐命令用一条命令写出】
    aof持久化流程:【1:客户端的请求写命令会被append到aof缓冲区内。2:aof缓冲区根据aof持久化策略将操作同步到磁盘的aof文件中。3:aof文件大小超过重写策略或手动重写时,会对aof文件rewrite重写,压缩aof文件容量。4:redis服务重启时,会重新load加载aof文件中的写操作达到数据恢复的目的】
    优势:备份机制更稳健,丢失概率更低
    劣势:占用空间多,因为记录操作,每次写都同步,有性能压力
    官方推荐,两个都启用,
  23. redis-主从复制

    主机数据更新后根据配置和策略,自动同步到备机的 master/slave 机制,master以写为主,slave以读为主
    一主多从
    为防止主机挂掉的影响可以,做成集群
    好处:【1:读写分离。2:容灾快速恢复。】
  24. 主从复制-搭建一主多从

    1:创建/myredis文件夹
    2:复制redis.conf配置文件到文件夹中
    3:创建3个配置文件-不同端口
    4:在3个配置文件中写入内容-include引入配置文件的公共部分再修改
    5:启动三台redis服务【查看当前主机的运行状况 - info replication|| 在从机上执行:slaveof 127.0.0.1 6379 配置从机】
  25. 主从复制-复制原理,一主二从

    1:从机挂掉后再重启,还是主机
    2:再设置为从服务器后,会把主机的数据从头开始复制
    3:主机挂掉后,从机还是从机
    复制原理:
    【
    1:从及连上主机,从机向主机发送数据同步消息
    2:主机接到从机的同步消息,把主机数据持久化到rdb文件,把rdb文件发送给从机,从机拿到rdb进行读取——全量复制
    3:每次主机进行写操作后,和从机进行数据同步——增量复制
    】
  26. 主从复制-薪火相传,反客为主

    薪火相传:
    从机:slaveof 127.0.0.1 6381(另一个从机端口号)
    从机下可以再挂从机
    反客为主:
    当一个master宕机后,slave可以变成主机:slave no one 将从机变成主机
  27. 主从复制-哨兵模式

    反客为主的自动版:能够后台监控主机是否故障,如果故障了根据投票数自动将从库转换为主库
    1:自定义的/myredis 目录下新建sentinel.conf 文件,名字绝不能错
    2:配置哨兵,填写内容:sentinel monitor mymaster 127.0.0.1 6379 1[至少多少个哨兵同一迁移的数量]
    3:slave/replica-priority 100:从机切换主机的规则【选择条件:1,优先级靠前的。2,偏移量最大的。3,runid最小的从服务】,值越小优先级越高
    缺点:复制延时 
    可以用jedis操作
  28. redis集群

    容量不够,redis如何进行扩容?
    并发写操作,redis如何分摊压力?
    集群解决。
    主机代理:主机挂掉,从机上
    无中心化集群配置:任何一个服务器,都可以作为集群入口,可以互相进行访问
    实际中,一个服务占用一台linux系统
    redis集群实现了对redis的水平扩容
  29. redis集群

    1:删除所有rdb文件,制作6个实例,不同的端口号
    2:redis-cluster配置修改
    3: /src 下,将6个主机变成集群,主机ip:端口号
    4:-c ,采用集群策略连接
  30. 集群操作和故障恢复

    redis cluster 如何分配这6个节点
    ——cluster -replicas 1 表示我们希望为集群中的每个主节点创建一个从节点
    分配原则:保证主与从不在一个ip地址上,为了防止系统挂掉
    slots:插槽,一个redis集群中包含16384个插槽,根据key计算插槽
    在集群中录入值:set key value 
    录入多个值:mset name{user} lucy age{user} 20
    查询插槽值:cluster keyslot key
    查看自己插槽中的值:cluster countkeysinslot 插槽值
    返回插槽中键的数量:cluster getkeysinslot slot count
    故障恢复:主机挂掉后再恢复,会变从机
    cluster-require-full-coverage:yes.如果某一段插槽的主从全挂掉,那么整个集群全挂掉,如果为no,则只是那一段的插槽不能用
  31. 集群的jedis开发

    jedis
    redis集群好处:【实现扩容,分摊压力,无中心配置相对简单】
    redis集群的操作:【多键操作不支持】
  32. Redis-缓存穿透

    缓存穿透:key对应的数据源不存在,每次对key的请求从缓存获取不到,请求会压到数据源,从而可能压垮数据源
    解决方案:【
    1:对空值缓存,设置空结果的过期时间很短
    2:设置白名单,bitmaps定义可访问名单
    3:采用布隆过滤器,实际上是一个很长的二进制向量和一系列随机映射函数
    4:进行实时监控
    】
  33. redis-缓存击穿

    缓存击穿:某个key对应的数据存在(热门访问key),但是在redis中过期,但是大量请求过来,这些请求发现缓存过期一般会从后端db加载数据并回设到缓存,这个时候大并发的请求可能瞬间把后端db压垮
    解决方案:
    【
    1:预先设置热门数据,加大热门key的时长
    2:实时调整,调整key的过期时长
    3:使用锁,
    】
  34. redis-缓存雪崩

    缓存雪崩:在极少的时间内,出现了大量的集中key过期
    解决方案:【
    1:构建多极缓存架构(ngix+redis+其他缓存)
    2:使用锁或队列,保证不会高并发
    3:设置过期标志更新缓存,
    4:将缓存失效时间分散开 
    】
  35. redis-分布式锁(设置锁和过期时间)

    跨jvm
    [
    1:基于数据库实现分布式锁
    2:基于缓存(redis等)
    3:基于zookeeper
    ]
    redis实现分布式锁:setnx命令-del即释放锁——/设置过期时间//上锁的时候就设置过期时间(set key 10 nx ex 12)
  36. redis-分布式锁(uuid防止误删)

    分布式锁中的问题,a进程因卡顿而释放别的进程的锁
    解决方案:set lock uuid nx ex 10,释放锁的时候,判断当前uuid和要释放锁uuid是否一样
  37. redis-分布式锁(lua保证删除原子性)

    原子性操作问题:正要删除,还未删除,锁到了过期时间,自动释放,b得到锁后,a进行删除时,会释放b的锁
    lua脚本:支持原子性的操作-用脚本判断uuid是否一样 uuid加lua脚本
  38. redis-新功能介绍

    acl:访问控制链表
    添加用户:acl setuser lucy
    查看当前用户:acl whoami
    ...
    io多线程:专用于网络编程
    工具支持cluster

     


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值