Redis的特点
redis是以键值对key-value存储的数据库,基于内存可持久化的数据库,性能高,高并发,是单线程的,线程安全,支持分布式,集群,支持事务,可以用作缓存,消息队列,也可以用作分布式锁。
Redis支持的数据类型
- 字符串(string)可以用来做最简单的数据,可以缓存某个简单的字符串,也可以缓存某个json格式的字符串,Redis分布式锁的实现就利用了这种数据结构,还包括可以实现计数器、Session共享、分布式ID
- 哈希类型(hash)可以用来存储一些key-value对,更适合用来存储对象
- 列表类型(list)Redis的列表通过命令的组合,既可以当做栈,也可以当做队列来使用,可以用来缓存类似微信公众号、微博等消息流数据
- 集合类型(set)和列表类似,也可以存储多个元素,但是不能重复,集合可以进行交集、并集、差集操作,从而可以实现类似,我和某人共同关注的人、朋友圈点赞等功能
- 有序集合类型(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分布式锁底层是如何实现的?
- 首先利用setnx来保证:如果key不存在才能获取到锁,如果key存在,则获取不到锁
- 然后还要利用lua脚本来保证多个redis操作的原子性
- 同时还要考虑到锁过期,所以需要额外的一个看门狗定时任务来监听锁是否需要续约
- 同时还要考虑到redis节点挂掉后的情况,所以需要采用红锁的方式来同时向N/2+1个节点申请锁,都申请到了才证明获取锁成功,这样就算其中某个redis节点挂掉了,锁也不能被其他客户端获取到
布隆过滤器
布隆过滤器是一个bit数组,通过对key的多个不同的hash函数生成hash值,得出三个bit坐标,根据坐标找到数组并将当前bit位改为1,不同的key计算出同样的位置时,会覆盖。查询时会根据同样的公式运算得出坐标查询,如果有其中一个bit位为0说明这个值不存在,反之就是这个值可能存在,因为别的值可能会覆盖上来。布隆过滤器不支持删除