作者文章

fwq

FWQ
服务器教程
面试杀手锏:Redis源码之BitMap
面试杀手锏:Redis源码之BitMap 收藏 来到golang学习网的大家,相信都是编程学习爱好者,希望在这里学习数据库相关编程知识。下面本篇文章就来带大家聊聊《面试杀手锏:Redis源码之BitMap》,介绍一下Redis、BitMap、面试题,希望对大家的知识积累有所帮助,助力实战开发! 在上文《​​》中我们深入分析了 SDS 的实现,本次介绍的位图(BitMap)就是借助 SDS 实现的。 本文在最后讲解了BitMap对腾讯面试题的解决方案,并基于BitMap实现了仿GitHub提交次数的日历图,希望各位看官看的开心。 1.位图简介 如果我们需要记录某一用户在一年中每天是否有登录我们的系统这一需求该如何完成呢?如果使用KV存储,每个用户需要记录365个,当用户量上亿时,这所需要的存储空间是惊人的。 Redis 为我们提供了位图这一数据结构,每个用户每天的登录记录只占据一位,365天就是365位,仅仅需要46字节就可存储,极大地节约了存储空间。 位图数据结构其实并不是一个全新的玩意,我们可以简单的认为就是个数组,只是里面的内容只能为0或1而已(二进制位数组)。 2.命令实战 Redis提供了SETBIT、GETBIT、BITCOUNT、BITOP四个常用命令用于处理二进制位数组。 SETBIT:为位数组指定偏移量上的二进制位设置值,偏移量从0开始计数,二进制位的值只能为0或1。返回原位置值。 GETBIT:获取指定偏移量上二进制位的值。 BITCOUNT:统计位数组中值为1的二进制位数量。 BITOP:对多个位数组进行按位与、或、异或运算。 127.0.0.1:6379> SETBIT first 0 1 # 0000 0001(integer)…
2025-05-10 阅读全文 →
FWQ
服务器教程
Redis 存储对象信息用 Hash 和String的区别
Redis 存储对象信息用 Hash 和String的区别 收藏 本篇文章给大家分享《Redis 存储对象信息用 Hash 和String的区别》,覆盖了数据库的常见基础知识,其实一个语言的全部知识点一篇文章是不可能说完的,但希望通过这些问题,让读者对自己的掌握程度有一定的认识(B 数),从而弥补自己的不足,更好的掌握它。 日常工作中我们存储对象信息的时候,一般有两种做法,一种是用 Hash 存储,另一种是 String 存储。但好像并没有所谓的最佳实践,那么实际上到底用什么数据结构存储更好呢? 首先简单回顾下,Redis 的 Hash 和 String 结构。 String String 数据结构是简单的 key-value 类型,value 其实不仅是 String,也可以是数字。 Redis 中的 String 可以表示很多语义: 字符串(bits) 整数…
2025-05-10 阅读全文 →
FWQ
服务器教程
Redis之SDS数据结构的使用
Redis之SDS数据结构的使用 收藏 在数据库实战开发的过程中,我们经常会遇到一些这样那样的问题,然后要卡好半天,等问题解决了才发现原来一些细节知识点还是没有掌握好。今天golang学习网就整理分享《Redis之SDS数据结构的使用》,聊聊数据结构、RedisSDS,希望可以帮助到正在努力赚钱的你。 序言 Redis的几种基本数据结构有字符串(String)、哈希(Hash)、列表(List)、集合(Set)、有序集合(Sorted Set),这些是最常见的,也能在官网上查看到。 官网链接: 字符串 前面也提到过字符串是设计了简单动态字符串SDS(Simple Dynamic String)结构来表示字符串。这种数据结构可以提升字符串的操作效率,并可以保存二进制数据。 先思考一个问题: Redis是用C语言实现的,那么为什么没有复用C语言的字符串实现方法,而选用了SDS呢? char*字符串数组 C语言实现字符串使用的是char*字符串数组,它是一块连续的内存空间,一次存放了字符串的每一个字符,并且最后一个字符是“\0”,用来标识字符串的结尾位置,如下图, 连续的内存空间的所有字符串没有分隔符计算机就没办法区分字符串与字符串之间的位置。在C语言标准库中字符串的操作函数就会通过检查字符串数组中是否有“\0”来判断字符串是否结束。例如字符串操作函数strlen函数,它就是在遍历字符串数组中的每一个字符,并进行计数,直到检查到“\0”,它的时间复杂度是O(n)。流程如下, 简单动态字符串SDS SDS的数据结构里包含:字符串实际长度,字符串分配空间长度,SDS类型,字符数组,其中字符数组buf[]用来保存实际数据,如下图, 再来看看类似的字符操作函数sdslen函数的源码(在sds.h文件中),直接根据SDS类型返回对应的字符串现有长度,避免了对字符串的遍历,时间复杂度变成了O(1),当然也会付出一点代价增加了空间复杂度。这都是设计人员让数据操作更加高效。源码如下, static inline size_t sdslen(const sds s) { unsigned char…
2025-05-10 阅读全文 →
FWQ
服务器教程
Redis遍历键和数据库管理的方法是什么
Redis遍历键和数据库管理的方法是什么 收藏 各位小伙伴们,大家好呀!看看今天我又给各位带来了什么文章?本文标题是《Redis遍历键和数据库管理的方法是什么》,很明显是关于数据库的文章哈哈哈,其中内容主要会涉及到等等,如果能帮到你,觉得很不错的话,欢迎各位多多点评和分享! 1 遍历键 1.1 全量遍历键 有时候我们需要全量遍历所有的键,那么就需要用到keys pattern这个命令,并且这个命令支持pattern匹配 127.0.0.1:6379> mset name luke neme josh OK 登录后复制 若是想要遍历所有的键则可以使用命令keys * 127.0.0.1:6379> keys * 1) "name" 2) "neme" 登录后复制 pattern使用的是glob风格的通配符,其中: * 代表任意字符 ?代表一个字符 [] 代表匹配部分字符,例如[a,b]表示匹配a,b两个字符,[1-10]表示匹配1到10的任意数字 \x 表示转义,当需要匹配*这个字符的时候,就需要转义 我们可以做如下操作: 127.0.0.1:6379> keys n[a,e]me…
2025-05-10 阅读全文 →
FWQ
服务器教程
Redis主从复制和容量扩展问题的解决方案
Redis主从复制和容量扩展问题的解决方案 收藏 亲爱的编程学习爱好者,如果你点开了这篇文章,说明你对《Redis主从复制和容量扩展问题的解决方案》很感兴趣。本篇文章就来给大家详细解析一下,主要介绍一下扩容、Redis主从复制,希望所有认真读完的童鞋们,都有实质性的提高。 一、解决主从复制问题 当使用Redis作为存储引擎的时候,并且使用Redis读写分离,从机作为读的情况,从机宕机或者和主机断开连接都需要重新连接主机,重新连接主机都会触发全量的主从复制,这时候主机会生成内存快照,主机依然可以对外提供服务,但是作为读的从机,就无法提供对外服务了,如果数据量大,恢复的时间会相当的长。为了解决Redis主从Copy的问题,有如下两个解决方案: 主动复制所谓主动复制,就是业务层双写多个Redis,避开Redis自带的主从复制。但是自己干同步,就会产生一致性问题,为了保证主从一致,需要加入一系列的验证机制。而且这样的做法,会降低系统性能。修改源代码,支持增量同步Redis写AOF文件,关闭Redis rewrite AOF文件功能,为了避免文件过大,可以自己实现文件分割功能。在业务低峰时期,生成内存快照,并记录快照时刻AOF所在的点。当从机重连的时候,从机发送同步命令给主机,主机收到命令后,把最新的快照文件发送给从机,从机从快照文件中恢复,并且获得了该快照对应的AOF点,从机将AOF点发送给主机,主机将AOF文件中该点之后的所有数据操作同步给从机,达到增量同步的效果。 二、解决扩容问题 Redis作者的思路是:Redis Presharding(http://oldblog.antirez.com/post/redis-presharding.html) 预算设定Redis instances数量,假设实例数量n,n = 机器数*单台机器redis实例数后期扩展只需要将旧机器上的部分redis实例迁移到新的机器上,达到平滑扩容。迁移步骤如下: 在新的机器上创建实例,并且每个实例设置为被迁移实例的从机。主从复制完成之后,设置程序将新的实例作为主。停止旧的实例经过如上步骤之后,旧机器的内存就变大了,最后内存最大为每台机器一个Redis实例。 按作者文章中所说的,一个机器启动多个实例,其实并不会耗费太多资源,因为Redis够轻量,另外多个实例一个接一个的重写AOF文件或者生成内存快照,可以降低内存的占用,而不影响对外的服务。
2025-05-10 阅读全文 →
FWQ
服务器教程
Windows系统安装Redis的详细图文教程
Windows系统安装Redis的详细图文教程 收藏 对于一个数据库开发者来说,牢固扎实的基础是十分重要的,golang学习网就来带大家一点点的掌握基础知识点。今天本篇文章带大家了解《Windows系统安装Redis的详细图文教程》,主要介绍了Redis,希望对大家的知识积累有所帮助,快点收藏起来吧,否则需要时就找不到了! Redis对于Linux是官方支持的,安装和使用没有什么好说的,普通使用按照官方指导,5分钟以内就能搞定。详情请参考: 但有时候又想在windows下折腾下Redis,官方是不支持windows的。 最后如果你需要下载redis,可以去这里下载: 解压后就可以了按操作流程来了,记住 ,我的redis是有密码的,如果不想设置密码可以手动去配置文件里改,怎么改,下面有说。 下载好之后直接解压,不用安装。目录如下: 在这里输入cmd,按回车或者快捷键:crtl与alt中间那个键(windows键)+R键 进入DOC操作系统窗口。如下图 找到redis解压路径,我的是:F:\kgdxkj\U盘\123456\新建文件夹\2.8.21\2.8.21 这时在DOC操作系统中第一步输入 f: 回车(我的目录在F盘,所以输入f:), 第二步输入 cd F:\kgdxkj\U盘\123456\新建文件夹\2.8.21\2.8.21 回车,(注意:cd后面有空格) 第三步输入 redis-server.exe redis.windows.conf 回车,这样就启动redis服务了。 启动redis服务的doc窗口,不用关闭,因为服务需要一直执行,如果想关闭服务,直接关闭DOC窗口就行。 下面开始测试使用: 首先再打开一个DOC操作系统窗口,前两步和前面的一样,第一步输入 f: 回车(我的目录在F盘,所以输入f:),…
2025-05-10 阅读全文 →
FWQ
服务器教程
Redis在分布式任务调度中的应用
Redis在分布式任务调度中的应用 有志者,事竟成!如果你在学习数据库,那么本文《Redis在分布式任务调度中的应用》,就很适合你!文章讲解的知识点主要包括,若是你对本文感兴趣,或者是想搞懂其中某个知识点,就请你继续往下看吧~ 随着互联网业务的不断增长,分布式系统的应用也越来越广泛。分布式系统中的任务调度,是一个重要的功能。在传统的单机环境下,任务调度并不需要考虑太多的问题,但是在分布式环境下,任务调度面临的问题就会更加复杂。Redis,是一个高性能的内存数据库,它可以帮助我们解决分布式任务调度面临的诸多问题。 Redis 的工作模式 Redis 采用的是内存存储方式,在数据存取上,其速度相对于磁盘存储的数据库要快得多。同时,Redis 还有着非常灵活的数据结构支持,可以支持多种不同的应用场景。在分布式任务调度中,Redis 可以应用在诸多方面,比如任务队列、分布式锁、发布订阅等等。 Redis 在任务队列中的应用 在分布式系统中,一个任务往往需要被多个服务处理。这时候就需要一个队列来协调不同的服务对任务的处理。Redis 作为一个高性能的内存数据库,在任务队列中的应用非常广泛。 单机任务队列的情况下,Redis 可以通过列表(List)类型来存储任务。以将队列前置为例,当有新的任务进入队列时,可以通过 lpush 命令将任务插入到列表的头部。而当服务需要取出任务时,可以使用 lpop 命令将任务从列表的尾部pop出。当任务处理完成后,则可以使用 del 命令将已经处理完成的任务从任务队列中删除。 在分布式任务队列中,为了防止多个服务同时处理同一个任务,需要使用分布式锁。Redis 中的 SETNX 命令,则可以帮助我们实现分布式锁的功能。当一个服务需要获取任务时,首先需要获取分布式锁。获取锁的服务才能取出任务来处理,而其他服务在获取锁失败的情况下,则需要进行等待,直到锁被释放才能继续获取任务。 Redis 在分布式锁中的应用 分布式锁是在多个应用程序或服务之间协调访问共享资源的一种技术。在分布式任务调度中,任务的调度需要协调多个服务之间的协作。此时,分布式锁成为了确保协作顺利进行的关键。…
2025-05-10 阅读全文 →
FWQ
服务器教程
利用Redis实现防止接口重复提交功能
利用Redis实现防止接口重复提交功能 收藏 在数据库实战开发的过程中,我们经常会遇到一些这样那样的问题,然后要卡好半天,等问题解决了才发现原来一些细节知识点还是没有掌握好。今天golang学习网就整理分享《利用Redis实现防止接口重复提交功能》,聊聊重复、redis接口,希望可以帮助到正在努力赚钱的你。 这下鱼也摸不了了,只能去看看发生了什么事情。据用户反映,当时网络有点卡,所以多点了几次提交,最后发现出现了十几条一样的数据。 只能说现在的人都太心急了,连这几秒的时间都等不了,惯的。心里吐槽归吐槽,这问题还是要解决的,不然老板可不惯我。 其实想想就知道为啥会这样,在网络延迟的时候,用户多次点击,最后这几次请求都发送到了服务器访问相关的接口,最后执行插入。 既然知道了原因,该如何解决。当时我的第一想法就是用注解 + AOP。通过在自定义注解里定义一些相关的字段,比如过期时间即该时间内同一用户不能重复提交请求。然后把注解按需加在接口上,最后在拦截器里判断接口上是否有该接口,如果存在则拦截。 解决了这个问题那还需要解决另一个问题,就是怎么判断当前用户限定时间内访问了当前接口。其实这个也简单,可以使用Redis来做,用户名 + 接口 + 参数啥的作为唯一键,然后这个键的过期时间设置为注解里过期字段的值。设置一个过期时间可以让键过期自动释放,不然如果线程突然歇逼,该接口就一直不能访问。 这样还需要注意的一个问题是,如果你先去Redis获取这个键,然后判断这个键不存在则设置键;存在则说明还没到访问时间,返回提示。这个思路是没错的,但这样如果获取和设置分成两个操作,就不满足原子性了,那么在多线程下是会出错的。所以这样需要把俩操作变成一个原子操作。 分析好了,就开干。 1、自定义注解 import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; /** * 防止同时提交注解…
2025-05-10 阅读全文 →
FWQ
服务器教程
阿里巴巴官方最新Redis开发规范!
阿里巴巴官方最新Redis开发规范! 收藏 本篇文章给大家分享《阿里巴巴官方最新Redis开发规范!》,覆盖了数据库的常见基础知识,其实一个语言的全部知识点一篇文章是不可能说完的,但希望通过这些问题,让读者对自己的掌握程度有一定的认识(B 数),从而弥补自己的不足,更好的掌握它。   本文主要介绍在使用阿里云Redis的开发规范,从下面几个方面进行说明。  键值设计  命令使用  客户端使用  相关工具 通过本文的介绍可以减少使用Redis过程带来的问题。 一、键值设计 1、key名设计 可读性和可管理性 以业务名(或数据库名)为前缀(防止key冲突),用冒号分隔,比如业务名:表名:id ugc:video:1  简洁性 保证语义的前提下,控制key的长度,当key较多时,内存占用也不容忽视,例如:  user:{uid}:friends:messages:{mid}简化为u:{uid}:fr:m:{mid}。  不要包含特殊字符 反例:包含空格、换行、单双引号以及其他转义字符 2、value设计 拒绝bigkey 防止网卡流量、慢查询,string类型控制在10KB以内,hash、list、set、zset元素个数不要超过5000。 反例:一个包含200万个元素的list。 非字符串的bigkey,不要使用del删除,使用hscan、sscan、zscan方式渐进式删除,同时要注意防止bigkey过期时间自动删除问题(例如一个200万的zset设置1小时过期,会触发del操作,造成阻塞,而且该操作不会不出现在慢查询中(latency可查)),查找方法和删除方法 选择适合的数据类型 例如:实体类型(要合理控制和使用数据结构内存编码优化配置,例如ziplist,但也要注意节省内存和性能之间的平衡)…
2025-05-10 阅读全文 →
FWQ
服务器教程
Redis的IO多路复用以及Select,Epoll的演进
Redis的IO多路复用以及Select,Epoll的演进 收藏 哈喽!大家好,很高兴又见面了,我是golang学习网的一名作者,今天由我给大家带来一篇《Redis的IO多路复用以及Select,Epoll的演进》,本文主要会讲到Redis、IO、Epoll等等知识点,希望大家一起学习进步,也欢迎大家关注、点赞、收藏、转发! 下面就一起来看看吧! 什么是阻塞,非阻塞,异步同步,select,poll,epoll?今天我们用一遍文章解开这多年的迷惑。 首先我们想要通过网络接收消息,是这样的一个步骤。 用户空间向内核空间请求网络数据 内核空间把网卡数据读取到内核缓冲区 将内核缓冲区的数据复制到用户缓冲区 根据我们请求数据的情况不同,以及内核缓冲区到用户缓冲区的不同,分为了阻塞,非阻塞,异步同步的区别。 在《UNIX网络编程》一书中,总结归纳了5种I0模型: 阻塞 I0 ( Blocking I0) 非阻塞 I0 (Nonblocking  I0) I0多路复用(I0 Multiplexing) 信号驱动I0 (Signal Driven  I0 ) 异步I0…
2025-05-10 阅读全文 →