redis 的基本数据类型

Redis 是完全开源免费的,遵守BSD协议,是一个高性能的key-value数据库。

在 windows 下,通过命令行连接redis是用 redis-cli.exe

redis 的命令 可以参考 redis 中文网

String(字符串)

string是redis最基本的类型,你可以理解成与Memcached一模一样的类型,一个key对应一个value。

string类型是二进制安全的。意思是redis的string可以包含任何数据。比如jpg图片或者序列化的对象 。

string类型是Redis最基本的数据类型,一个键最大能存储512MB

127.0.0.1:6379> set name "hello redis"
OK
127.0.0.1:6379> get name
"hello redis"

Hash(哈希)

Redis hash 是一个键值对集合。

Redis hash是一个string类型的field和value的映射表,hash特别适合用于存储对象。

127.0.0.1:6379> HMSET user name codeon password 123456
OK

h表示hash的缩写

m表示multi的缩写

注意:命令的格式是 HMSET <键名> <field1> <value1> <field2> <value2> …

每个 hash 可以存储 232 – 1 键值对(40多亿)

List(列表)

Redis 列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素导列表的头部(左边)或者尾部(右边)。

127.0.0.1:6379> LPUSH domain baidu.com sougou.com
(integer) 2

命令格式: LPUSH <key> <value1> <value2> …

列表最多可存储 232 – 1 元素 (4294967295, 每个列表可存储40多亿)。

Set(集合)

Redis的Set是string类型的无序集合。

集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是O(1)。

zset(sorted set:有序集合)

Redis zset 和 set 一样也是string类型元素的集合,且不允许重复的成员。

不同的是每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序。

zset的成员是唯一的,但分数(score)却可以重复。

127.0.0.1:6379> ZADD user 1 user1
(integer) 1
127.0.0.1:6379> ZADD user 3 user3
(integer) 1
127.0.0.1:6379> ZADD user 2 user2
(integer) 1
127.0.0.1:6379> ZRANGEBYSCORE user 0 1000
1) "user1"
2) "user2"
3) "user3"

可与观察到 user 的顺序和插入的次数无关,由分数的大小从小到大进行排序。

ZeroTier 虚拟组网

ZeroTier 是一款即开即用的开源网络服务,它可以将不同物理地点的电脑、手机、网络设备,组成一个虚拟局域网,并拥有较高的安全性。而这些设备,就可以像在家中,或同一个办公室中一样。

直接使用官方的延迟比较高,测试是达到 300 – 500 ms。我当场就放弃了,后来发现可以自己搭建根服务器,有 Planet 和 moon 的区别。我的理解是

  • planet 就是根节点。
  • moon 就是用来加速国外节点的。

首先是搭建节点,有开源的 docker 容器,这是首选,并且配备了 UI 界面, nice

dockerhub https://hub.docker.com/r/keynetworks/ztncui

github https://github.com/key-networks/ztncui-aio

由于镜像没有提供使用说面,这里简单贴一下启动命令

docker run --restart=on-failure:3 -d --name ztncui -e HTTP_PORT=4000 -e HTTP_ALL_INTERFACES=yes -e ZTNCUI_PASSWD=123456 -p 4000:4000 keynetworks/ztncui

成功启动之后,访问 `4000` 端口就能看到 UI 界面了,可以先创建一个网络。

简单设置一下网络,可以直接生成。

开启自动分配 ipv4 地址

现在准备客户端加入到网络里,先试了下 windows 下的软件,很成功。

接下来准备测试一下 centos7 的环境下使用了。

直接使用 yum 安装时搜索不到了,要配置仓库地址

vim /etc/yum.repos.d/zerotier.repo
# 内容
[zerotier]
name=ZeroTier, Inc. RPM Release Repository
baseurl=http://download.zerotier.com/redhat/el/$releasever
enabled=1
gpgcheck=0
# 安装
yum install zerotier-one
# 启动守护线程
zerotier-one -d
# 加入网络
zerotier-cli join 18eexxxxxxxxxx

也可以使用这个命令安装

curl -s https://install.zerotier.com/  sudo bash 


如果没有启动守护线程,则报错 zerotier-cli: missing port and zerotier-one.port not found in /var/lib/zerotier-one

如果一切顺利的话,你应该看到控制台输出了 200 join OK

zerotier-cli 支持的命令

   info - 显示状态信息
   listpeers - 列出所有对等点
   peers - 列出所有对等点(更漂亮)
   listnetworks - 列出所有网络
   join <network ID> - 加入一个网络
   leave <network ID> - 离开一个网络
   set <network ID> <setting> - 设置网络设置
   get <network ID> <setting> - 获取网络设置
   listmoons - 列出卫星(联合根集)
   orbit <world ID> <seed> - 通过任何成员根加入月球
   deorbit <world ID> - 离开一个月亮
   dump - 调试设置转储以获得支持

使用 ifconfig 命令,可以看到一张额外的网卡信息

        zto2gfbdy4: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 2800
        inet 10.59.xxx.xxx  netmask 255.255.255.0  broadcast 10.59.205.255
        inet6 fe80::7c83:aff:fec0:2438  prefixlen 64  scopeid 0x20<link>
        ether 7e:83:0a:c0:24:38  txqueuelen 1000  (Ethernet)
        RX packets 27  bytes 3213 (3.1 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 8  bytes 656 (656.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

尝试 ping

64 bytes from 10.123.107.30: icmp_seq=6 ttl=64 time=275 ms
64 bytes from 10.123.107.30: icmp_seq=7 ttl=64 time=275 ms
64 bytes from 10.123.107.30: icmp_seq=8 ttl=64 time=275 ms
64 bytes from 10.123.107.30: icmp_seq=9 ttl=64 time=275 ms
64 bytes from 10.123.107.30: icmp_seq=10 ttl=64 time=275 ms

scp 速度: 100% 4198KB 119.5KB/s 00:35 8

。。。。 网速 100kb 演示 300ms

SpringBoot 数据校验

  JSR(Java Specification Requests)是Java界的重要标准;JSR又细分很多标准,其中JSR303就代表Bean Validation。

如果你用的 Spring Boot 版本小于 2.3.x,spring-boot-starter-web 会自动引入 hibernate-validator 的依赖。如果 Spring Boot 版本大于 2.3.x,则需要手动引入依赖:

<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-validation</artifactId>
</dependency>

上面依赖使用 @Valid 注解

@Validated与@Valid区别

  • @Validated:可以用在类型、方法和方法参数上。但是不能用在成员属性(字段)上,不支持嵌套检测
  • @Valid:可以用在方法、构造函数、方法参数和成员属性(字段)上,支持嵌套检测

注解功能
@AssertFalse可以为null,如果不为null的话必须为false
@AssertTrue可以为null,如果不为null的话必须为true
@DecimalMax设置不能超过最大值
@DecimalMin设置不能超过最小值
@Digits设置必须是数字且数字整数的位数和小数的位数必须在指定范围内
@Future日期必须在当前日期的未来
@Past日期必须在当前日期的过去
@Max最大不得超过此最大值
@Min最大不得小于此最小值
@NotNull不能为null,可以是空
@Null必须为null
@Pattern必须满足指定的正则表达式
@Size集合、数组、map等的size()值必须在指定范围内
@Email必须是email格式
@Length长度必须在指定范围内
@NotBlank字符串不能为null,字符串trim()后也不能等于“”
@NotEmpty不能为null,集合、数组、map等size()不能为0;字符串trim()后可以等于“”
@Range值必须在指定范围内
@URL必须是一个URL