侧边栏壁纸
  • 累计撰写 307 篇文章
  • 累计阅读 104.3万

Redis学习笔记

TOTC
2013-06-08 / 963 阅读 / 正在检测是否收录...

缓存穿透: 访问不存在的数据时,大量的并发去查询DB,可能会瞬间压垮DB。

缓存击穿: 某一热点数据过期。

缓存雪崩: 过期策略一样,同时过期。

解决方案:

a.使用互斥锁 ,缓存中不存在时先上锁,从数据库加载完毕后释放锁,其他线程等待后重试(从缓存中取)。单机用lock,分布式用redis setnx。

b.隆过滤器 ,所有可能存在的数据放到布隆过滤器,一定不存在的数据会被拦截掉。

同时使用netflix hystrix,隔离每个服务,防止任何单个依赖服务耗尽所有用户线程。

持久化

持久化方式有RDB,一种快照式的持久化方法,手动或者定期执行,将某个时间点上的数据库状态保存到一个 RDB 文件中,对于数据恢复的完整性不是非常敏感。

AOF是将执行过的写指令记录下来, 可以使用不同的fsync策略:无fsync、每秒fsync、每次写的时候fsync,使用默认的每秒fsync策略,Redis的性能依然很好,一旦出现故障,最多丢失1秒的数据。

过期策略

过期策略定时器删除,在设置key的过期时间的同时,为该key创建一个定时器,让定时器在key的过期时间来临时,对key进行删除。

惰性删除,key过期的时候不删除,每次从数据库获取key的时候去检查是否过期,若过期,则删除,返回null。

定期删除,每隔一段时间执行一次删除过期key操作。

数据类型

String类型是字节数组的形式存储,类似ArrayList的动态字符串、是二进制安全的,可以把图片和视频文件保存在String中,但最大长度是512M,如果value是个整数,还可以进行自增操作。String可以进行位操作,可用来实现位图。位图的典型应用有数据压缩、海量数据去重、海量数据排序,将出现的数字在位图中对应的位置置为1,数据量大时内存不足以放下所有的数。

List可用来实现消息队列、栈,结构是快速链表(LinkList+连续内存块),插入删除非常快,索引定位慢。

Hash结构类似HashMap,但是rehash操作是渐进式的(新建一个,将旧的慢慢复制到新的)。

Set内部的实现相当于特殊的字典,Value是NULL,键值是无序唯一的。可以存放中奖的用户 ID,因为有去重功能,可以保证同一个用户不会中奖两次。

ZSet内部是跳跃列表,采取一个随机策略来决定新元素可以兼职到第几层。zset 可以用来存粉丝列表,value 值是粉丝的用户 ID,score 是关注时间。我们可以对粉丝列表按关注时间进行排序。

布隆过滤器已经存在的肯定能判断到、不存在的可能会误判。爬虫里,一个网址是否被访问过。超大的位数组和几个哈希函数。

HyperLogLog,Redis 的高级数据结构,放入直接返回计数,有误判。基数统计。

其他

redis在网络请求模块使用了一个线程(所以不需考虑并发安全性),所有的命令都会进入一个队列中,避免了不必要的上下文切换和竞争条件。

部署模式有主从复制模式。哨兵模式,较难支持在线扩容并且每台redis服务器都存储相同的数据。集群模式redis3.0,实现了分布式存储。

分布式锁,版本号形式 setnx (setIfAbsent 、getAndSet)。

50

评论

博主关闭了所有页面的评论