缓存redis
1.责任链模式 设计缓存模块
视频限流
笔记
---------------dd----------------
hm-redis笔记 基础-实战-高级-原理
hm-redis-项目
redis-基本使用
redis-zhoyang-硅谷大厂
------------ddd---------
--------------------hm-redis----------------
| 笔记链接 | 描述 |
|---|---|
| 黑马总体可以看看 | 包括5种数据类型+一些原理+底层数据结构+事物+aof rob+key过期和淘汰策略 |
| redis-入门篇-黑马 | 包括5种数据类型常用命令,整合spring |
| redis-入门篇-黑马 | redis-常见命令 5种+bitmap+hyperLoglog+Geo |
| redis-实战篇-黑马 | 第二章 商户缓存—缓存更新策略 ,缓存双写一致性,穿透、击穿、雪崩、 缓存穿透代码 |
| redis-实战篇-黑马 | 第三章 优惠券秒杀,redis全局id、乐观锁实现秒杀、单机一人一单、分布式锁lua、redission、秒杀优化–阻塞队列实现秒杀 |
| redis-实战篇-黑马 | 第7章 redis消息队列–list pubsub stream |
| redis-实战篇-黑马 | 第8章 探店实现点赞set集合 ,点赞排行榜sortedSetzadd key value score |
| 第9章 实现 好友关注、等 | |
| 第10章 附近商户 GEO 用户签到 BitMap Uv统计 hyperLoglog | |
| 黑马redis-分布式锁 | |
| redis-高级篇-黑马 | rdb-aof、、aof–rdb原理 |
| redis-高级篇-黑马 | redis-主从、 redis-哨兵 、redis-集群 |
| redis-高级篇-黑马 | 最佳实战 redis-bigkey、批处理 pipline,mset |
| redis-高级篇-黑马 | 最佳实战 服务端优化、持久化配置、命令以及安全配置、内存划分配置 |
| redis-原理篇-黑马 | redis-对象模型redis-数据类型的基础结构、、 redis-原理 |
| redis-原理篇-黑马 | redis-对象模型网络模型、内存回收(惰性、周期)、内存淘汰策略 |
AOF日志原理详解—一处拷贝两处日志
美团redis-rehash
redis 的一些笔记
2、六种淘汰策略
检测全库数据 allkeys-random:随机删除 allkeys-lru:使用 LRU 算法进行筛选删除 allkeys-lfu:使用 LFU 算法进行筛选删除 noeviction(默认策略):对于写请求不再提供服务, 直接返回错误(DEL请求和部分特殊请求除外) volatile-random:随机删除 volatile-ttl:根据过期时间先后进行删除,越早过期的越先被删除 volatile-lru:挑选最近最少使用的进淘汰 volatile-lfu:最近使用次数最少的数据进行淘汰。3.bitmap
3.1 问题
目前有10亿数量的自然数,乱序排序,需要对其进行排序。限制条件,在32位机器上面完成,内存限制位2G ?
使用bitmap , 去重且排序。 限制 去重了。
3.2 布隆过滤器
布隆-缓存穿透 代码
3.3 redis hash 扩容
hash 非常大,需要去扩容,redis是怎么扩容hash 的?
3.3.1 list 实现
解决方法:先将上面案例中的100次调整为10次便于在次场景中描述,要精确的保证同一个用户每分钟最多访问10次,需要记录下来用户每次访问的时间。因此对每个用户我们使用一个List列表类型的键来记录他最近10次访问的时间,一旦键中的元素超过10个,就判断最早的元素距离现在的时间是否小于1分钟。如果是表示用户最近1分钟访问次数超过了10次,如果不是就将现在的时间加入到队列中,同时把最早的元素删除。
Stringkey="rate.limiting:"+IP;intlistLength=llen(key);if(listLength<10){lpush(key,new());}else{longtime=lindex(key,-1);if(now()-time<60){log.info("访问频率超过了限制,请稍后再试");}else{lpush(key,now);ltrim(key,0,9);}}3.3.2 zset 实现
localkey=KEYS[1]-- 限流 Keylocalwindow_size=tonumber(ARGV[1])-- 窗口大小(毫秒),如 60000localthreshold=tonumber(ARGV[2])-- 阈值,如 100localnow=tonumber(ARGV[3])-- 当前时间戳(毫秒)localmember=ARGV[4]-- 请求唯一标识-- 1. 移除窗口外的旧数据redis.call('ZREMRANGEBYSCORE',key,0,now-window_size)-- 2. 添加当前请求redis.call('ZADD',key,now,member)-- 3. 统计当前窗口内的请求数localcount=redis.call('ZCARD',key)-- 4. 设置 Key 过期时间(略大于窗口,防止内存泄漏)redis.call('PEXPIRE',key,window_size+1000)-- 5. 返回是否允许通过(1: 允许,0: 拒绝)ifcount<=thresholdthenreturn1elsereturn0end