Redis的特点

redis是以键值对key-value存储的数据库,基于内存可持久化的数据库,性能高,高并发,是单线程的,线程安全,支持分布式,集群,支持事务,可以用作缓存,消息队列,也可以用作分布式锁。

Redis支持的数据类型

  1. 字符串(string)可以用来做最简单的数据,可以缓存某个简单的字符串,也可以缓存某个json格式的字符串,Redis分布式锁的实现就利用了这种数据结构,还包括可以实现计数器、Session共享、分布式ID
  2. 哈希类型(hash)可以用来存储一些key-value对,更适合用来存储对象
  3. 列表类型(list)Redis的列表通过命令的组合,既可以当做栈,也可以当做队列来使用,可以用来缓存类似微信公众号、微博等消息流数据
  4. 集合类型(set)和列表类似,也可以存储多个元素,但是不能重复,集合可以进行交集、并集、差集操作,从而可以实现类似,我和某人共同关注的人、朋友圈点赞等功能
  5. 有序集合类型(zset)集合是无序的,有序集合可以设置顺序,可以用来实现排行榜功能

    Redis持久化策略

  • Rdb:rdb会周期性对redis的数据进行持久化
  • Aof:将每条写入命令写入日志中,在redis重启的时候通过日志文件重构数据

Rdb会产生多个文件,每个文件代表某一个时刻的redis数据。对于aof来说,基于rdb恢复数据会更快。
redis故障Rdb会丢失更多的数据,Rdb快照都是隔5分钟或者更长时间生成,而aof每隔一秒就会执行一次,所以只会丢失一秒钟的数据。

Redis的内存淘汰机制

  • noeviction: 当内存不足时,新写入操作会报错
  • allkeys-lru:当内存不足时,移除最近最少使用的 key(这个是最常用的)。
  • allkeys-random:当内存不足时,随机移除某个 key。
  • volatile-lru:当内存不足时,在设置了过期时间的键中,移除最近最少使用的 key。
  • volatile-random:当内存不足时,在设置了过期时间的键中,随机移除某个 key。
  • volatile-ttl:当内存不足时,在设置了过期时间的键中,有更早过期时间的 key 优先移除。

    Redis分布式锁底层是如何实现的?

  1. 首先利用setnx来保证:如果key不存在才能获取到锁,如果key存在,则获取不到锁
  2. 然后还要利用lua脚本来保证多个redis操作的原子性
  3. 同时还要考虑到锁过期,所以需要额外的一个看门狗定时任务来监听锁是否需要续约
  4. 同时还要考虑到redis节点挂掉后的情况,所以需要采用红锁的方式来同时向N/2+1个节点申请锁,都申请到了才证明获取锁成功,这样就算其中某个redis节点挂掉了,锁也不能被其他客户端获取到

    布隆过滤器

    布隆过滤器是一个bit数组,通过对key的多个不同的hash函数生成hash值,得出三个bit坐标,根据坐标找到数组并将当前bit位改为1,不同的key计算出同样的位置时,会覆盖。查询时会根据同样的公式运算得出坐标查询,如果有其中一个bit位为0说明这个值不存在,反之就是这个值可能存在,因为别的值可能会覆盖上来。布隆过滤器不支持删除