redis源码系列--(一)--调试环境搭建

#编译
git clone redis_代码库地址
sudo apt-get install gcc
gcc --version
cc --version
sudo apt install build-essential pkg-config libjemalloc-dev
git checkout 8.0 (切换到最新的稳定分支,因为默认是unstable分支)
make CFLAGS=-O0   #关闭优化,否则debug有些代码不会执行到
然后启动:
    edit-config->选择redis-server,然后Executable选择 redis/src目录下的redis-server这个可执行文件(这个redis-server可执行文件编译的时候会自动生成并和源码存放在同一个目录下)
redis-server对应的源码文件为redis/src/server.c,可以再server.c里面打断点。
如果修改了代码,不用担心,debug运行的时候他会检测到代码有更新,它会自动去编译运行,所以很简单啦,可以开始开心的debug了

redis-server需要一个配置文件,默认是redis/redis.conf,默认是只能本地访问6379端口,如果要修改,我们有两种方式:1:直接修改redis.conf;2:创建一个新的redis.conf,然后把redis.conf中的bind 127.0.0.1 -::1修改成bind 0.0.0.0 ::1,同时把protected-mode yes改成protected-mode no,这样不需要密码就可以在宿主机访问虚拟机里的redis了,然后编辑redis-server的启动配置,在命令行参数里添加config文件的路径,即完整的命令为 redis-server config_path,虚拟机里面启动好以后通过ipconfig查看虚拟机ip,我这里是:192.168.129.3,然后在宿主机中启动一个命令行,然后执行telnet 192.168.129.3 6379,如果没有错误就说明debug环境搭建成功,就可以在宿主机中使用redis-cli相关的客户端工具来连接虚拟机中的redis-server了

修改前:
    bind 127.0.0.1 -::1   
    protected-mode yes
    appendonly no #关闭aof
    appendfsync everysec #默认是每秒写一次
修改后:
    protected-mode no
    bind 0.0.0.0 ::1
    appendonly yes #开启aof,默认是rdb
    appendfsync always #每次都写
    io-threads 2       #使用主线程进行读写,大于2就表示开启,不过代码里面可能会根据实际情况自动关闭和启用thread-io
    io-threads-do-reads yes #读也是用thread io
    notify-keyspace-events KEA #开启keyevent和keyspace的事件通知,默认情况下redis事件通知是关闭的
    repl-diskless-load swapdb    #同步时选择无盘方式,slave需要配置
    #repl-diskless-load disabled

备注:因为bgsave、rewrite等都是子进程,所以如果要debug子进程,需要gbd运行
:set detach-on-fork off、set follow-fork-mode child



在这里插入图片描述
redis gui工具:redis desktop manager,官网地址:https://redis.io/insight/

在这里插入图片描述

这个搜索按钮发出的不是get命令,是dbsize命令,要用下面的cli工具发送get命令,才会往redis发get命令,不过 +Key发出的是set命令,可以正常使用

redis所有数据都会放到内存,所以redis可以作为内存数据库,同时因为都会放到内存,所以限制了redis所能保存的数据数,所以redis需要配置,一旦达到阈值,可以选择拒绝继续写入也可以选择剔除一些key,总之redis和etcd一样,存储容量有限

redis磁盘存储结构是一个hashtable,对应数据结构为redisDb

redis底层数据结构为了充分利用空间,往往是一个字段多种用途,当数据满足某种要求的时候,某个字段就作为元数据字段使用,当满足另一个要求的时候比如数据部分非常小时,该字段剩下的字节数就能直接存储数据,也就是说一个字段多种用途或者一个字段包含多个字段

redis作用:1:缓存;2:抗高并发(大量数据直接从redis获取数据)。问题:1:双写不一致(写缓存不立即写mysql,写了mysql,不一定立即更新缓存);2:缓存击穿(;3:缓存穿透,4:并发问题,a写keyX,b也写keyY,可以通过lua脚本实现原子执行或者加锁。是指大量同时失效,导致请求直接落到数据库上,造成系统压力过大;透是指恶意请求直接绕过,访问数据库中不存在的数据,导致数据库压力增加;则是指某个热点数据的失效,导致大量请求直接访问数据库,造成数据库压力过大。

redis快:1:纯内存操作;2:高效的网络io模型(epoll)

惰性删除和定期删除:前者只有在访问时才会检查该key是否过期,过期就删除,如果不访问,就一直不会被删除

redis内存不够时的策略:1:拒绝写入新数据;2:淘汰部分旧数据再写入

redis哨兵机制:单机架构模式下,如果redis崩掉,那么大量请求都会直接来到mysql,然后就会导致mysql也绷掉,所以部署多个redis,redis是主动模式,哨兵的责任就是当master挂掉的时候切换到slave,哨兵也是集群部署,当过半哨兵认为master挂掉后就会切换master,哨兵也是有主的

  • :设置不同的过期时间,使用随机过期时间,或引入备份缓存策略。
  • :使用互斥锁或布隆过滤器,防止大量请求同时查询不存在的缓存。
  • :通过布隆过滤器拦截无效请求,或在应用层进行验证,避免直接查询数据库。同时,也可以缓存查询失败的结果,下次同样的查询就会直接返回失败了

备份:全量备份、增量备份

缓存双写不一致:延迟双删除。。个人疑惑:还是不靠谱,奇奇怪怪的问题总会出来的 ,还是不如加锁靠谱,也就是说在redis侧锁住该key,使得只有一个线程可以更改该key

哈希槽:就是redis多主集群,每个master只负责一部分key

redis之前使用单线程原因:1:cpu不是瓶颈,内存和网络才是

!!!!redis是reactor模型中的单进程单reactor模型,reactor模型就是一种同步io模型,os只是通知用户来处理io

set follow-fork-mode child、set detach-on-fork off

export PATH=$PATH:/home/cser/work/software/GoLand-2024.2.2/bin/
alias goland=" goland.sh > /dev/null 2>&1 &"
alias clion=“nohup /home/cser/work/software/clion-2024.2.2/bin/clion > /dev/null 2>&1 &”
alias rootclion=" sudo /home/cser/work/software/clion-2024.2.2/bin/clion > /dev/null 2>&1 &"

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值