Redis(Remote Dictionary Server)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/baijunzhijiang_01/article/details/84316646
  1. 什么是Redis?

    是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库

  2. Redis性能为何那么快

    1. 纯内存操作
    2. 单线程操作,避免了频繁的上下文切换
    3. 采用了非阻塞 I/O 多路复用机制
  3. Redis的使用场景

    1. 计数器
    2. 分布式锁
    3. 字典表
    4. session共享
    5. 缓存数据库数据
    6. 显示最新的项目列表
    7. 排行榜应用,取TOP N操作
    8. 删除与过滤
    9. 按照用户投票和时间排序
    10. 处理过期项目
    11. 特定时间内的特定项目
    12. 查找某个值所在的区间(区间无重合) :(Sorted Set)
    13. 交集,并集,差集:(Set)
    14. 队列
    15. 注册中心(发布/订阅)
  4. Redis的数据类型

    1. String:数据结构是简单的key-value类型,value其实不仅是String,也可以是数字
    2. Hash:
    3. List
    4. Set
    5. Sorted set
    6. Pub/Sub 订阅模型
  5. redis实现持久化的方式

    1. RDB快照,将REDIS内存中的数据以二进制的形式备份到磁盘中
    2. AOF只追加文件,在执行写命令的时候,将执行的写命令复制到硬盘里面,后期恢复的时候,只需要1. 重新执行一下这个写命令就可以了。类似于我们的MySQL数据库在进行主从复制的时候,使用的是bi1. nlog二进制文件,同样的是执行一遍写命令;
  6. Redis和Memcached的不同

    1. 存储方式:
      1. memecache 无法进行持久化,数据不能备份,只能用于缓存使用,且重启后数据全部丢失。数据不能超过内存大小。
      2. redis支持持久化操作,可以进行aof及rdb数据持久化到磁盘,从而进行数据备份或数据恢复等操作,较好的防止数据丢失的手段。
    2. 数据支持类型
      1. redis在数据支持上要比memecache多的多。提供string,list,dict,set,zset,hyperloglog
    3. value大小:redis最大可以达到1GB,而memcache只有1MB
    4. 多线程支持:
      1. Memcached可以利用多核优势,单实例吞吐量极高,可以达到几十万QPS,适用于最大程度扛量
      2. Redis单线程请求,所有命令串行执行,并发情况下不需要考虑数据一致性问题。因为是纯内存操作,Redis的性能非常出色,每秒可以处理超过 10万次读写操作,是已知性能最快的Key-Value DB。
  7. Redis的部署方式有几种,高可用的部署方式,各有什么区别

    1. Redis Standalone:单节点模式
    2. Redis master-slave:主从模式
    3. Redis Sentinel(哨兵模式):高可用性(HA)解决方案
    4. Redis cluster:Redis的分布式解决方案
  8. Redis缓存穿透的问题,如何解决?

    1. 缓存空数据 当第一次查询数据库时,若数据不存在,返回空数据时将其写入缓存,后续查询就不必再去查询数据库了。存在问题:如果key过期时间较长,出现恶意攻击时,容易出现内存不够的情况。另外,需要额外的业务逻辑处理数据库与缓存中数据一致性的问题。
    2. 对查询结果为空的情况也进行缓存,缓存时间设置短一点,或者该key对应的数据insert了之后清理缓存,对一定不存在的key进行过滤。可以把所有的可能存在的key放到一个大的Bitmap中,查询时通过该bitmap过滤。
  9. redis的缓存碎片怎么处理?

    1. 目前没有什么实际方案好于重启。
    2. 有条件扩大内存大小。
    3. 添加内存监控,当内存使用率到阈值之后重启redis,回收内存
  10. MySQL里有2000w数据,redis中只存20w的数据,如何保证redis中的数据都是热点数据

    1. redis 内存数据集大小上升到一定大小的时候,就会施行数据淘汰策略。
  11. Redis的过期策略

    1. 过期策略通常有三种,定时过期,惰性过期,定期过期。Redis采用的是定期删除+惰性删除策略。
    2. 定时过期:每个设置过期时间的key都需要创建一个定时器,到过期时间就会立即清除。该策略可以立即清除过期的数据,对内存很友好;但是会占用大量的CPU资源去处理过期的数据,从而影响缓存的响应时间和吞吐量。
    3. 惰性过期:只有当访问一个key时,才会判断该key是否已过期,过期则清除。该策略可以最大化地节省CPU资源,却对内存非常不友好。极端情况可能出现大量的过期key没有再次被访问,从而不会被清除,占用大量内存。
    4. 定期过期:每隔一定的时间,会扫描一定数量的数据库的expires字典中一定数量的key,并清除其中已过期的key。该策略是前两者的一个折中方案。通过调整定时扫描的时间间隔和每次扫描的限定耗时,可以在不同情况下使得CPU和内存资源达到最优的平衡效果。
  12. redis 数据淘汰策略:

    1. maxmemory Redis能使用的最大内存,可以在redis.conf中配置。如果内存空间用满,就会自动驱逐老的数据
    2. voltile-lru:从已设置过期时间的数据集(server.db[i].expires)中挑选最近最少使用的数据淘汰
    3. volatile-ttl:从已设置过期时间的数据集(server.db[i].expires)中挑选将要过期的数据淘汰
    4. volatile-random:从已设置过期时间的数据集(server.db[i].expires)中任意选择数据淘汰
    5. allkeys-lru:从数据集(server.db[i].dict)中挑选最近最少使用的数据淘汰
    6. allkeys-random:从数据集(server.db[i].dict)中任意选择数据淘汰
    7. no-enviction(驱逐):禁止驱逐数据
  13. redis的缓存雪崩?

    1. 当缓存服务器重启或者大量缓存集中在某一个时间段失效,这样在失效的时候,也会给后端系统(比1. 如DB)带来很大压力。
    2. 如何避免?
    3. 在缓存失效后,通过加锁或者队列来控制读数据库写缓存的线程数量。比如对某个key只允许一个线1. 程查询数据和写缓存,其他线程等待。
    4. 不同的key,设置不同的过期时间,让缓存失效的时间点尽量均匀。
    5. 做二级缓存,A1为原始缓存,A2为拷贝缓存,A1失效时,可以访问A2,A1缓存失效时间设置为短期1. ,A2设置为长期(此点为补充)
  14. Redis如何保证数据库数据和Redis缓存数据的一致性的问题

    1. 缓存系统与底层数据的一致性。这点在底层系统是“可读可写”时,写得尤为重要
    2. 有继承关系的缓存之间的一致性。为了尽量提高缓存命中率,缓存也是分层:全局缓存,二级缓存。他们是存在继承关系的。全局缓存可以有二级缓存来组成。
    3. 多个缓存副本之间的一致性。为了保证系统的高可用性,缓存系统背后往往会接两套存储系统(如memcache,redis等)。
  15. Redis的命令

    命令 操作 说明
    启动Redis > redis-server [–port 6379]
    通过配置文件来启动Redis。 > redis-server [xx/xx/redis.conf]
    连接Redis > ./redis-cli [-h 127.0.0.1 -p 6379]
    停止Redis > redis-cli shutdown 或者 > kill redis-pid
    发送命令 > redis-cli shutdown 结果not connected>
    测试连通性 127.0.0.1:6379> ping结果PONG
    可以删除一个或多个键,返回值是删除的键的个数 del key [key…] 注意:不支持通配符删除
    判断一个键值是否存在 exists key 如果存在,返回整数类型 1 ,否则返回 0
    获得键值的数据类型 type key 返回值可能是 string(字符串类型) hash(散列类型) list(列表类型) set(集合类型) zset(有序集合类型)
    赋值 set key value 赋值
    取值 get key 取值
  16. Redis集群部署实现数据共享

    1. 主从复制:
    2. 哨兵模式:
  17. Redis的事务

    1. MULTI, EXEC, DISCARD 和WATCH命令是Redis事务操作的基础
    2. 他们可以让Redis在一个步骤里执行一组命令,且能做到如下2个重要保证:
      1. 事务中的所有命令都是序列化且都是按顺序执行的。在一个客户端执行Redis事务的过程中,不会接收其他任何客户端对它发出的请求。这保证了这些命令是作为一个单独的独立操作执行的。
      2. 所有的命令要么都被一起处理,要么全都没有被处理,所以Redis事务是原子的。EXEC会命令触发事务中所有命令的执行。当正在使用AOF时,Redis会使用一个简单的write(2)系统级调用来确保把事务写入到磁盘。但是,如果Redis服务崩溃,或者被系统管理员以某种强制的方式杀死,那么可能只有部分命令被写入到磁盘。Redis在重新启动时会检测这种情况,并报错,然后退出。使用redis-check-aof工具可以检查AOF,并移除那不完整的事务,使服务可以再次启动
    3. Redis命令在事务中可能会执行失败,但是Redis事务不会回滚,而是继续会执行余下的命令。
  18. 单机部署和集群部署配置有什么区别吗?

  19. Redis的哨兵模式

  20. Redis CacheCloud(Redis云管理平台)

    1. 实现多种类型(Redis Standalone、Redis 1. Sentinel、Redis Cluster)自动部署、解决Redis实例碎片化现象、提供完善统计、监控、运维功能减少运维成本和误操作,提高机器的利用率,提供灵活的伸缩性,提供方便的接入客户端。
  21. Redis数据一致性的问题,操作数据库之后,清空缓存报错,如何解决?

    1. 先删除缓存在清空数据库

猜你喜欢

转载自blog.csdn.net/baijunzhijiang_01/article/details/84316646
今日推荐