主页

浅谈redis持久化

前言

前面我们讲了 Redis 的数据结构(Redis那些事之数据结构),今天我们来看看 Redis 的持久化,Redis 的持久化分两种 RDB 和 AOF。这两种各有优缺点,我们先看下官方是怎么描述这两种结构的:

RDB持久性以指定的时间间隔执行数据集的时间点快照。
AOF持久性记录服务器接收的每个写入操作,将在服务器启动时再次播放,重建原始数据集。 使用与Redis协议本身相同的格式以仅追加方式记录命令。 当Redis太大时,Redis能够重写日志背景。

我们可以选择关闭持久化,把 Redis 作为一个内存缓存使用,也可以开启持久化做数据库使用,RDB 和 AOF 可以同时开启,同时开启的情况下 Redis 优先读取 AOF 里面的数据。最重要的是理解 RDB 和 AOF 的区别和各自的优缺点,以便我们在不同的业务员场景下择优选择。

点我阅读更多...

浅谈redis数据结构

前言

Redis 数据库里面的每个键值对都是由对象组成的,其中数据库的键总是一个字符串对象(string object),数据库的值则可以使字符串对象、列表对象(list object)、哈希对象(hash object)、集合对象(set object)和有序集合对象(sorted object)这五种数据结构。下面我们一起来看下这些数据对象在 Redis 的内部是怎么实现的,以及 Redis 是怎么选择合适的数据结构进行存储等。

简单动态字符串

Redis 没有直接使用 C 语言传统的字符串标识,而是自己构建了一种名为简单动态字符串 SDS(simple dynamic string)的抽象类型,并将 SDS 作为 Redis 的默认字符串。
SDS 结构(如果没有特殊说明,代码采用的一律为 Redis 5.0 版本)

struct __attribute__ ((__packed__)) sdshdr64 {
    uint64_t len; /* used */
    uint64_t alloc; /* excluding the header and null terminator */
    unsigned char flags; /* 3 lsb of type, 5 unused bits */
    char buf[];
};
点我阅读更多...

从自身成长聊一下我理解的“终身学习”

前言

这周我们来聊点轻松的,聊一下技术人员的“终身学习”。个人浅见,希望能帮助到你
其实我当初在选择方向的时候还是挺纠结的,稀里糊涂的就选择了程序员这条路。也浑浑噩噩的度过了几年的日子。后来工作了,发现之前有规划有计划的小伙伴们都成长的很快。而自己就像一条没有梦想也没有追求的咸鱼,根本不知道自己想要什么。其实我一开始工作的时候,对这个专业的兴趣并不是很浓,之所以选择这个专业,无非是因为好找点工作,多挣点钱,毕竟都说:“CS专业是寒门之子逆袭的一条捷径”。既然家庭条件决定了要打工,就早点为打工做准备。可惜当初并没有明白这个道理,现在看来从大学开始,个人选择开始变得格外重要,越早认识到这一点,大学阶段的收获就越大。一些优秀的家庭不止是关注孩子的成绩,更关注的是孩子的认知,一个人的认知往往决定了它的高度,大多数人都不懂这个道理。

成长经历

随着自己慢慢成熟,自己的认知也提升了不少。我渐渐明白做一个人,要做负责的人(包括不限于对自己负责、家人负责、工作负责、爱情负责等)。既然选择这个专业了,并且没有换方向的想法,那就把它做好,对自己负责。
我开始慢慢接触一些技术的圈子,开始慢慢了解我所属的这个行业。在中国互联网的行业常说;程序员的35岁危机、框架更新太快学不会等。弄得程序员这个行业充满焦虑,凡是撩拨这种情绪的文章都能获得大量的转发。我一度也陷入这个焦虑和恐慌中,现在看来其实每个时代都一样,社会并不欠我们一个成功。无论你怎么忙、没时间、有困难、不能痛下决心、拖延症等,社会不管,它不能保证每一个人的成功。

点我阅读更多...

Redis cluster

前言

本来最近打算学习Unix网络编程,但是项目中项目中用到了Redis Cluster,自己对Redis集群这方面并不是很熟悉,所以打算花点时间来系统的学习一下Redis,Redis主要分四个部分;
1.数据结构与对象
2.单机数据库实现
3.多机数据库实现
4.独立功能的实现
本文先简单介绍下Redis 的集群实现,后续会针对上面的在进行详解;

Redis 集群介绍

Redis因为具有丰富的数据结构和超高额性能以及简单的协议,使其能够很好的作用为数据库的上游。但是当数据量变大的时候(如数据达到千万级别时),会受限以多个地方,单机内存有限、单点问题、动态扩容问题等。
为了解决上面的问题,Redis的集群方案就显得比较重要了。使用Redis集群通常有三个途径;

  • 官方提供的 Redis Cluster
  • 通过Proxy分片
  • 客户端分片(Smart Client)
点我阅读更多...

Transmission control protocol

