Redis底层数据结构
Redis以高性能著称,不仅其因为采用了单线程,IO多路复用,纯内存读写等等,它还在底层的数据结构实现上用了很大的心思。针对不同的场景采用了不同的数据结构,以提升数据读写效率,降低数据存储空间。 Redis底层使用六种数据结构 简单动态字符串(SDS) hash表(散列表/字典) 链表 跳表 整型数组 压缩列表 Hash表 首先Redis的底层...
Redis以高性能著称,不仅其因为采用了单线程,IO多路复用,纯内存读写等等,它还在底层的数据结构实现上用了很大的心思。针对不同的场景采用了不同的数据结构,以提升数据读写效率,降低数据存储空间。 Redis底层使用六种数据结构 简单动态字符串(SDS) hash表(散列表/字典) 链表 跳表 整型数组 压缩列表 Hash表 首先Redis的底层...
Redis的慢查询日志功能用于记录执行时间超过给点时长的命令请求,用户可以通过日志来监视和优化查询速度。 慢查询日志配置 我们可以通过配置文件或者命令方式配置 slowlog-log-slower-than(执行时间超过多少微妙的命令会被记录) 和 slowlog-max-len (最多保存多少条日志记录) 配置文件 slowlog-log-slower-than 1...
Sentinel(哨兵)是redis的高可用解决方案:由一个或多个Sentinel实例组成Sentinel系统可以监视任意多个主服务器,以及这些这些主服务器下属的所有从服务器,并在被监视的主服务器进入下线状态后,自动将下线主服务器下属的某个从服务器升级为新的主服务器,然后由新的主服务器代替已下线的主服务器继续处理命令请求。 配置 创建一个Sentinel.conf配置文件内容如下...
redis是C语言实现的,但redis中的字符串并没有直接用C语言中的字符串表示,而是自己构建了一种简单的动态字符串类型(SDS)。 在redis里面,C字符串只用作字面量,用在一些不会修改的地方,eg:打日志。 SDS的结构: struct sdshdr{ int free; int len; char buf[]; } free 属性值为0 表...
redis应用场景总结redis平时我们用到的地方蛮多的,下面就了解的应用场景做个总结: 热点数据的缓存:由于redis访问速度块、支持的数据类型比较丰富,所以redis很适合用来存储热点数据,另外结合expire,我们可以设置过期时间然后再进行缓存更新操作,这个功能最为常见,我们几乎所有的项目都有所运用。 限时业务的运用:redis中可以使用expir...
数据持久化功能是redis相比于其他缓存中间件具有的优势之一,它可以保证在redis重启时,数据不丢失,以提升系统的性能及可用性。 那么redis是如何实现数据持久化的呢?它提供了两种数据持久化的解决方案: RDB、AOF。 RDB redis默认的持久化策略是RDB方案,rdb方案生成的rdb文件是一个经过压缩的二进制文件,通过它可以还原到生成RDB文件时的数据库状态,当re...
在redis中,我们可以通过slaveof命令或配置选项,让一个服务器去复制另一个服务器,我们称被复制的服务器为主服务器,而对主服务器进行复制的服务器为从服务器。 下面是从服务器设置主服务器相关的配置,如果主服务器设置了requirepass 选项,需要在masterauth配置上主服务的密码。 slaveof 127.0.0.1 6379 # If the master is pass...
过期key删除策略 在我们用 redis 存储数据时,大多数场景都会给key设置一个过期时间,那么当key过期后,redis是如何处理的呢。大家可能会想到定时器的方案,当我们给key设置过期时间的同时设置一个定时器,到达时间后,删除过期的key,但这种方式在内存不紧张但Cpu紧张时,将cpu时间用在删除过期key上,无疑会对系统的吞吐量造成影响。所以redis没有采用这种方案,而是使用了 ...
#redis的配置 #Redis默认不是以守护进程的方式运行,可以通过该配置项修改,使用yes启用守护进程 daemonize yes #当Redis以守护进程方式运行时,Redis默认会把pid写入redis.pid文件,可以通过pidfile指定 pidfile 'E:/xxx/redis/redis_pid/redis.pid' #端口 port 6379 #绑定主机的i...
Redis集群是Redis提供的分布式数据库方案,集群通过分片(sharding)来进行数据共享,并提供复制和故障转移功能。 节点通过握手将其它节点添加到自己所在的集群。 集群中的16384个槽可以分别指派给集群中的各个节点,每个节点都会记录哪些槽指派给了具体哪个节点。 节点在收到客户端命令请求时,会先检查这个命令请求处理的键所在的槽是否由自己负责,如果不是的话,节点将向客户...
Go 基础 简介 Go 语言主要特征 自动立即回收。 更丰富的内置类型。 函数多返回值。 错误处理。 匿名函数和闭包。 类型和接口。 并发编程。 反射。 语言交互性。 25个关键字 go break switch case select package import func ...
Trie 树,也叫“字典树”。顾名思义,它是一个树形结构。它是一种专门处理字符串匹配的数据结构,用来解决在一组字符串集合中快速查找某个字符串的问题。它的本质,就是利用字符串之间的公共前缀,将重复的前缀合并在一起。 Trie树的实现 Trie 树主要有两个操作,一个是将字符串集合构造成 Trie 树。这个过程分解开来的话,就是一个将字符串插入到 Trie 树的过程。另一个是在 ...
栈是一种操作受限的线性表数据结构,仅允许在一端插入或删除数据。栈中的数据后进者先出。 栈的实现 栈既可以用数组来实现,也可以用链表来实现。用数组实现的栈,我们叫作顺序栈,用链表实现的栈,我们叫作链式栈。如下是顺序栈的代码实现: // 基于数组实现的顺序栈 public class ArrayStack { private String[] items; // 数组 p...
跳表(skiplist)本质上是一种查找结构,用于解决算法中的查找问题(Searching),即根据给定的key,快速查到它所在的位置(或者对应的value)。 实现原理 对于一个单链表来讲,即便链表中存储的数据是有序的,如果我们要想在其中查找某个数据,也只能从头到尾遍历链表。这样查找效率就会很低,时间复杂度会很高,是 O(n)。假如我们每相邻两个节点增加一个指针,让指针指向下下...
如何理解递归 递归是一种应用非常广泛的算法(或者编程技巧),很多数据结构和算法的编码实现都要用到递归。举个生活中用到递归的例子,周末你带着女朋友去电影院看电影,女朋友问你,咱们现在坐在第几排啊?电影院里面太黑了,看不清,没法数,现在你怎么办?别忘了你是程序员,这个可难不倒你,递归就开始排上用场了。于是你就问前面一排的人他是第几排,你想只要在他的数字上加一,就知道自己在哪一排了。但是,前面的...