redis
文章平均质量分 63
每一个不曾起舞的日子,都是对生命的辜负
这个作者很懒,什么都没留下…
展开
-
redis数据结构
1. redis数据类型redis有五种基本数据类型stringlistsetsorted sethash这五种基本数据类型其实是逻辑数据类型,每种数据类型都有不止一种的实现方式逻辑数据类型,规定了它有哪些操作,有哪些特性。如set规定了它无序,不能重复如list规定了它有序,操作队首或队尾时间复杂度为O(1)所以它们都是规定了有哪些特性,至于你到底怎么实现,取决于你。如hash这个数据类型,在元素少的时候底层实现用的是zipList,元素多了用Dict实现。2..原创 2022-05-03 16:21:59 · 1178 阅读 · 0 评论 -
redis客户端数据结构
服务器的数据结构中包含了所有的客户端数据结构typedef struct redisServer{ ... redisClient *client; redisClient *lua_client; ...}客户端的结构体typedef struct redisClient{ int fd; robj *name; int flags; sds querybuf; robj **argv; int argc;.原创 2021-11-18 20:28:52 · 919 阅读 · 0 评论 -
redis事件处理流程
1. redis服务器的主函数def main(): # 初始化服务器 init_server() # 一直处理事件,直到服务器关闭为止 while server_is_not_shutdown(): aeProcessEvents() # 服务器关闭,执行清理操作 clean_server()2. aeProcessEvents函数处理逻辑def aeProcessEvents(): # 获取到达时间离当前时间最接近原创 2021-11-18 19:32:59 · 964 阅读 · 0 评论 -
redis中的数据结构与对象
1. 动态字符串(SDS)struct sdshdr{ int len; int free; char buf[];};len:字符数组已经使用了多少字节 free:字符数组还剩多少字节 buf:字符数组,可以动态扩容和收缩1.1 如何扩容当len小于1M时,每次字符数组buf扩容后的容量为2*len+1 当len大于1M时,每次字符数组buf扩容后的容量为 len+1M+11.2 其他特性惰性空间释放 二进制安全。2. 链表(linkedlist)原创 2021-11-18 15:32:08 · 865 阅读 · 0 评论 -
如何保证缓存与数据库的数据一致性
1. 四种可能得方案先更新数据库,再更新缓存 先更新缓存,再更新数据库 先删除缓存,再更新数据库 先更新数据库,后删除缓存1.1 第一种的问题并发更新数据库场景下,会将脏数据刷新到缓存,不使用1.2 第二种的问题如果先更新缓存成功,但是数据库更新失败,会造成数据不一致,不使用2. 先删除缓存,后更新数据库2.1 可能出现的问题请求A进行写操作,删除缓存 请求B查询发现缓存不存在 请求B去数据库查询得到旧值 请求B将旧值写入缓存 请求A将新值写入数据库如果没有给缓存设原创 2021-08-30 22:50:23 · 4973 阅读 · 0 评论 -
redis的常用场景
1. 缓存提升网站访问速度 大大降低数据库的压力2. 排行榜许多网站的排行榜应用,如京东的月度销量榜单,商品按时间的上新排行。 redis提供的有序集合数据结构能够实现各种复杂的排行榜应用3. 计数器对于电商网站商品的浏览量,视频网站的播放数,为了保证数据实时有效,每次预览都得+1,可以存到redis中,缓解数据库压力。 redis提供了incr命令来实现计数器功能,内存操作,性能好,非常适用于计数场景4. 分布式会话通过搭建以redis等内存数据库为中心得session服务,s原创 2021-08-30 21:39:47 · 67 阅读 · 0 评论 -
什么是缓存预热
1.概念缓存预热是指系统上线后,提前将相关的缓存数据加载到缓存系统中,避免刚上线使用户有太多请求打到数据库上去,然后再去将数据缓存的问题。 有了缓存预热后,系统刚上线用户也可以直接查询实现被预热的缓存数据 如果不进行预热,那么redis初始状态数据为空,系统上线初期,对于高并发的流量,都会访问数据库,会对数据库造成流量的压力2. 缓存预热的解决方案数据量不大的时候可以不进行缓存预热,或者工程启动后再进行加载缓存动作 数据量很大的时候,一定要保证热点数据提前加载到缓存。...原创 2021-08-30 16:50:03 · 3835 阅读 · 0 评论 -
redis基本实操
1. 基本操作1.1 对key的操作# 查看当前数据库所有的keykeys *# 判断某个key是否存在exists key# 判断key是什么类型type key# 删除key: 同步删除del key# 删除key:异步删除unlink key# 给key设置过期时间,单位为秒expire key 10# 查看key的过期时间: -1: 永不过期, -2:不存在或者已过期ttl key1.2 对数据库的操作# 切换数据库select db0原创 2021-08-30 14:35:29 · 278 阅读 · 0 评论 -
redis之布隆过滤器
1. 原理实际是借助一个很长的二进制数组来实现的 插入操作:当一个数据(如一个key)经过N个hash函数,得到N个hash值,然后将这N个hash值对应的二进制数组下标位的值置为1,然后就完成了这个key的存储。 查询操作:当查询的这个key时,也是将这个key经过这N个hash函数,得到N个hash值,然后判断这N个hash值对应的二进制数组下标的值是否都为1,如果都是1,则就认为这个key是在布隆过滤器中的。(所以可以看出这里面有误判情况) 布隆过滤器很难去删除数据 查询的时间复杂度是O(原创 2021-08-09 12:02:06 · 59 阅读 · 0 评论 -
redis缓存雪崩、缓存穿透、缓存击穿
0. 正常的业务流程用户向web服务器发起请求 web服务器会先查询redis缓存服务器,缓存有则直接返回 若缓存没有,则查询mysql服务器,将结果返回给web服务器,同时将其加入redis缓存(看情况,若是热点就加入)。1. 缓存雪崩1. 原因redis缓存的key在同一时间大量失效,导致大量请求全部打到数据库服务器,造成数据库服务器响应不及时而挂掉。从而导致整个服务器无法提供服务。2. 解决方案设置缓存失效时间,不要让热点数据的缓存在同一时间失效(如随机初始化失效时间) 在集原创 2021-08-09 11:18:50 · 86 阅读 · 0 评论 -
redis分片集群
1. 操作过程(举例用三主三从的集群)1. 修改6台redis服务器的配置文件# 配置集群# 成为集群中的一个节点cluster-enabled yes# 集群的配置文件名称cluster-config-file nodes-6379.conf# 节点超时多久就认为下线,单位毫秒cluster-node-timeout 1000002. 启动这6台redis启动之后,这6台机器还是孤立的节点,相互之间还没有进行连接形成集群。3. 安装rubyyum install原创 2021-08-09 00:11:04 · 123 阅读 · 0 评论 -
redis之哨兵
1. 作用监控 不断检查master与slave是否正常运行 master存活检测,master与slave运行情况检测 通知 当被监控的服务器出现问题,向其他(哨兵、客户端)发送通知 自动故障转移 断开master与slave连接,选取一个slave作为master,将其他slave连接到这个新的master上,并告知客户端新的服务器地址 2. 配置哨兵(docker下)使用docker启动3个redis服务器,一个主,两个从,进行主从配置,三台redis服务器分别启动一原创 2021-08-08 23:31:47 · 74 阅读 · 0 评论 -
redis主从复制
1. 什么是主从复制将master中的数据即时有效地复制到slave中。 master负责写数据,执行写操作时,将出现变化的数据自动同步到slave中 slave负责读数据。2. 作用读写分离,提高服务器的读写负载能力 负载均衡,基于主从结构,配合读写分离。有slave分担master负载。 故障恢复:当master出现问题时,由slave提供服务,实现快速的故障恢复 数据冗余:可以实现数据热备份,时持久化之外的一种数据冗余方式 高可用基石:基于主从复制,构建哨兵模式与集群,实现red原创 2021-08-08 12:26:49 · 90 阅读 · 0 评论 -
redis高级数据类型
1. Bitmaps# 设置bits的第0位值为1127.0.0.1:6379> setbit bits 0 1(integer) 0# 获取bits这个键的第0位上的值127.0.0.1:6379> getbit bits 0(integer) 1127.0.0.1:6379> setbit day01 0 1(integer) 0127.0.0.1:6379> setbit day01 4 1(integer) 0127.0.0.1:6379.原创 2021-08-08 00:10:49 · 103 阅读 · 0 评论 -
redis一些配置
# 服务端配置# 设置服务器以守护进程方式运行,默认为nodaemonize yes# 绑定主机地址,绑定后只能通过ip访问# bind 127.0.0.1 # 设置服务器端口号,默认6379# port 6379# 设置数据库数量,默认16databases 16# 日志配置# 设置服务器以指定日志记录级别,可选项为# debug# verbose 默认# notice 生产环境建议使用这个级别,简化日志输出,降低io频率# warningloglevel.原创 2021-08-07 23:06:15 · 88 阅读 · 0 评论 -
redis逐出算法
1. 一些相关的配置# 最大空用内存,默认时全用maxmemory 256mb# 每次选取待删除数据的个数maxmemory-samples 100# 删除策略(逐出算法)# 可选操作# 检查易失数据(有过期时间的数据)# volatile-lru: 挑选最近最少使用的数据淘汰# volatile-lfu: 挑选最近使用次数最少的数据淘汰# volatile-ttl: 按将要过期的数据淘汰# volatile-random: 随机淘汰有过期时间的数据# 检测全库数据(所有的k原创 2021-08-07 22:50:39 · 130 阅读 · 0 评论 -
redis删除策略
1. 判断一个key的有效期# 查看num这里key的有效期# 返回值有三种 正数:剩余有效期秒数 -1:永久有效 -2:已被删除或不存在或已过期127.0.0.1:6379> ttl num(integer) -12. 原理redis中有一个类似于hash结构的expires,其中 键为:设置了过期时间的数据内存地址 值为:过期时间 3. 定时删除为设置了过期时间的key创建一个定时器,当过期时间到达时,定时器任务立即执行对键的删除操作 用处理器时.原创 2021-08-07 22:31:07 · 458 阅读 · 0 评论 -
redis分布式锁
1.步骤# 共享资源127.0.0.1:6379> set num 10OK# 加锁127.0.0.1:6379> setnx lock 1(integer) 1# 修改共享资源127.0.0.1:6379> incrby num -1(integer) 9# 解锁127.0.0.1:6379> del lock(integer) 12. 原理setnx:只有要设置的key不存在时,我们才添加这个key-value。否则不添加3. 补充为了原创 2021-08-07 21:51:35 · 98 阅读 · 0 评论 -
redis事务
1. 步骤# 在客户端下执行开启事务命令,会创建一个任务队列multi# 将命令放入任务队列set age 30# 将命令放入任务队列get age# 提交事务,会执行任务队列(当前事务的任务队列)里面的所有指令exec# 开启事务指令,会开启一个任务队列。multiset name 张三get name set name lisi# 取消事务,不执行直接销毁当前事务的任务队列discard2. 原理开启事务会为当前事务创建一个任务队列 之原创 2021-08-07 21:42:45 · 320 阅读 · 0 评论 -
redis备份
1. rdb备份方式一:在客户端中输入保存命令# 当前进程执行rdb备份# 不建议使用save# 调用fork函数生成子进程进行后台备份bgsave方式二:配置文件中配置自动rdb配置# rdb自动执行的条件# 900秒内有1个键发生变化就进行后台rdb存储save 900 1save 300 10save 60 10000方式三:服务器运行执行重启命令debug reload方式四:关闭服务器时指定保存数据shutdown save1. rd原创 2021-08-07 19:08:02 · 385 阅读 · 0 评论