最近重读的 Stevens 老先生的TCP/IP详解,梳理了一下,打算把自己理解的写出来。
TCP/IP是一种面向连接的、可靠的、基于字节流的传输层通信协议,它会保证数据不丢包、不乱序。TCP全名是Transmission Control Protocol,它是位于网络OSI模型中的第四层(Transport layer)。

TCP 首部

tcp header.jpg

  • Port
    每个TCP数据段都包含源端口和目的端口号,用于寻找发送端和接收端的应用进程。这两个值加上IP首部中的源端IP和目的端IP地址唯有时候我们也会把它称为socket四元组(源IP地址、目的IP地址、源端口、目的端口)
点我阅读更多...

最近的半年的总结

前言

写这篇文章中心中也是思绪万千,最近做的事情很多,成长也蛮大。所以自己一直想把自己最近做的事都写出来,可是真正开始写的时候,又不知从何写起。

做好项目规划真的很重要

最近一年负责的项目运营的还不错,现在大概每天能有亿级流量。当时是为了快速开发,就用PHP做了一个最小可用版本。上线之后运营那边数据很好,每天都能有10万+的新增,用户粘合性也比较高,所以就开始迭代。因为自己是第一次用0-1把控整个项目,再加上是为了抢占用户红利快速开发,很多事情提前都没有架构好。所以可想而知,迭代几个版本后维护成本急剧增加。每次改版或者发布新功能都要小心翼翼,生怕影响到哪儿导致出致命bug。好在及时感知到了问题所在,在不影响新功能开发的情况下,我加班加点重新梳理规划了项目。规划后感觉一切都明朗了起来,维护起来也不是那么困难了,开发效率也提高了很多。

基础重要吗

点我阅读更多...

Tcp 3 Way and 4 Way handshake

TCP三次握手

TCP是一个面向连接的的协议,所以无论哪一方发送数据之前都必须要建立连接。三次握手是TCP/IP网络中用于在本地主机/客户端和服务器之间创建连接的方法。这是一种三步方法,要求客户机和服务器在实际数据通信开始之前交换SYN和ACK(确认)数据包。 要建立连接,将发生三次握手:

1.SYN:主动打开由客户机向服务器发送syn来执行。客户机将段的序列号(SEQ)设置为随机值A。
2.SYN-ACK:作为响应,服务器用SYN-ACK进行响应。确认号被设置为比接收到的序列号多一个,即A+1,服务器为数据包选择的序列号是另一个随机数B。
3.最后,客户机将一个ACK发送回服务器。序列号设置为接收到的确认值,即A+1,确认号设置为接收到的序列号(即B+1)的一个以上。

此时,客户机和服务器都已收到连接确认。步骤1、2建立一个方向的连接参数(序列号),并确认。步骤2、3为另一个方向建立连接参数(序列号),并确认。通过这些,建立了全双工通信。
TCP 3-way and 4-way handshake

TCP四次挥手

TCP的关闭是四次,也就是说需要双方都发送FIN告知对方我要关闭了,并回复FIN-ACK。所以在一方关闭的时候另一方还可以发送数据,我们把这种现象称为TCP半关闭。当然主动方发起方也可以选择不接受。TCP四次挥手:

点我阅读更多...

Eclipse报错信息jvm terminated. exit code=1

报错信息如下:

JVM terminated. Exit code=1
/usr/local/eclipse/jre/bin/java
-Dosgi.requiredJavaVersion=1.8
-Dosgi.instance.area.default=@user.home/eclipse-workspace
-XX:+UseG1GC
-XX:+UseStringDeduplication
-Dosgi.requiredJavaVersion=1.8
-Xms256m
-Xmx1024m
-jar /usr/local/eclipse//plugins/org.eclipse.equinox.launcher_1.4.0.v20161219-1356.jar
-os linux
-ws gtk
-arch x86_64
-showsplash /usr/local/eclipse//plugins/org.eclipse.epp.package.common_4.7.1.20170914-1200/splash.bmp
-launcher /usr/local/eclipse/eclipse
-name Eclipse
--launcher.library /usr/local/eclipse//plugins/org.eclipse.equinox.launcher.gtk.linux.x86_64_1.1.500.v20170531-1133/eclipse_1624.so
-startup /usr/local/eclipse//plugins/org.eclipse.equinox.launcher_1.4.0.v20161219-1356.jar
--launcher.appendVmargs
-exitdata 21000b
-product org.eclipse.epp.package.java.product
-vm /usr/local/eclipse/jre/bin/java
-vmargs
-Dosgi.requiredJavaVersion=1.8
-Dosgi.instance.area.default=@user.home/eclipse-workspace
-XX:+UseG1GC
-XX:+UseStringDeduplication
-Dosgi.requiredJavaVersion=1.8
-Xms256m
-Xmx1024m
-jar /usr/local/eclipse//plugins/org.eclipse.equinox.launcher_1.4.0.v20161219-1356.jar 

第一种: eclipse.ini中内存设置过大的问题,修改了一下,256m改成128m,把512m   改为 256m,即可。

点我阅读更多...