0%

字符串实现

redis中的字符串是一个可以修改的字符串,在内存中以字节数组的形式存在。如果不进行封装的话是使用strlen标准库函数来进行获取长度,该函数的算法复杂度是O(n),需要对字节数组进行遍历扫描,而redis是单线程的,这种程度的结构无法承受。redis封装了一个新的字符串结构SDS,结构是一个带长度信息的字节数组

源码结构

sds.h其内部使用的是SDS简单动态字符串,保存了长度信息,获取字符串长度只需要O(1)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
struct __attribute__ ((__packed__)) sdshdr5 {
// 存储了字符串的类型和长度,3位存类型,5位存长度
unsigned char flags; /* 3 lsb of type, and 5 msb of string length */
char buf[];
};
// 暂时应该是没有用到5的,只用到了8、16、32、64
struct __attribute__ ((__packed__)) sdshdr8 {
// header中进行存储len、alloc、flags
// 当前使用空间大小,即字符串的长度
uint8_t len; /* used */
// 去掉header和结尾空字符后的buf的总长度,就是已经分配空间的长度
uint8_t alloc; /* excluding the header and null terminator */
// 8位的标记,3位存类型,5位没有使用
unsigned char flags; /* 3 lsb of type, 5 unused bits */
// 数组进行存储
char buf[];
};
struct __attribute__ ((__packed__)) sdshdr16 {
uint16_t len; /* used */
uint16_t alloc; /* excluding the header and null terminator */
unsigned char flags; /* 3 lsb of type, 5 unused bits */
char buf[];
};
struct __attribute__ ((__packed__)) sdshdr32 {
uint32_t len; /* used */
uint32_t alloc; /* excluding the header and null terminator */
unsigned char flags; /* 3 lsb of type, 5 unused bits */
char buf[];
};
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[];
};

编码格式

编码 对象
OBJ_ENCODING_INT 使用整数值实现的字符串对象
OBJ_ENCODING_EMBSTR 使用embstr编码的简单动态字符串实现的字符串对象
OBJ_ENCODING_RAW 使用简单动态字符串实现的字符串对象

string有三种编码格式

  • int 整数值

  • embstr 用于存储短字符串的编码方式,字符串长度小于等于44字节使用,数据保存在一块连续的内存里

  • raw 字符串值长度大于44字节使用

embstr和raw两种编码的区别

embstr编码用于保存短字符串,与raw编码一样,都是使用redisObject结构和sdshdr结构来表示字符串对象,但是raw编码会调用两次内存分配函数来分别创建redisObject结构和sdshdr结构,两个对象在内存地址上是不连续的;而embstr编码则通过调用一次内存分配函数来分配一块连续的内存空间,空间中依次包含redisObject和sdshdr两个结构

Centos7更新gcc

问题的出现?

我在编译Python3.9.2时出现如下报错导致编译失败

1
2
3
4
5
6
7
8
9
10
11
12
Could not import runpy module
Traceback (most recent call last):
File "/home/work/zh/Python-3.9.2/Lib/runpy.py", line 15, in <module>
import importlib.util
File "/home/work/zh/Python-3.9.2/Lib/importlib/util.py", line 2, in <module>
from . import abc
File "/home/work/zh/Python-3.9.2/Lib/importlib/abc.py", line 17, in <module>
from typing import Protocol, runtime_checkable
File "/home/work/zh/Python-3.9.2/Lib/typing.py", line 21, in <module>
import collections
SystemError: <built-in function compile> returned NULL without setting an error
generate-posix-vars failed

去查了一下说可能是gcc版本过低导致的,Python3.9.2最少也要使用gcc5以上,最好是gcc8以上,而我的版本是4.8.5,本来想的挺简单的,就更一下gcc版本嘛

尝试一

1
sudo yum install gcc

然后显示4.8.5已是最新版本,我这是假的yum吗?

尝试二

那我安装整体工具包呢?

1
sudo yum groupinstall "Development Tools"

版本依然没变。

尝试三

更新下yum?

1
2
3
sudo yum update
# 然后在进行安装gcc
sudo yum install gcc

版本依然没变。

尝试四

好吧,那我指定版本总行了吧,我下载个9的

1
sudo yum install devtoolset-9-gcc devtoolset-9-gcc-c++ devtoolset-9-binutils

显示没有软件包

阅读全文 »

科一

高频考点总结

扣分题(新规重点)

看到车道3/6

  • 3分:不按规定车道
  • 6分:应急车道

看到逃逸6/12

  • 6分:轻微伤
  • 12分:轻伤以上

看到灯光1/3/6

  • 1分:不按规定
  • 3分:故障后不按规定
  • 6分:闯红灯

看到号牌3/9/12

  • 3分:不按规定安装(螺丝没拧紧)
  • 9分:未挂、污损、遮挡
  • 12分:伪造、变造、用其他号牌
阅读全文 »

GitHub总是连接超时的问题

更新Hosts文件

手动指定GitHub域名的最新IP地址:

  1. 获取最新IP

    • 访问 https://ipaddress.com/,查询以下域名的IP:
      1
      2
      3
      github.com
      assets-cdn.github.com
      github.global.ssl.fastly.net
  2. 修改Hosts文件

    • WindowsC:\Windows\System32\drivers\etc\hosts

    • Mac/Linux/etc/hosts

添加格式(示例):

1
140.82.113.4 github.com

redis管道

redis管道可以一次性发送多条命令并在执行完后一次性将结果返回,当一组命令中每条命令都不依赖于之前命令的执行结果时就可以将这组命令一起通过管道发出。

可以通过管道减少客户端与Redis的通信次数

域名更新通知

您好!我们的官方域名已更新为 zhhll.com.cn。 请收藏新域名以获取最佳访问体验。