Redis总结

一. 简介

  1. Redis是什么?
    Redis是一个开源的,使用C语言编写的,支持集群、分布式、主从同步等配置的、基于内存的、可持久化的、单线程的k-v框架。

  2. 优点
    a. 性能优越,可支持每秒十几万的读/写操作(性能优越的原因:1. 基于ANSI C语言编写,接近汇编语言的机器语言,运行十分快; 2. 基于内存的读/写; 3. 数据结构简单,只有6种数据类型);
    b. 支持集群、分布式、主从同步等配置;
    c. 支持一定的事务能力;

  3. 缺点
    不支持减法、乘法、除法操作,功能十分有限

  4. Redis支持的数据类型
    String、list、set、zset(有序集合)、hash、HyperLogLog(基数)

二. Redis数据结构常用命令

三. Redis的一些常用技术

  1. Redis中使用事务的三个过程
    a. 开启事务
    b. 命令进入队列
    c. 执行事务(exec)

  2. Redis事务命令

    multi :开启事务
    watch : 监听某些键
    unwatch : 取消监听某些键
    exec : 执行事务
    discard : 回滚事务

  3. CAS(比较与替换,Compare And Swap)原理在Redis中的应用
    原因:为了克服多线程数据不一致问题

    原理:
    a. 首先,在线程开始时读取这些多线程共享的数据,并将其保存到当前进程的副本中(即 旧值),watch命令就是样一个功能;
    b. 然后,开启线程业务逻辑,multi提供此功能;
    c. 在执行更新前,比较当前线程副本保存的旧值和当前线程共享的值是否一致,如果不一致,则更新失败,进行事务回滚;否则更新成功,exec就是提供“类似”的功能
    ⚠️注意:“类似”并非完全是,因为CAS会产生ABA问题

  4. 超时命令
    a. del命令可以删除一些键值对
    b. 还会按照回收机制去自动回收一些键值对

  5. 如果key超时了,Redis会回收key的存储空间吗?
    不会。Redis的key超时不会被其自动回收,它只会标示哪些键值对超时了

  6. 键值对回收的方法
    定时回收:再确定的某个时间触发一段代码,回收超时的键值对;
    惰性回收:当一个键值对超时了,被再次get命令访问时,将触发Redis将其从内存中清空。

四. Redis配置

  1. Redis备份(持久化)的方式
    快照:备份当前瞬间Redis在内存中的数据记录;
    只追加文件(AOF):在持久化文件尾部继续跟上操作的命令。

  2. Redis内存回收策略

    · volatile-lru : 采用最近使用最少的淘汰策略,回收超时的键值对;
    · allkeys-lru :采用淘汰最少使用的策略,对所有的键值对(不仅仅是超时的)采用最近使用最少的淘汰策略;
    · volatile-random : 采用随机淘汰的策略删除超时的键值对;
    · allkeys-random :采用随机淘汰的策略删除所有的键值对;
    · volatile-ttl :采用删除存活时间最短的键值对策略;
    noeviction : 不淘汰任何键值对,当内存已满时,只读不写

  3. 复制

    1. 主从架构设计思路
      a. 在多台数据服务器中,只有一台主服务器,且主服务器只否则写入数据,从服务器只否则同步主服务器的数据,并让外部程序读取数据;
      b. 主服务器在写数据后,即刻将写入数据的命令发送给从服务器,从而使得主从服务器数据同步;
      c. 当主服务器不能工作时,从从服务器中选举一台来当主服务器。
      主从同步机制:
      Redis总结2. Redis主从同步过程
      Redis总结3. 哨兵模式
      原因:因主服务器中断后,可将从服务器升级为主服务器,以便提供服务,但此过程需手动实现,故redis2.8中提供了哨兵工具来实现自动化的系统监控和故障恢复;
      改进:监视主/从服务器是否正常运行,主服务器出现故障时自动将从服务器升级为主服务器。
      4.集群
      原因:哨兵模式已实现了高可用,读写分离,但这种模式下后台redis服务器都存储相同的数据,很浪费内存,故redis3.0引入了集群模式,实现了redis的分布式存储。
      特点:采用无中心结构所有redis节点彼此互联,内部使用二进制协议优化传输速率和带宽节点的fail是通过集群中超过半数的节点检测失效时才生效

五. Spring缓存机制和Redis的结合

  1. Redis和数据库的读操作
    当设置Redis的数据超时后,Redis就无法读出数据,此时就会触发程序读取数据库,然后将读取的数据库数据写入Redis,达到按一定时间间隔刷新一次数据

  2. Redis和数据库的写操作
    写入业务数据,先从数据库中读取最新数据,然后进行业务操作,更新业务数据到数据库,再将数据刷新到Redis缓存中,避免了脏读。

  3. Spring的缓存管理器
    Spring项目中提供了接口CacheManager来定义缓存管理器;
    @EnableCaching:Spring IoC容器启动了缓存机制;

  4. 缓存注解

    • @Cacheable:
      表明在进入方法之前,Spring会先去缓存服务器中查找对应key的缓存值,如果找到缓存值,那么Spring将不会再调用方法,而是将缓存值读出,返回给调用者:如果没有找到缓存值,那么Spring就会执行你的方法,将最后的结果通过key保存到缓存服务器中;
    • @CachePut:Spring会将该方法返回的值缓存到缓存服务器中,这里需要注意的是,Spring 不会事先去缓存服务器中查找,而是直接执行方法,然后缓存。换句话说,该方法始终会被Spring所调用;
    • @CacheEvict:移除缓存对应的key的值;
    • @Caching:这是一个分组注解,它能够同时应用于其他缓存的注解.
  5. 自调用失效问题
    因为缓存注解也是基于Spring AOP的。