![](https://img-blog.csdnimg.cn/20201014180756928.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Redis
文章平均质量分 84
qq_20853741
这个作者很懒,什么都没留下…
展开
-
hiredis的pipeline实现
大多数同学一直以来对 Redis 管道有一个误解,他们以为这是 Redis 服务器提供的一种特别的技术,有了这种技术就可以加速 Redis 的存取效率。但是实际上 Redis 管道 (Pipeline) 本身并不是 Redis 服务器直接提供的技术,这个技术本质上是由客户端提供的,跟服务器没有什么直接的关系。hiredis pipeline 实现细节以及两种封装hiredis的pipeline实现使用方式发送命令通过连续调用 redisAppendCommand(context, c原创 2023-02-04 11:25:51 · 709 阅读 · 0 评论 -
Redis 5.0 特性 Stream 实现源码分析-XREAD 消费流程
今天学习一下消费端的过程。redis stream的消费方法有几种, XREAD、XREADGROUP, 还有xrange/xrevrange, 后者比较简单,主要就是准备参数然后调用streamReplyWithRange 来根据范围读取消息内容。一、xrange 范围消息读取xrange 语法为:XRANGE key start end [COUNT < n> ]先来看一下xrange的代码,前面部分例行检查,获取start,end id范围。voidxra...原创 2022-01-13 19:25:20 · 1969 阅读 · 0 评论 -
使用C++连接hiredis
linux下c++连接redis,需要安装redis,同时还需要安装hiredis,hiredis是c++操作redis的api库。redis的安装这里不介绍了,很多教程。这里直接从hiredis安装说起。1、下载hiredis,并解压。https://github.com/redis/hiredis[root@server software]# wget https://github.com/redis/hiredis/archive/v0.14.0.tar.gz[root@server s原创 2021-03-11 19:23:21 · 776 阅读 · 0 评论 -
Redis-Cluster学习- 命令协议
一:集群相关cluster info打印集群的信息 clusternodes 列出集群当前已知的所有节点(node),以及这些节点的相关信息。二:节点相关clustermeet <ip> <port> 将 ip 和 port 所指定的节点添加到集群当中,让它成为集群的一份子。 clusterforget <node_id> 从集群中移除 node_id 指定的节点。 clusterreplicate<node_id> 将当前节点设...原创 2021-03-08 22:08:03 · 144 阅读 · 0 评论 -
缓存常识
一、基本概念1. Cache(缓存): 从cpu的一级和二级缓存、Internet的DNS、到浏览器缓存都可以看做是一种缓存。维基百科: 写道a store of things that will be required in the future, and can be retrieved rapidly.(存贮数据(使用频繁的数据)的临时地方,因为取原始数据的代价太大了,所以我可以取得快一些) 2. Cache hit(缓存命中)(下图左)When a da...原创 2021-03-08 21:49:56 · 346 阅读 · 0 评论 -
redis 学习-hiredis库使用(二)
Redis是一个非关系型(NoSQL)数据库,本文将实现一个用c++ API接口连接的例子,来实现对Redis数据库的写入和读出功能,具体将从Redis的安装,Redis的c++接口hiredis安装,代码演示三部分组成。一、Redis的安装和配置由于源中已有Redis的相关组件,这里就不进行源码编译而直接使用apt-get (ubuntu环境)下载和安装1.redis的安装和配置sudo apt-cache search redis //根据结果列表找到需要安装的软件...原创 2021-03-04 20:42:19 · 1258 阅读 · 0 评论 -
redis 学习-hiredis库使用(一)
redis 学习-hiredis库使用(一)hiredis 是redis的客户端sdk,可以让程序操作redis。本文先讲建立连接,基本的get/set命令,读写二进制,获取多个结果来讲。假设读者已经了解redis命令了。hiredis的代码也包含在redis代码中,redis\deps\hiredis目录下,接口很简单,几乎不用封装就可以用。1 连接redis数据库1.1 无超时时间,阻塞redisContext *redisConnect(const char *ip, int po原创 2021-03-04 18:57:20 · 1358 阅读 · 1 评论 -
Redis客户端命令执行过程(源码分析)
今天就一起来看看Redis的命令执行过程中客户端都做了什么事情。启动客户端首先看redis-cli.c文件的main函数,也就是我们输入redis-cli命令时所要执行的函数。main函数主要是给config变量的各个属性设置默认值。比如: hostip:要连接的服务端的IP,默认为127.0.0.1 hostport:要连接的服务端的端口,默认为6379 interactive:是否是交互模式,默认为0(非交互模式) 一些模式的设置,例如:cluster_mo...原创 2021-03-01 10:18:11 · 331 阅读 · 0 评论 -
三种常见的的序列化反序列方式
常见的的序列化反序列方式的效率:protoBuf(PB) > fastjson > jackson > hessian > xstream > java数据来自于:https://github.com/eishay/jvm-serializers/wiki所以我选择了java方式、jackson方式、fastjson方式、pb方式做了封装并测试,测试结果如下:jackson、pb、fastjson差不太多,jackson稍好些,java方式非常慢不推荐,ja原创 2021-02-28 12:56:01 · 598 阅读 · 0 评论 -
c++调用hiredis库操作redis讲解
首先下载编译hiredis,访问https://github.com/redis/hiredis下载hiredis库源码,我的编译环境为ubuntu14,解压hiredis源码后,终端下进入源码目录,然后输入make命令编译即可,编译后将分别得到静态及动态库文件:libhiredis.a / libhiredis.so,然后结合头文件就可以在工程中使用redis了。项目中我用是静态库libhiredis.a及头文件:hiredis.h,read.h,sds.h,使用静态库还是动态库,因人而异。1. ...原创 2021-01-31 23:22:25 · 958 阅读 · 0 评论 -
Redis主从复制
前面的文章已经介绍了redis作为缓存数据库的说明,本文主要说下redis主从复制及集群管理配置的操作记录:Redis主从复制(目前redis仅支持主从复制模式,可以支持在线备份、读写分离等功能。)1)Redis的复制功能是支持多个数据库之间的数据同步。一类是主数据库(master),一类是从数据库(slave),主数据库可以进行读写操作,当发生写操作的时候自动 将数据同步到从数据库,而从数据库一般是只读的,并接收主数据库同步过来的数据,一个主数据库可以有多个从数据库,而一个从数据库只能有一原创 2021-01-21 22:41:47 · 77 阅读 · 0 评论 -
C++ std::pair的用法
std::pair主要的作用是将两个数据组合成一个数据,两个数据可以是同一类型或者不同类型。例如std::pair<int,float> 或者 std::pair<double,double>等。pair实质上是一个结构体,其主要的两个成员变量是first和second,这两个变量可以直接使用。初始化一个pair可以使用构造函数,也可以使用std::make_pair函数,make_pair函数的定义如下:template pair make_pair(T1 a, T2 b)原创 2021-01-20 10:00:41 · 45916 阅读 · 2 评论 -
Hiredis 简介
Hiredis 简介学习总结一下官方发布的C版本客户端hiredis,了解hiredis客户端大致实现细节。在理解代码之间需要了解通信协议的特点,我上一篇转载的文章已经有过介绍,大家可以去看一下。hiredis提供了同步、异步访问,异步 API 需要与一些事件库协同工作,主要看一下同步API的实现。hiredis与服务端通信的API比较简单,主要有这几个步骤:建立连接 发送命令 等待结果并处理 释放连接一、相关数据结构redisContext保存连接建立后的上下文。e...原创 2021-01-20 09:54:47 · 3261 阅读 · 0 评论 -
几种常见的哈希函数(散列函数)构造方法
几种常见的哈希函数(散列函数)构造方法直接定址法 取关键字或关键字的某个线性函数值为散列地址。 即 H(key) = key 或 H(key) = a*key + b,其中a和b为常数。 比如 除留余数法 取关键字被某个不大于散列表长度 m 的数 p 求余,得到的作为散列地址。 即 H(key) = key % p, p < m。 比如 数字分析法 当关键字的位数大于地址的位数,对关键字的各位分布进行分析,选出分布均匀的任意几位作为散列地址。 仅适用于...原创 2021-01-11 11:44:13 · 6272 阅读 · 0 评论 -
Redis主从同步原理
和MySQL主从复制的原因一样,Redis虽然读取写入的速度都特别快,但是也会产生读压力特别大的情况。为了分担读压力,Redis支持主从复制,Redis的主从结构可以采用一主多从或者级联结构,下图为级联结构。 Redis主从复制可以根据是否是全量分为全量同步和增量同步。1 全量同步 Redis全量复制一般发生在Slave初始化阶段,这时Slave需要将Master上的所有数据都复制一份。具体步骤如下: 1)从服务器连接主服务器,发送SYNC命令; 2)主服务器接收到SYNC命名后,开始原创 2021-01-04 21:15:08 · 161 阅读 · 0 评论 -
哈希算法总结
哈希算法总结最近学习redis,阅读了哈希表,看了一下redis的底层实现,发现redis底层使用的哈希算法是murmurhash,第一次听说这个算法感觉自己对哈希值计算的常用算法了解太少,整理了一下网上讲的比较原理性的观点:简介哈稀函数按照定义可以实现一个伪随机数生成器(PRNG),从这个角度可以得到一个公认的结论:哈希函数之间性能的比较可以通过比较其在伪随机生成方面的比较来衡量。一些常用的分析技术,例如泊松分布可用于分析不同的哈希函数对不同的数据的碰撞率(collision rate)。原创 2020-12-30 17:40:00 · 581 阅读 · 0 评论 -
Redis 压缩列表(ziplist)和快速列表(quicklist)
一、Redis 压缩列表(ziplist)1. 介绍压缩列表(ziplist)是哈希键的底层实现之一。它是经过特殊编码的双向链表,和整数集合(intset)一样,是为了提高内存的存储效率而设计的。当保存的对象是小整数值,或者是长度较短的字符串,那么redis就会使用压缩列表来作为哈希键的实现。127.0.0.1:6379> HMSET hash name mike age 28 sex maleOK127.0.0.1:6379> HGETALL hash1) "name...原创 2020-12-30 15:30:08 · 3072 阅读 · 0 评论 -
RabbitMQ基础和原理
一、RabbitMQ基础知识一、背景 RabbitMQ是一个由erlang开发的AMQP(Advanced Message Queue )的开源实现。AMQP 的出现其实也是应了广大人民群众的需求,虽然在同步消息通讯的世界里有很多公开标准(如 COBAR的 IIOP ,或者是 SOAP 等),但是在异步消息处理中却不是这样,只有大企业有一些商业实现(如微软的 MSMQ ,IBM 的 Websphere MQ 等),因此,在 2006 年的 6 月,Cisco 、Redhat、iMatix...原创 2020-12-30 15:15:46 · 129 阅读 · 0 评论 -
Redis学习总结1
绝大部分写业务的程序员,在实际开发中使用 Redis 的时候,只会 Set Value 和 Get Value 两个操作,对 Redis 整体缺乏一个认知。这里以面试题的形式对 Redis 常见问题做一个总结,解决大家的知识盲点。1、为什么使用 Redis?在项目中使用 Redis,主要考虑两个角度:性能和并发。如果只是为了分布式锁这些其他功能,还有其他中间件 Zookpeer 等代替,并非一定要使用 Redis。性能:如下图所示,我们在碰到需要执行耗时特别久,且结果不频繁变动的 SQL,就原创 2020-12-28 11:52:40 · 146 阅读 · 0 评论 -
Redis源码学习(三)--内存管理zmalloc.c
源码结构zmalloc.c文件的内容如下:主要函数zmalloc() zfree() zcalloc() zrelloc() zstrdup()字长与字节对齐 CPU一次性能读取数据的二进制位数称为字长,也就是我们通常所说的32位系统(字长4个字节)、64位系统(字长8个字节)的由来。所谓的8字节对齐,就是指变量的起始地址是8的倍数。比如程序运行时(CPU)在读取long型数据的时候,只需要一个总线周期,时间更短,如果不是8字节对齐的则需要两个总线周期才能读完数据。...原创 2020-12-23 17:25:09 · 535 阅读 · 0 评论 -
Redis 懒惰删除是异步线程
大家都知道 Redis 是单线程的,但是 Redis 4.0 增加了懒惰删除功能,懒惰删除需要使用异步线程对已删除的节点进行内存回收,这意味着 Redis 底层其实并不是单线程,它内部还有几个额外的鲜为人知的辅助线程。这几个辅助线程在 Redis 内部有一个特别的名称,就是“BIO”,全称是 Background IO,意思是在背后默默干活的 IO 线程。不过内存回收本身并不是什么 IO 操作,只是 CPU 的计算消耗可能会比较大而已。懒惰删除的最初实现不是异步线程Redis 大..原创 2020-12-23 16:48:40 · 528 阅读 · 0 评论 -
Redis学习
一、Redis基础Redis 简介Redis 是完全开源免费的,遵守 BSD 协议,是一个高性能的 key - value 数据库Redis 与 其他 key - value 缓存产品有以下三个特点: Redis 支持数据持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用。 Redis 不仅仅支持简单的 key - value 类型的数据,同时还提供 list,set,zset,hash 等数据结构的存储 Redis 支持数据的备份,即 master原创 2020-12-22 17:50:35 · 151 阅读 · 0 评论 -
Redis基础
一、Redis简介redis简介(Remote dictionary Server 远程字典服务器):是完全开源免费的,由C语言编写的,一个高性能的(key/value)分布式内存数据库,基于内存运行, 并支持持久化的Nosql数据库,也被称为" 数据结构服务器 "。提前剧透、redis关于key-value的三大特点:redis是支持持久化的! 我们可以控制 数据 何时,用何种方式 保存到磁盘中,每次重启再次加载该文件,可以完成数据恢复 redis不单单支持简单的key-value数据类原创 2020-12-22 17:27:24 · 84 阅读 · 0 评论 -
Redis异步
Hiredis结构图sds说明:简单字符类型,typedef char * sdsAPIsds sdsnewlen(const void *init, size_t initlen)sds sdsnew(const char *init)sds sdsempty(void)size_t sdslen(const sds s)sds sdsdup(const sds s)void sdsfree(sds s)size_t sdsavail(const sds .原创 2020-12-22 16:58:35 · 1121 阅读 · 0 评论 -
Redhat下Redis的安装和部署
Redhat下Redis的安装和部署第一步:下载安装包 访问https://redis.io/download 到官网进行下载。这里下载最新的4.0版本.第二步:安装 1.通过远程管理工具,将压缩包拷贝到Linux服务器中,执行解压操作 tar -zxf redis-4.0.9.tar.gz 2.进入解压文件目录使用make对解压的Redis文件进行编译 图示:这里因为我redis的安装目...原创 2020-12-22 15:27:26 · 2182 阅读 · 0 评论