Redis教程

redis数据结构+底层数据结构+缓存穿透缓存雪崩缓存击穿

本文主要是介绍redis数据结构+底层数据结构+缓存穿透缓存雪崩缓存击穿,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

redis数据结构有哪些?

字符串、列表、集合、哈希、有序集合

字符串

字符串: 数字类、非数字类
数字类: INCR,DECR,INCRBY
非数字: GETRANGE,SETRANGE(截取字符串)
bloom: 散列到bit位,加入时bit置1【缓存穿透】

列表:
LPUSH LPOP RPUSH RPOP
(有序,访问中间元素的时间复杂度为O(n))
列表可以包含的元素数目?
2^32-1,大约4亿个元素

建议用在检索最近操作记录、最近通知这种地方
lpush a
ltrim 0 3[保存0-3元素,4或以后的会被修剪删除]

集合
无序(添加删除查存在O(1))不重复,可进行交集并集计算
打标签,登录检查

哈希
键值对
用于存储一些常用到的值,比如用户信息,比如菜单,省市区信息
100以内字段的可以存百万个对象

有序集合
排行榜、索引存储redis数据

Bitmaps/HyperLogLogs(基于字符串的基本类型的数据类型)

Bitmaps【GETBIT SETBIT】压缩算法用
HyperLogLogs【计算一组数据中出现的不重复数值个数】
pfadd pfcount pfmerge

底层数据结构

字符串SDS【字符串】

记录已用、未用、字符数组

常数级别获取长度,及时扩容避免溢出,减少内存重分配,空间预分配惰性释放,保存文本和二进制数据,兼容部分C函数

长度空间都要有,buf我要加到够。空间预分免溢出,惰性释放防泄漏。文本以及二进制,函数部分少克扣。

链表【列表】

双向链表保存前驱节点和后继节点,长度,复制、释放、对比函数

字典【哈希】【无序集合】

(哈希表键值对有下节点指针),大小,掩码,数量
哈希算法,链地址法
渐进式rehash
用A、B两块,扩容收缩的时候会拷贝到另一块,数量多则会慢慢拷贝,查两张表,渐进完成,新数据会进入新表,拷贝完成后会进行释放

ziplist【哈希】

键和值都在64字节以内,键值对数量少于512

跳表【有序集合】

后继节点数组、跨度
后退指针,分值,成员

整数集合【intset】【集合(整数、512元素内)】

会先用长度短的,然后根据需要进行升级,只支持升级不支持降级,升级能够极大的减少内存消耗

缓存穿透缓存雪崩缓存击穿

缓存穿透

一直查空数据导致redis一直不命中,每次都要到持久层进行查询
方案:

  1. 缓存空对象
  • 本来不占空间,但是设置了空对象缓存占空间.
  • 可能后期添加会造成数据不一致
  1. 布隆过滤器
  • 适用于数据相对固定,实时性较低的场景
  • 有误识别率,删除困难

缓存雪崩

缓存宕机,大批数据同一时间缓存失效,存储层压力过大导致雪崩
方案:

  1. redis分片集群哨兵
  2. 适用多级缓存
  3. 缓存时间设为随机值

缓存击穿

热点key并发量非常大

方案:

  1. 分布式互斥锁
    只允许一个线程重建缓存
    可能会死锁

  2. 永不过期
    可能会出现数据不一致的情况

这篇关于redis数据结构+底层数据结构+缓存穿透缓存雪崩缓存击穿的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!