- 博客(54)
- 收藏
- 关注
原创 基本的服务器运维安全
一、背景测试服务器有公网ip的,被勒索病毒吧所有文件加密,数据丢失,服务器中的虚拟机全部丢失,所以要考虑小公司最基本的运维安全。二、原因1、我们个人在使用云服务器或者自己部署服务器的时候会直接使用管理员账号administrator或root2、在开放服务的时候会关闭防火墙放开所有端口3、密码太过简单4、没有进行备份三、解决方案1、新建一个账号,给予管理员权限,禁用管理员远程登录windows: 创建一个新的账号,赋予管理员权限,禁用administrator登录开设远程桌面权限给这个账
2020-11-28 16:07:22
574
1
原创 使用mysqldump进行数据迁移
操作系统:CentOS 7.6 64bit with ARMmysql版本:mysql8.0一、备份数据1、备份全部数据库mysqldump -uroot -p --all-databases > /backup/mysqldump/all.db2、备份指定库:mysqldump -uroot -p test > /backup/mysqldump/test.db3、备份指定数据库指定表(多个表以空格间隔)mysqldump -uroot -p mysql db ev
2020-11-28 15:56:52
361
原创 linux下安装mysql的流程
操作系统:CentOS 7.6 64bit with ARMmysql版本:mysql8.0操作步骤:0、检查系统内是否有其他mysql或者mariadb的残留,需要删除/卸载干净才能顺利安装0.1、卸载查找mysql的安装包rpm -qa | grep mysql 查找已经安装的mysql包rpm -e 包名 0.2 查找所有mysql的相关文件并删除find / -name mysqlrm -rf 查找到的路径1、下载rmp包https://dev.mysql.com/do
2020-11-28 15:50:52
179
原创 wordpress安装流程
操作系统:Ubuntu 18.04WordPress版本: wordpress-5.4.2-zh_CN操作步骤1、apt-get update2、apt-get upgrade3、apt-get install apache24、apt-get install mysql-server mysql-client5、apt install software-properties-common6、add-apt-repository ppa:ondrej/php && apt-g
2020-11-28 15:37:51
157
原创 linux挂载硬盘并建立samba共享操作流程
操作系统:centos7.6操作背景:得到了几台服务器资源,但是配置没有办法动态调整,且不可更换操作系统,windows系统的性能比较好,但是硬盘较小,linux系统硬盘较大,就使用samba共享将linux的目录挂载到windows上,给windows使用,由于在同一网段,所以性能还是比较好的。linux挂载硬盘流程1、查看磁盘列表fdisk -l2、对磁盘进行分区fdisk /dev/vdbn 创建一个新的磁盘w 保存当前分区并退出3、查看当前系统支持的文件系统cat /etc/fi
2020-11-28 15:28:40
3096
原创 简单的VS编译问题(cmake)
有个程序可能会编译成dll,也可能直接当做app使用,默认cmake是写dll.cmake,但是更改为app.cmake后编译会报错,fatal error LNK1104: 后面的库名和.exp只到目录,并没有具体的文件名称。解决方法: 将dll的接口cpp文件移除再编译。这只是我在遇到这个问题时的解决方案,在不同的场景下这个问题可能是由于不同原因引起的,在此做记录。...
2019-10-21 16:34:24
334
原创 Sql Server 查询每个不同id,时间最新的行(每个id都显示,但是每个id只显示最新一行)
select userLogRecord.id,userLogRecord.userId,userLogRecord.type,userLogRecord.ip,userLogRecord.remarks,userLogRecord.onLine,userLogRecord.day,userLogRecord.loginTime,userLogRecord.logoutTime,userLogRe...
2019-01-23 17:17:55
1844
原创 SQL Server遍历查询出的数据集合
需求场景:公司服务迁移,需要将旧的用户数据表迁移到新的以组角色权限管理的表中,原来只有用户信息,将用户信息使用自己写的C++程序导入到新的用户表后,需要将用户统一划分到某一组里,这时需要遍历查询到的用户id,将这个id和组id绑定到另一张关系表中。在导入用户数据表时,因为以前有重复的电话和邮箱,新的表要将这些做unique,所以对这些重复的数据进行了特殊处理,这里不做讨论。一、使用游标...
2018-03-21 16:09:49
6937
原创 windows下使用TransmitFile传输文件并接收的方法
在工作中为了高效的上传下载文件,我使用到了TransmitFile这个API,它允许在套接字连接上发送一个打开的文件。这使得应用程序可以避免亲自打开文件,重复地在文件执行读入操作,再将读入的那块数据写入套接字。在使用过程中需要服务器和客户端两个部分,服务器运行起来后监听socket端口,当有套接字链接进入后便开始读取字节流,需要注意的是TansmitFile的参数:BOOL PASCAL ...
2018-03-05 21:57:15
5966
1
原创 结合redis设计与实现的redis源码学习-26-工具函数(Util.h/.c)
Redis将很多的公用转换函数独立了出来,放入了Util.h中,包括字符串对比,内存转换,字符串数字转换,获取路径等,Redis的作者都是自己实现的,在这里我将这些函数认真学习,观察是在哪里高效并可以在之后的工作中使用。 因为Util的函数都是完全独立逻辑的,所以我在这里只看.c文件 Util.c#include <stdlib.h>#include <stdio.h>#include <s
2017-12-18 23:48:32
398
原创 结合redis设计与实现的redis源码学习-19.1-客户端
Redis服务器是典型的一对多服务程序:一个服务器可以与多个客户端建立网络连接,每个客户单可以向服务器发送命令请求,而服务器则接收并处理客户端发送的命令请求,并向客户端返回命令回复。 通过使用I/O多路复用技术实现的文件处理器,Redis服务器使用单线程单进程的方式来处理命令请求,并与多个客户端进行网络通信。 对于每个与服务器进行连接的客户端,服务器使用redisClient结构来保存客户端当前
2017-12-17 14:23:47
234
原创 结合redis设计与实现的redis源码学习-25-慢查询日志(slowlog)
Redis的慢查询日志功能用于记录执行时间超过给定时长的命令请求,用户可以通过这个功能产生的日志来监控和优化查询速度。 服务器配置有两个和慢查询日志相关的选项: -1、slowlog-log-slower-than选项指定执行时间超过多少微妙的命令会被记录到日志上。 -2、slowlog-max-len选项指定服务器最多保存多少条慢查询日志。 服务器使用先进先出的方式保存多条慢查询日志,当达
2017-12-17 10:14:41
347
原创 结合redis设计与实现的redis源码学习-24-二进制位数组(Bitops.c)
Redis提供了SETBIT,GETBIT,BITCOUNT,BITOP四个命令用于处理二进制位数组。 例:SETBIT为位数组指定偏移量上的二进制位设置值,偏移量从0开始计数; GETBIT获取位数组指定偏移量上的二进制位值; BITCOUNT统计位数组中,值为1的二进制位的数量; BITOP可以对多个位数组进行按位与,或,异或运算。 命令 结果 SETBIT bit 0 1
2017-12-16 23:28:48
918
原创 结合redis设计与实现的redis源码学习-23-排序(sort.c)
Redis的Sort命令可以对列表键,集合键或者有序集合键值进行排序。也可以使用SORT alphabet来对字符进行排序。一、sort命令的实现sort命令会先创建一个和列表长度相同的数组,数组的每个元素都是一个redisSortObject结构,然后遍历数组,将各个obj指针所指向的列表项转换成一个double浮点数,,保存早结构的score中,根据score的值对数组进行排序,遍历数组,将各个
2017-12-15 00:23:50
393
原创 汇编语言学习笔记1.0-(基础知识、寄存器)
为了更好的使用C/C++进行开发工作,我需要了解一些汇编语言的知识,所以就从《汇编语言》这本书开始吧。 这系列可能并不详细,主要用于自己做笔记和加深印象。一、基础知识关键字:机器语言、汇编语言、存储器、指令、数据、存储单元、CPU对存储器的读写、地址总线、数据总线、控制总线、内存地址空间、主板、接口卡、存储器芯片、内存地址空间 -1、机器语言: 机器指令的集合,一列二进制数字,可以由机器执行。
2017-12-10 21:05:53
324
原创 Gossip算法学习笔记
主要参考了《分布环境下的Gossip算法》这篇论文,并包含在网上整理的一些资料。 简介:Gossip 算法又被称为反熵(Anti-Entropy),熵是物理学上的一个概念,代表杂乱无章,而反熵就是在杂乱无章中寻求一致. Gossip 的特点:在一个有界网络中,每个节点都随机地与其他节点通信,经过一番杂乱无章的通信,最终所有节点的状态都会达成一致。每个节点可能知道所有其他节点,也可能仅知道几个邻居
2017-12-10 19:23:50
1639
原创 raft算法学习笔记
再看redis源码的过程中,发现sentinel和redis集群的实现方式都使用到了raft算法,就找了一些资料学习了以下,包括视频演示了论文,再学习完这个算法之后再去研读redis哨兵和集群的代码; 教学视频(英文)http://v.youku.com/v_show/id_XNjQxOTk5MTk2.html 演示视频(英文)http://thesecretlivesofdata.com/ra
2017-12-10 16:34:44
743
原创 结合redis设计与实现的redis源码学习-22-集群(cluster.c)
Redis集群是Redis提供的分布式数据库方案,集群通过分片(sharding)来进行数据共享,并提供复制和故障转移功能。一、节点一个Redis集群通常由多个节点组成,在刚开始的时候,每个节点都是独立的,他们都处于一个只包含自己的集群当中,我们必须将各个独立的节点连接起来,构成一个包含多个节点的集群。使用CLUDSTER MEET 命令可以连接各个节点。1、启动节点一个节点就是一个运行在集群模式
2017-12-06 23:51:35
341
原创 结合redis设计与实现的redis源码学习-21-哨兵(Sentinel.c)
Sentinel是redis的高可用性解决方案:由一个或多个Sentinel组成的Sentinel系统可以监视任意多个主服务器,以及这些主服务器属下的所有从服务器,并在被监视的主服务器进入下线状态时,自动将下线主服务器属下的某个从服务器升级为新的主服务器,然后向原来主服务器的slave发送新的复制指令,让他们成为新主服务器的从服务器,然后由新的主服务器代替已下线的主服务器继续处理命令请求,还会监视已
2017-12-05 01:01:08
271
原创 结合redis设计与实现的redis源码学习-20-复制(replication.c)
在Redis中,用户可以通过执行slaveof命令或者设置slaveof选项,让一个服务器去复制(replicate)另一个服务器,我们称呼被复制的服务器为主服务器(master),而对主服务器进行复制的服务器则被称为从服务器(slave)。功能实现PSYNC命令:具有完整重同步和部分重同步两种模式:-1、完整重同步用于处理初次复制的情况:完整重同步会将主服务器生成的RDB文件发送给从服务器,并且记
2017-12-03 23:03:32
960
原创 结合redis设计与实现的redis源码学习-19-服务器(server.c)
Redis服务器负责与多个客户端建立网络连接,处理客户端发送三个的命令请求,在数据库中爆粗你客户单执行命令所产生的数据,并通过资源管理来维持服务器自身的运转。命令请求的执行过程当服务器与客户端的连接套接字因为客户端的写入而变得可读时,服务器将调用命令请求处理器来执行以下操作:-1、读取套接字中协议格式的命令请求,并将其保存到客户端状态的输入缓冲区中; -2、对输入缓冲区中的命令请求进行分析,提取出
2017-12-02 15:31:50
446
原创 结合redis设计与实现的redis源码学习-18-网络连接库(networking.c)
networking.cRedis 的网络连接库,负责发送命令回复和接受命令请求, 同时也负责创建/销毁客户端, 以及通信协议分析等工作. 下面是部分使用的结构体,定义在server.h中//命令结构体struct redisCommand { char *name; redisCommandProc *proc;//命令处理器 int arity;//元数 ch
2017-12-02 14:40:32
1344
原创 结合redis设计与实现的redis源码学习-17-发布与订阅(pubsub.c)
Redis的发布预定月功能由PUBLISH,SUBSCRIBE,PSUBSCRIBE等命令组成。通过执行SUBSCRIBE命令,客户端可以订阅一个或者多个频道,成为这个频道的订阅者:每当有其他客户端向被订阅的频道发送消息是,该频道的所有订阅者都会收到这条消息。 客户端还可以通过执行PSUBSCRIBE来订阅一个或者多个模式,从而成为这些模式的订阅者:每当有其他客户端向某个频道发送消息时,消息不仅会
2017-11-30 23:02:16
402
原创 结合redis设计与实现的redis源码学习-16-事务(multi.c)
Redis通过MULTI,EXEC,WATCH等命令来实现事务(transaction)功能。事务提供了一种将多个命令请求打包,然后一次性,按顺序地执行多个命令的机制,并且在事务执行期间,服务器不会中断事务而改去执行其他客户端的命令请求。 在client结构体中用mstate来表示事务的状态,它是一个结构体://事务命令的参数typedef struct multiCmd { robj
2017-11-30 01:15:54
310
原创 结合redis设计与实现的redis源码学习-15-TCP网络连接(anet.c)
anet.c中实现了一些网络相关的设置操作,可以参考我的linux网络编程那篇文章。 这里使用的socket属性更多,帮我复习了tcp相关的知识。 我们先来看anet.h#ifndef ANET_H#define ANET_H#include <sys/types.h>#define ANET_OK 0#define ANET_ERR -1#define ANET_ERR_LEN 25
2017-11-29 00:15:03
729
原创 结合redis设计与实现的redis源码学习-14-事件(ae.c/ae_epoll.c)
Redis服务器是一个事件驱动程序,服务器需要处理两类事件: 文件事件(file event):Redis服务器通过套接字与客户端进行连接,而文件事件就是服务器对套接字操作的抽象。服务器与客户端的通信会产生相应的文件事件,而服务器则通过监听并处理这些事件来完成一系列网络通信操作。 时间事件(time event):Redis服务器中的一些操作需要在给定的时间点执行,而时间事件就是服务器对这类定时
2017-11-28 01:17:59
427
原创 结合redis设计与实现的redis源码学习-13-AOF持久化(aof.c/bio.h)
出了RDB持久化功能以外,redis还提供了AOF(Append Only File)持久化功能,与RDB持久化通过保存数据库中的键值对来记录数据库状态不同,AOF持久化是通过保存Redis服务器所执行的写命令来记录数据库状态的。AOF持久化命令的实现AOF命令的实现可以分为命令追加,文件写入,文件同步三个步骤; 1、命令追加:当AOF持久化功能处于打开状态时,服务器在执行玩一个写命令后,回忆协议
2017-11-26 21:10:31
602
原创 结合redis设计与实现的redis源码学习-12-RDB持久化(rdb.h/rio.h)
因为redis是一个内存数据库,他将自己的数据库状态存储在内存中,一旦服务器锦城推出,服务器中的数据库状态也会消失不见。为了解决这个问题,redis提供了RDB持久化功能,这个功能可以将redis在内存中的数据库状态保存在磁盘里,避免数据意外丢失。 RDB持久化既可以手动执行,也可以根据服务器配置定期执行,该功能可以将某个时间点上的数据库状态保存到一个RDB文件中,这个文件是一个经过压缩的二进制文
2017-11-26 18:23:59
1837
原创 结合redis设计与实现的redis源码学习-11.1-命令的实现(Db.c)
这小节我们来看数据库代码的具体实现: 函数声明在server.h中:robj *lookupKey(redisDb *db, robj *key, int flags);robj *lookupKeyRead(redisDb *db, robj *key);robj *lookupKeyWrite(redisDb *db, robj *key);robj *lookupKeyReadOrRe
2017-11-26 16:20:57
353
原创 结合redis设计与实现的redis源码学习-11-数据库(server.h/redisDb,notify.c)
在之前的学习中我们了解了redis所有的数据结构和使用方法,现在我们开始来学习redis数据库相关的内容。 这一节先来学习服务器中的数据库,主要代码在server.h和Db.c中。 redis服务器的所有数据库都保存在服务器状态redisServer结构体的db数组中,db数据的每一个项都是redisDb结构,每个redisDb结构代表一个数据库,其中dict字典保存了数据库中的所有键值对,这个
2017-11-26 13:46:08
387
原创 结合redis设计与实现的redis源码学习-8.3-t_list.c(列表键)
T_list.c主要说明了列表键和列表键的命令实现方式;#include "server.h"//将一个值放入列表中,根据where判断是头插还是尾插void listTypePush(robj *subject, robj *value, int where) { if (subject->encoding == OBJ_ENCODING_QUICKLIST) { in
2017-11-04 00:04:53
401
原创 结合redis设计与实现的redis源码学习-8.2-t_string(字符串键)
t_string.c中定义了字符串键的实现过程。#include "server.h"#include <math.h> /* isnan(), isinf() *///检查客户端的字符串长度static int checkStringLength(client *c, long long size) { if (size > 512*1024*1024) { addR
2017-11-03 23:30:16
242
原创 结合redis设计与实现的redis源码学习-8.1-object.c(对象实现)
在8.0中我们了解了redis对象的实现方式和一些特性,今天我们来看他的具体实现方式。#include "server.h"#include <math.h>#include <ctype.h>//创建一个robj对象,该对象在server.h中定义robj *createObject(int type, void *ptr) { robj *o = zmalloc(sizeof(*
2017-10-31 22:03:06
269
原创 结合redis设计与实现的redis源码学习-10-hyperloglog(基数统计)
hyperloglog是redis用来做基数统计的算法,优点是在输入元素的数量或者体积非常大时,基数所需的空间是固定的,并且是很小的,在redis中,每个hyperloglog键只需要花费12kb内存,就可以计算接近2^64个不同元素的基数;但是因为它智慧根据输入元素来计算基数,而不会储存输入元素本身,所以不能像集合那样,返回输入的各个元素。 它定义在hyperloglog.c中,因为对这个算法完
2017-10-29 13:48:37
595
原创 C++连接池
这是我在使用redis做托管服务时用到的连接池,主要以封装hiredis的redisObj对象来作为连接对象的,为了保证连接存活,会定时检测空闲的连接对象是否可以正常工作(正在使用的默认正常),对于操作失败的会重新连接。 我在使用时使用一个单例redis连接池的,初始化后对外提供一个获取连接的方法,构造实例对象便可以获取一条连接,利用类的析构方式,不需要手动放回,在析构时调用放回的方法。#ifnd
2017-10-26 23:50:11
1792
原创 C++线程池-ThreadPool
今天介绍一下线程池,线程池还是比较简单的,使用线程函数开辟几条线程,每条线程使用一个循环检测任务队列,当有任务时执行,这里为了避免CPU的空转,当有新任务加入队列时,通知一个线程去执行它。 这个线程池具有以下特点: 1、定时检测线程数量,关闭空闲的多余线程; 2、像最大线程数,保持线程数是可以在运行时改变的,虽然基本上没有这个必要; 3、这个线程池是单例的,我在使用时会在程序启动时创建它,然
2017-10-22 11:40:54
1033
原创 时间轮定时器-Timewheel
最近有个大牛给我教了时间轮算法,并且看了他实现的源码,认为自己已经理解了他所实现的思想,这里将我的代码和理解分享一下: 时间轮是模仿钟表的方式,秒针走一圈,分针走一格,只有最里圈的任务需要执行,转一圈后分针(外一层)指向下一格,将那一格的节点重新插入,那么就会插入到秒针(最里圈)。 以下方式还有一些不足,我会再做修改:#ifndef __TIMEWHEEL_H__#define __TIM
2017-10-21 23:38:57
3957
原创 结合redis设计与实现的redis源码学习-9-zipmap(压缩图)
在学习了所有redis设计与实现的数据结构后,我发现在redis中还有一些特殊的数据结构,今天我们来学习zipmap。 zipmap和ziplist比较相似,使用特殊的内存存储方法来提升个数较少的键值对。具有以下特点: 1、使用1个字节的len来存储元素个数,当长度大于最大值那么只能遍历获得size了; 2、len后面是key的长度,一般使用1个字节或者5个字节表示; 3、free用来表示v
2017-10-21 21:58:57
514
2
原创 结合redis设计与实现的redis源码学习-8.0-object(对象)
重点来了! 在前面的几个章节里,我们陆续学习了redis用到的所有主要数据结构,但是redis并没有直接使用这些数据结构来实现键值对数据库,而是基于这些数据结构创建了一个对象系统,包含字符串对象,列表对象,哈希对象,集合对象和有序集合对象这五种类型的对象,美中对象都用到了至少一中前面的数据结构。 通过这五种不同的对象,redis可以在执行命令之前根据对象的类型来判断一个对象是否可以执行给定的命令
2017-10-15 23:42:19
274
原创 结合redis设计与实现的redis源码学习-7-ziplist(压缩列表)
压缩列表是列表件和哈希键的底层实现之一,当一个列表件只包含少量列表项,并且每个列表项要么就是小整数值,要么就是长度比较短的字符串,那么redis就会使用压缩列表来做列表键的底层实现。 压缩列表的特点: 1、压缩列表是由一系列特殊编码的连续内存块组成的顺序型数据结构。 2、一个压缩列表可以包含任意多个节点,每个节点可以保存一个字节数组或者一个整数值。 3、添加新节点到压缩列表,或者从压缩列表中
2017-10-13 08:25:29
266
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人