Redis 基础数据类型以及常见问题

在这里插入图片描述

脑图下载地址在文末

String字符串

Redis SDS简单动态字符串 点击查看

应用场景

分布式锁

SETNX key value

当key不存在时,将 key 的值设为 value ,返回1。若给定的 key 已经存在,则setnx不做任何动作,返回0。
当setnx返回1时,表示获取锁,做完操作以后del key,表示释放锁,如果setnx返回0表示获取锁失败,整体思路大概就是这样

计数器

SET key 0
INCR key // incr readcount::{帖子id} 每阅读一次
GET key // get readcount::{帖子id} 获取阅读量

分布式全局唯一id

生成一系列唯一的序列号。

设置序列起始值:
SET sequence "10000"
获取一个序列值:
INCR sequence
直接将返回值作为序列使用即可。
获取一批(如100个)序列值:
INCRBY sequence 100
假设返回值为N,那么[N - 99 ~ N]的数值都是可用的序列值。

常见的k-v存储,可以应对大部分的场景

比如序列化之后的 json 或者其它文本数据。


Hash哈希

底层实现方式

HashTable哈希表

  • siphash算法

ZipList压缩列表

  • 哈希对象保存的所有键和值得字符串长度小于64字节
  • 哈希对象保存的键值对数量小于512

常见问题

解决哈希冲突

  1. 使用链地址法,将相同的key使用链表连接

负载因子

  1. 负载因子 = 哈希表已保存节点数量 / 哈希表大小
  2. 是哈希表的一个重要参数,它反映哈希表的装满程度

Rehash

  1. 扩容

    • 服务器目前没有执行 BGREWRITEAOF 或者 BGSAVE 命令,且哈希表的负载因子大于等于 1
    • 服务器目前正在执行 BGSAVE 或者 BGREWRITEAOF 命令, 并且哈希表的负载因子大于等于 5
  2. 缩容

    • 哈希表的负载因子小于 0.1 时, 程序自动开始对哈希表执行收缩操作

在执行 BGREWRITEAOF 或者 BGSAVE 命令 时,Redis 会为当前服务器进程创建一个子进程,所以在子进程存在期间,会提高执行扩容的负载因子,因为这样可以避免在子进程存在期间进行哈希表的扩容操作,从而避免不必要的内存写入操作,最大限度的节约内存,提高效率。

应用场景

  1. hash 类型十分适合存储对象类数据,相对于在 string 中介绍的把对象转化为 json 字符串存储,hash 的结构可以任意添加或删除‘字段名’,更加高效灵活。

List 列表

底层实现方式

  1. ZipList压缩列表

应用场景

  1. 简单的消息队列的功能
  2. 可以利用range命令,做基于redis的分页功能
  3. BLPOP/BRPOP 等待有元素弹出,实现阻塞队列

Set 集合

底层实现方式

  1. intset

    • 结合对象保存的所有元素都是整数值,开辟空间高效
    • 集合对象保存的元素数量不超过512个
    typedef struct intset {
        // 编码方式
        uint32_t encoding;
        // 集合包含的元素数量
        uint32_t length;
        // 保存元素的数组
        int8_t contents[];
    } intset;
    
  2. hashtable

应用场景

  1. 好友/关注/粉丝/感兴趣的人集合
  2. 随机展示
  3. 黑名单/白名单

Sorted Set 有序集合

底层实现方式

  1. ZipList压缩列表

    • 有序集合保存的元素数量小于128个
    • 有序集合保存的所有元素的长度小于64字节
  2. SkipList 跳表

    • 效率可比拟于二叉查找树
    • 通过“空间来换取时间”的一个算法,通过在每个节点中增加了向前的指针,从而提升查找的效率

应用场景

  1. 游戏排名、微博热点话题等使用场景

脑图下载地址
原创文章 52 获赞 11 访问量 4726

猜你喜欢

转载自blog.csdn.net/weixin_42322309/article/details/105834387