Redis

缓存问题

缓存穿透

  • 问题:key在Redis中根本不存在,直接访问数据库;
  • 解决:布隆过滤器,一定不存在的被拦截。

    缓存击穿

  • 问题:某个经常被访问的key(热点数据)过期,产生大量数据库读取操作;

  • 解决:使用互斥锁挡住后续请求,自身访问数据库并写会缓存,由于锁被挡住的请求自己进入等待;

    缓存雪崩

  • 问题:大量key在同一时刻过期,请求全部转到数据库;

  • 解决:使用锁或队列,保证单线程写/失效时间分散。

    Redis常用数据类型

  • string:默认最大512M,可以存储任何类型的数据(二进制、JSON、序列化数据等);

  • list:按插入顺序排序,底层为双向链表;
  • set:无序不重复集合;
  • hash:适合存储POJO;
  • zset:根据分数排序的不重复集合。

    Redis持久化

    为了解决内存数据丢失,使用持久化功能RDB(Redis Data Base)/AOF(Append Only File)将数据保存到硬盘,重启Redis时把硬盘的数据重新加载到内存。

  • RDB(默认):指定时间间隔内,Redis执行了一定次数的操作,自动触发一次持久化到磁盘;

  • AOF:使用操作日志记录Redis的每一次写操作,下次启动Redis时重新执行写操作,类似于MySQL的bin log。

    Redis事务

    Redis的事务只支持部分原子性,使用multi命令开启事务队列,将事务所需全部命令输入后,使用exec执行事务队列,可以使用watch <key>/unwatch <key>堆某个key进行监控来实现CAS。

  • 在命令进入事务队列时如果出错,所有队列中的命令都不会被执行,满足原子性;

  • 进入事务队列成功,执行exec时出错,不满足原子性。