Redis Source dict.c注释
参考文献
src/dict.c
基于Redis 6.2版本
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192 ...
Redis Source - Hash
参考文献
极客时间专栏 <<Redis 源码剖析与实战>> 第三讲 如何实现一个性能优异的Hash表
Hash
源码基于Redis 6.2分支
Redis如何实现链式哈希
什么是哈希冲突?
由于键空间会大于Hash表空间,这就导致在用Hash函数把键映射到Hash表空间时,不可避免地会出现不同的键被映射到数组的同一个位置上.而如果同一个位置只能保存一个键值对,就会导致Hash表保存的数据非常有限,这就是常说的哈希冲突.
如何解决哈希冲突呢?
方案一: 链式哈希
局限: 链式哈希的链不能太长,否则会降低Hash表性能
方案二: 就是当链式哈希的链长达到一定长度时,可以使用rehash
改进方法: 渐进式rehash
结构体
12345678910111213141516171819202122232425262728293031323334353637383940414243444546// src/dict.htypedef struct dict { // 指向 dictType 类型的指针,用于保存字典的类型信息. ...
Redis-Docker-Cluster模式部署
参考文献
5分钟实现用docker搭建Redis集群模式和哨兵模式
redis.conf配置文件
123456789101112131415161718192021222324252627# 连接端口port 6371# 允许其他机器访问redis服务bind 0.0.0.0# 数据目录dir /data# 日志文件, 默认输出到控制台logfile /logs/nodes-6371.logappendonly yesprotected-mode no# 密码requirepass holelin..# 开启cluster集群模式cluster-enabled yes# 集群配置信息文件名, 记录了每个节点的地址、角色(master/slave)、slot等信息, 由redis自己生成, 位于数据目录下cluster-config-file nodes-6371.conf# 集群节点连接超时时间,每个节点都会检查其它节点是否挂了cluster-node-timeout 5000# 从节点需要配置主节点的密码, 不然主从同步时从节点无法从主节点同步到数据masterauth hole ...
Redis-Docker-Sentinel模式部署
参考文献
配置文件
master配置文件
1234567port 6379bind 0.0.0.0daemonize nopidfile "/var/run/redis_6379.pid"logfile "/usr/local/etc/redis/redis.log"dbfilename "dump_6379.rdb"dir "/usr/local/redis/data"
replication配置文件
1234567891011121314151617port 6380daemonize nopidfile "/var/run/redis.pid"logfile "/usr/local/etc/redis/redis.log"dbfilename "dump.rdb"dir "/usr/local/redis/data"bind 0.0.0.0replicaof 192.168.11.216 6379port 6381daem ...
Redis-Config
参考文献
Redis Config
以下内容拷贝至redis-7.2.4版本的redis.conf
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851 ...
Redis-Sentinel Config
参考文献
Sentinel Config
以下内容拷贝至redis-7.2.4版本的sentinel.conf
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831 ...
Redis-Cluster
参考文献
为什么引入Redis Cluster
Cluster(集群)模式的出现是解决了Redis单机容量有限的问题,解决了大数据量存储导致的各种慢问题,同时也便于横向拓展.该种模式会将Redis中数据按照一定规则划分到多台机器上.这种模式有两个特点:
能够在多个节点之间自动拆分数据集.
当节点的子集遇到故障或无法与群集的其余部分通信时,能够继续操作.
两种方案对应着 Redis 数据增多的两种拓展方案: 垂直扩展(scale up)、水平扩展(scale out).
垂直拓展: 升级单个 Redis 的硬件配置,比如增加内存容量、磁盘容量、使用更强大的 CPU.
水平拓展: 横向增加 Redis 实例个数,每个节点负责一部分数据.
Redis Cluster数据迁移
Redis Cluster迁移数据的整个过程可以分成五个大步骤,分别是:
标记迁入、迁出节点;
获取迁出的 keys;
源节点实际迁移数据;
目的节点处理迁移数据;
标记迁移结果.
Redis-最佳实践
参考文献
黑马Redis
Redis键值设计
Redis的Key虽然可以自定义,但最好遵循下面的几个最佳实践约定:
遵循基本格式:[业务名称]:[数据名称]:[]
长度不超过44字节
不包含特殊字符
好处:
可读性强
避免key冲突
方便管理
更节省内存: key是string类型,底层编码包含int、embstr和raw三种。embstr在小于44字节使用,采用连续内存空间,内存占用更小。当字节数大于44字节时,会转为raw模式存储,在raw模式下,内存空间不是连续的,而是采用一个指针指向了另外一段内存空间,在这段空间里存储SDS内容,这样空间不连续,访问的时候性能也就会收到影响,还有可能产生内存碎片
拒绝BigKey
BigKey通常以Key的大小和Key中成员的数量来综合判定,例如:
Key本身的数据量过大:一个String类型的Key,它的值为5 MB
Key中的成员数过多:一个ZSET类型的Key,它的成员数量为10,000个
Key中成员的数据量过大:一个Hash类型的Key,它的成员数量虽然只有1,000个但这些成员的Value(值)总大小为 ...
Redis-单线程模型
参考文献
了解redis的单线程模型工作原理?一篇文章就够了
REDIS 单线程模型介绍
redis单线程模型
3w字深度好文|Redis面试全攻略,读完这个就可以和面试官大战几个回合了
极客时间专栏: Redis核心技术与实战
Redis单线程
Redis是单线程,主要是指Redis的网络IO和键值对读写是由一个线程来完成的,这也是Redis对外提供键值存储服务的主要流程.但Redis的其他功能,比如持久化、异步删除、集群数据同步等,其实是由额外的线程执行的.
Redis 为什么使用单线程?
从性能角度来看
多线程的开销
多线程编程模式面临的共享资源的并发访问控制问题.
并发访问控制一直是多线程开发中的一个难点问题,如果没有精细的设计,比如说,只是简单地采用一个粗粒度互斥锁,就会出现不理想的结果:即使增加了线程,大部分线程也在等待获取访问共享资源的互斥锁,并行变串行,系统吞吐率并没有随着线程的增加而增加.
而且,采用多线程开发一般会引入同步原语来保护共享资源的并发访问,这也会降低系统代码的易调试性和可维护性.为了避免这些问题,Redis直接采用了单线程模式.
单 ...