Redis学习笔记

1.什么是Redis?
redis是C语言开发的一个开源的高性能键值对数据库
支持的键值数据类型:字符串类型 哈希类型 列表类型 集合类型 有序集合类型
redis的应用场景:
缓存 :数据查询 短链接 新闻内容 商品内容等
聊天室的在线好友列表
任务队列:秒杀 抢购 等
应用排行榜
网站访问统计
分布式集群架构的session分离

2.hash一致性算法
在hash取余算法基础上发展而来的
hash取余算法 将key值对服务器节点个数取余

hash取余算法有个极大的缺点,如果有节点发生变化时(集群中经常发生),所有的数据将可能会迁移到新节点上

好的hash算法有四大标准
平衡性 哈希的结果能够尽可能分布到所有的缓存中 由虚拟节点解决这个问题
单调性 保证分配过的节点不迁移 新的能使用
分散性 在分布式环境中 客户端请求时 可能不知道所有服务器的存在 只知道一部分服务器的存在 如果多个客户端都把部分服务器作为完整的hash环 可能导致相同的请求映射到不同的服务器 分散性是指以上情况发生的严重程度 不同的终端将相同的内容映射到不同的缓冲区

负载 特定的缓冲区,被不同的用户映射为不同的内容

为什么一致性hash可以降低分散性
因为一致性hash的取模运算 是对2的32次方-1 取模 不是对服务器的数量取模 所以一致性hash保证相同请求的映射地址都是一样的 和服务器的数量没关系 这样只要不同额客户端都能到存储的该数据的服务器 都可以准确的找到该服务器 不用考虑客户端知道的服务器的数量

hash一致性算法底层工作原理

两大设计 hash 环的设计 虚拟节点的设计

3.redis常用命令
redis-cli
shutdown
ps - ef|grep redis

redis-server 启动服务
redis -cli
keys * 查看所有的
set name tony
get name
keys *

1.切换数据库
select 1

2.查看某个jian是否存在
exists name

3.删除
del name

4.查看类型
set num 123
type num

5.help

6.flushall 清空数据库
flushdb 清空当前数据库

4.Redis事务机制
multi 开启事务

exec提交事务

4.事务对异常的处理机制
redis执行命令的错误主要分为两种
1.命令错误 执行命令语法错误 比如将set命令携程sett
2.运行时错误 命令语法正确 但是执行错误 比如说对list集合执行 add命令
redis事务中如果发生上面两种错误 处理机制是不同的

命令错误处理机制
开启事务之后 往事务中添加的命令如果有命令错误,那么整个事务中的命令都不会执行

运行时错误处理机制
如果语法没有错误 而执行过程中发生了运行时错误 redis不仅不会回滚事务 还会跳过整个运行时错误 继续向下执行命令

乐观锁
大多数是基于数据版本(version)的记录机制实现的 即为数据增加一个版本表示
在基于数据库表的版本解决方案中 一半是通过为数据库表增加一个version
字段实现读取数据时,将此版本号一同读出 之后更新时 将此版本号加1
此时 将提交数据的版本号与数据库表对应的版本号进行比对 如果提交的数据版本号大于
数据库当前版本号 则予以更新 否则认为是过期数据

redis也采用类似的机制 使用watch命令监视给定的key 当exec时候如果监视的Key
从调用watch后发生过变化 则整个事务会失败 也可以调用watch 多次监视多个ke
这样就可以对指定的key加乐观锁

redis是单线程 日胶命令时,其他命令无法插入其中 利用单线程实现了事务的原子性

multi 开启事务
exec 提交事务
discard 取消事务
watch 监控 如果监控的值发生变化 则提交事务时会失败
unwatch 去掉监控

redis 保证一个事务中的所有命令要么都执行 要么都不执行 如果在发送exec命令钱客户端短线了 则redis会清空事务
队列 事务中的所有命令都不会执行 而一旦客户端发送了exec命令所有的命令都会被执行
计释此后客户端短线也没关系 因为redis 中已经记录了所有要执行的命令

5.Redis的两种灾难恢复模式

Redis的两种灾难恢复模式

RDB 整个拷贝内存
fork一个进程 遍历hashtable 利用copy on write 把整个db dump保存下来 save shutdown slave命令
会触发整个操作
批量带来的问题 会损失一部分数据
平时写操作的时候不触发写 只有手动提交save命令 或者是shutdown关闭命令 才触发备份操作
AOF 把写操作命令 持续的写道一个类似日志文件里 类似导出sql一样 只记录写操作 粒度较小

6.Redis生存时间

例子:
set bomb tnt
expire bomb 10 过期时间

til bomb 查看时间
返回值为-2时候 表示被删除

如果中途不想被删除
persist bomb

pexpire 毫秒级 做秒杀业务

7.缓存雪崩等问题

1.缓存处理流程
前台请求 后台先从缓存中取数据 取到直接返回结果 取不到时从数据库中取,数据库取到更新缓存 并返回结果
数据库也没取到 则直接返回空结果

2.缓存穿透
描述:
缓存穿透是指缓存和数据库中都没有的数据,而用户不断发起请求,会导致数据库压力过大
解决方案:
1)接口层增加校验,对用户输入做基础校验 拦截等 布隆过滤器
2)从缓存取不到的数据 如果从数据库也查不到 这时可以将 存为 key-null 缓存有效时间可以设置短点
这样可以放值攻击用户反复用同一个Id暴力攻击

3.缓存击穿
描述:
缓存击穿是指缓存中没有 但是数据库有的数据(一般是缓存时间到期) 这时由于并发用户特别多,同时读缓存没有读到数据,又同时去数据库去取数据 引起数据库压力瞬间增大 造成过大压力
解决方案:
1)设置热点数据永远不过期
2)加互斥锁

4.缓存雪崩
描述:缓存雪崩是指缓存中数据大批量到过期时间 而查询数据量巨大 引起数据库压力过大 甚至down机
和缓存击穿不同的是,缓存击穿并发查同一条数据 缓存雪崩是不同数据都过期了 很多数据都查不到从而查
数据库
解决方案:
1)缓存数据的过期时间设置为随机的 防止同一时间大量数据过期现象发生
2) 如果缓存数据库是分布式部署 将热点数据均匀分布在不同的缓存数据库中
3)设置热点数据永远不过期

5.缓存击穿案列:关晓彤、鹿晗搞挂微博事件
问题:
这个热点Key的访问如何解决?
1)可以通过hash分key 把一个key拆分程多 个key 分不到不同的节点 放值单点过热
比如一个key之前就分到一个节点上 把key做了拆分 就像一致性hash的虚拟节点
分散访问
2) 本地缓存 简单点就一个hashMap,或者Ehcache 用本地缓存来应对极热数据

8.Redis分片

在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值