redis学习
目录
一·、Redis如何保证指令原⼦性
Redis的整体线程模型可以简单解释为客户端多线程,服务端单线程。
1.复合指令
Redis内部提供了很多复合指令,他们是⼀个指令,可是明显⼲着多个指令的活。
⽐如 MSET(HMSET)、GETSET、SETNX、SETEX。这些复合指令都能很好的保持原⼦性。
2.Redis事务
Redis的事务并不是像数据库的事务那样,保证事务中的指令⼀起成功或者⼀起失败。Redis的事务作⽤,仅仅只是保证事务中的原⼦操作是⼀起执⾏,⽽不会在执⾏过程中被其他指令加塞。
3.lua脚本
lua语⾔最⼤的特点是他的线程模型是单线程的模式。所以,在Redis中执⾏⼀段lua脚本,天然就是原⼦性的。
二、何时会触发RDB备份
1.到达配置⽂件中默认的快照配置时,会⾃动触发RDB快照
2.⼿动执⾏save或者bgsave指令时,会触发RDB快照。 其中save⽅法会在备份期间阻塞主线程。 bgsve则不会阻塞主线程。但是他会fork⼀个⼦线程进⾏持久化,这个过程中会要将数据复制⼀份,因此会占⽤更多内存和CPU。
3.主从复制时会触发RDB备份。
三、混合持久化策略
RDB + AOF 结合使用(默认开启)
前半段:RDB 全量快照
后半段:AOF 增量命令
恢复时:先加载 RDB,再重放 AOF
四、分布式锁
1.简单分布式锁
Boolean result = stringRedisTemplate.opsForValue().setIfAbsent(lockKey, clientId, 30, TimeUnit.SECONDS);
f (clientId.equals(stringRedisTemplate.opsForValue().get(lockKey))) {
stringRedisTemplate.delete(lockKey);
}
2.redisson分布式锁
RLock redissonLock = redisson.getLock(lockKey);//获取分布式锁
redissonLock.lock();//加锁
redissonLock.unlock();
五、缓存穿透
缓存穿透是指查询一个根本不存在的数据, 缓存层和存储层都不会命中,导致不存在的数据每次请求都要到存储层去查询, 失去了缓存保护后端存储的意义。
1.缓存空对象
2.布隆过滤器
当布隆过滤器说某个值存在时,这个值可能不存在;当它说不存在时,那就肯定不存在。
向布隆过滤器中添加 key 时,会使用多个 hash 函数对 key 进行 hash 算得一个整数索引值然后对位数组长度进行取模运算得到一个位置,每个 hash 函数都会算得一个不同的位置。再把位数组的这几个位置都置为1就完成了 add 操作。
向布隆过滤器询问 key 是否存在时,跟 add 一样,也会把 hash 的几个位置都算出来,看看位数组中这几个位置是否都为 1,只要有一个位为 0,那么说明布隆过滤器中这个key 不存在。如果都是 1,这并不能说明这个 key 就一定存在,只是极有可能存在,因为这些位被置为 1 可能是因为其它的 key 存在所致。需要合适长度的位数组,可以用redisson实现布隆过滤器。
这种方法适用于数据命中不高、 数据相对固定、 实时性低(通常是数据集较大) 的应用场景, 代码维护较为复杂, 但是缓存空间占用很少。
六、热点缓存key重建优化
当前key是一个热点key(例如一个热门的娱乐新闻),并发量非常大。 或者重建缓存不能在短时间完成, 可能是一个复杂计算, 例如复杂的SQL、 多次IO、 多个依赖等。在缓存失效的瞬间, 有大量线程来重建缓存, 造成后端负载加大, 甚至可能会让应用崩溃。 要解决这个问题主要就是要避免大量线程同时重建缓存。
可以利用分布式锁来解决,此方法只允许一个线程重建缓存, 其他线程等待重建缓存的线程执行完, 重新从缓存获取数据即可。
七、Redis对于过期键有三种清除策略
1.被动删除
当读/写一个已经过期的key时,会触发惰性删除策略,直接删除掉这个过期key
2.主动删除
由于惰性删除策略无法保证冷数据被及时删掉,所以Redis会定期主动淘汰一批已过期的key
3.主动清理策略
LRU 算法(Least Recently Used,最近最少使用,是淘汰很久没被访问过的数据,以最近一次访问时间作为参考)
LFU 算法(Least Frequently Used,最不经常使用)
当前已用内存超过maxmemory限定时,触发主动清理策略
总共8种清理策略
4种针对设置了过期时间的key做处理
volatile-ttl(会针对设置了过期时间的键值对,根据过期时间的先后进行删除,越早过期的越先被删除)
volatile-random
volatile-lru 淘汰最近一段时间被访问次数最少的数据,以次数作为参考。
volatile-lfu(其中LFU 算法(Least Frequently Used,最不经常使用,是淘汰最近一段时间被访问次数最少的数据,以次数作为参考)
3种针对所有的key做处理
allkeys-random
allkeys-lru
Allkeys-lfu
1种不处理
不会剔除任何数据,拒绝所有写入操作并返回客户端错误信息,此时Redis只响应读操作。
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐


所有评论(0)