Redis

优点:速度快

缺点:只适合存储一些较为简单的数据,不合适复杂查询的数据,不适合持久化储存海量数据

持久化:

**RDB:**把数据以快照的形式保存在磁盘上。save,bgsave,自动化redis.conf

优点:全量备份适用于备份和灾难恢复

缺点:快照持久化期间修改的数据不会被保存

**AOF:**开启AOF后RDB默认会失效

优点:AOF可以更好的保护数据不丢失

缺点:AOF日志文件通常比RDB数据快照文件更大

Redis集群:

主从复制:

主备切换(哨兵):

cluster集群(卡槽):

可能遇到的问题

缓存击穿:

原因:某个热门key突然过期

  1. 热门数据设置永不过期
  2. 加互斥锁

缓存穿透:

原因:请求缓存与数据库中都没有的数据

  1. 布隆过滤器
  2. 从数据库中也没有取到数据时,将key-null存入redis,设置短暂的有效时间
  3. 加互斥锁

缓存雪崩:

原因:大量缓存一段时间内集中过期了

  1. 缓存失效时间设为随机值
  2. 热点数据永不过期
  3. 互斥锁
  4. 双缓存

五种常用的数据类型

String(字符串): 浏览量和分布式锁

setnx 如果不存在,则set 用作分布式锁

psetex 生存时间毫秒

setex 生存时间秒

decr 数字减一

incr 数字加一

Hash(哈希表):实现购物车,相当于Map<String,Map<object,object>>

Hgetall 返回所有的域和值

HDel

HLen 域的数量

Hincrby 域的值加上增量

hval

List(列表)实现消息流

LRange之类

Set(集合)抽奖,点赞,关注,收藏

Smembers 返回集合中所有的成员

Srandmember key [] 返回集合中随机元素 抽奖

Sinter 交集

Sunion 并集

SDiff 差集

Z-Set(有序集) 热搜

跳表/压缩列表

跳表:空间换时间

其他不常用 bitmap位图、hyperloglogs统计、geospatial地理位置

setnx+lua脚本实现分布式锁

如果不使用lua脚本的话,需要multi开启一个事务,watch之类,事务乐观锁机制

分布式锁:redis和zookeeper

redis:ap 异步复制可能造成锁丢失

zookeeper:cp

Synchnorized和ReentrantLock单机锁无法解决分布式超卖现象。

redis分布式锁的两大问题:

1.如何确保redisLock过期时间大于业务执行时间

2.集群下锁丢失的问题

redis内存配置

一般配3/4,默认是全部。redis满了会报OOM

删除策略

1.定时删除 cpu很忙

2.惰性删除 对内存不友好

3.定期删除 每隔一段时间执行一次,删除过期的键操作(随机抽取)

内存淘汰策略

1.noveiction:不会驱逐任何key

2.allkeys-lru:对所有的key使用lru算法进行删除

3.volatile-lru:对设置过期时间的key使用lru算法

4.allkeys-random:对所有的key随机删除

5.volatile-random:对设置了过期时间的key随机删除

6.volotile-ttl:要过期的key删除

7.allkeys-lfu:对所有的key使用lfu算法进行删除

8.volatile-lfu:对设置了过期时间的key进行lfu算法进行删除