redis相关知识

Redis 用于缓存之外,Redis 也经常用来做分布式锁,甚至是消息队列。
分布式缓存主要解决的是单机缓存的容量受限并且保存的信息不能通用的问题

Redis 和 Memcached 的区别和共同点

共同点:

  1. 都是基于内存的数据库
  2. 都有过期策略
  3. 性能都较高
    区别:
  4. redis支持更丰富的数据类型(redis支持k/v ,list,set,zset,hash 。Memcached 只支持最简单的 k/v 数据类型)
  5. redis支持数据的持久化。可以内存中的数据保持在磁盘中,重启的时候记载持久化文件即可。但是Memcached 只能存在内存中
  6. redis有灾难恢复机制,可以把缓存张红的数据持久化到磁盘上
  7. 当内存使用完后,可以将不用的数据持久化到磁盘,但是Memcached在内存用完后会报异常
  8. redis原生支持cluster模式。
  9. redis采用单线程,mecached 是多线程
  10. redis支持发布订阅模型 ,Lua脚本,事务等功能,但是mecached不支持,
  11. mecached过期数据的删除策略只用了惰性删除,而redis同时使用了惰性删除与定期删除

缓存数据处理流程

在这里插入图片描述

  1. 用户请求先去缓存中查找,查找成功就返回数据。
  2. 如果缓存中查找失败,则去数据库中查找 ,数据库查找成功则返回数据并更新缓存,查找失败则返回空

Redis 常见数据结构

  1. string :string 数据结构是简单的 key-value 类型,并不是采用的,而是自己构建了一种 简单动态字符串SDS,可以保存文本和二进制数据
    应用于需要计数的场景,比如用户的访问次数、热点文章的点赞转发数量等等。
  2. list:是双向链表,支持反向查找和遍历
    应用场景: 发布与订阅或者说消息队列、慢查询。
  3. hash:类似于JDK1.8 前的 HashMap,内部实现为数组+链表,hash 是一个 string 类型的 field 和 value 的映射表,特别适合用于存储对象
    应用场景: 系统中对象数据的存储。
  4. set:类似于java的HashSet,适用于存储不重复数据可以基于 set 轻易实现交集、并集、差集的操作
    应用场景:存放的数据 不可以重复并且求数据源交集和并集场景
    5.sorted set :和set相比增加了一个权重参数score,集合中元素可以根据此参数进行有序排列,或者通过score范围获取
    应用场景:需要对数据根据权重进行排序的场景。

Redis 单线程模型

redis是基于reactor模式来开发的自己的事件处理模型,由于此模型对应redis的文件事件处理器,因此说redis是单线程模型
既然redis是单线程,那怎么监听大量的客户端连接呢?

redis使用的是I/O多路复用程序,监听的客户端的大量连接,I/O多路复用技术让redis不需要再创建多余线程来监听客户端连接,降低资源消耗
redis是一个事件驱动程序,需要处理两种事件:文件事件和时间事件

文件事件处理器

  1. 多个客户端
  2. I/O多路复用程序
  3. 事件分派器
  4. 事件处理器
    redis为什么使用单线程的优势?
  5. 单线程编程容易维护
  6. redis的性能瓶颈主要为内存和网络
  7. 多线程会存在死锁,线程上下文切换
    redis设置缓存数据过期时间
    由于内存是有限的,如果缓存中所有数据都保存,很有可能会发生内存溢出问题。
    setex命令是字符串类型的独有的设置过期时间的命令,其他类型都需要expire命令persist命令可以移除一个键的过期时间

127.0.0.1:6379> exp key 60 # 数据在 60s 后过期
(integer) 1
127.0.0.1:6379> setex key 60 value # 数据在 60s 后过期 (setex:[set] + [ex]pire)
OK
127.0.0.1:6379> ttl key # 查看数据还有多久过期
(integer) 56

redis怎样判断是否过期?
redis有一个过期字典来保存过期时间。过期字典的键指向数据库中的某个key,过期字典的值是一个long long类型的整数,这个整数保存了key所指向的数据库键的过期时间

redis过期数据的删除策略

  1. 惰性删除:只会在数据取出时才对数据进行过期检查。但是会造成太多过期key没有被删除
  2. 定期删除:每隔一段时间抽取一批key执行过期key操作
    redis内存淘汰机制
    redis提供6种数据淘汰策略:
  3. 从已设置过期时间的数据中挑选最近最少使用的数据淘汰
  4. 从已设置过期时间的数据及中挑选将要过期的数据淘汰
  5. 从已设置过期时间的数据集中任意选择数据淘汰
  6. 当内存不足以容纳新写入数据时,在键空间中,移除最近最少使用的key
  7. 从数据集中任意选择数据淘汰
  8. 禁止驱逐数据,也就是说当内存不足以 容纳写入数据时,写入操作会报错.

redis持久化(redis挂掉之后再重启数据可以进行恢复)
redis有两种方式做持久化,一种为快照(RDB),另一种为aof快照
rdb通过创建快照来获得存储在内存中的数据在某个时间点的副本,对快照进行备份。还可以将此快照其他服务器(主从复制)
aof实时性更好,每一次更改redis数据的操作都会写进AOF文件,该文件时appendonly.aof
redis事务
事务的四大特性(ACID):原子性,隔离性,持久性,一致性
原子性:事务是最小的执行单位,不允许分割,要么全部成功要么全部失败
隔离性:事务之间不会相互干扰,是独立的。
持久性:事务提交后对数据的改变是持久的,不可逆的
一致性:多个事务对同一数据读取的结果是相同的
redis不满足原子性和持久性,不满足原子性的原因是不支持roll back
redis事务提供一种将多个命令请求打包执行并且不中断的共嗯那个
缓存穿透
缓存穿透就是大量请求的key不在缓存中全部请求到了数据库中。
怎么处理:
1)缓存无效key; 2)布隆过滤器
缓存无效key:就是每次把缓存和数据库都查不到的key放在缓存中并设置过期值
布隆过滤器:布隆判断某个元素存在时可能会 误判,判断元素不存在时不会发生误判(底层原理和hash相关)
缓存雪崩
缓存同一时间大面积失效,这是请求就会到数据库,给数据库造成了压力
解决办法:
1… 采用redis集群,
9. 限流 ,不让处理大量的请求
10. 设置不同的失效时间
如何保证缓存和数据库数据的一致性
对于先更新数据库在再删除缓存,如果更新成功但是删除失败有两个解决方案
1)更改缓存的时间,使时间变短
2)增加cahce更新重新机制:失败就隔一段时间进行重试

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值