TCL脚本语言光速入门教程,一篇就够了(超全查表)

Posted 牧海Movesea

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了TCL脚本语言光速入门教程,一篇就够了(超全查表)相关的知识,希望对你有一定的参考价值。

        

目录

引子:初见TCL

基本命令

置换命令

普通置换

变量置换

命令置换

反斜杠置换

其他置换

脚步命令

eval命令

source命令

语言命令

简单变量

数组变量

重构变量及其操作

补充概念

全局变量和局部变量

小结


        最近突然遇到了要用TCL脚本语言操作的需求,找资料的过程中发现资料都是零零散散的,再看完很多文档之后,重新归类整理了一下,个人认为整理的还是比较清晰,是先从较为简单和常用的置换命令开始分析,然后再到语言命令的使用,降低了入门的难度,也利于使用的时候查阅,最后也整理出了思维导图版本可供使用。

引子:初见TCL

        TCL(tool command language)用于描述脚本,仿真的网络环境和参数设置,也称“踢叩” "tickle"。我觉得他的语言思路和linux的终端命令有点像,基本就是操作符+变量这样子,省去了很多字符修饰。

        下面将介绍一下常用的命令集,以及遇到的常见问题,可以在目录中快速跳转,建议收藏一下方便速查~

基本命令

置换命令

        置换命令可以当作C语言中的赋值来理解,但是又有点不一样,因为这个置换不需要定义类型,可以直接赋值,所以引入了新的规则,来让机器知道每个字符或者数字到底需要做什么,可以按照下面的思路学习。

普通置换

set x 10
set y 100 + x    //命令执行后,y的值是“100 + x”而不是我们期望的110

        Tcl解释器在分析命令时,把所有的命令参数都当作字符串看待,所以x 被看作了字符串“100 + x”的一部分。如果我们想使用x的值'10' ,就必须告诉Tcl解释器:我们在这里期望的是变量x的值,而非字符'x'。怎么告诉Tcl解释器呢,这就要用到Tcl语言中提供的置换功能。置换可以发生在包括命令名在内的每一个单词中,而且置换可以嵌套。

变量置换

set x 10
set y 100 + $x   //这时,y的值还不是我们想要的值110,而是100+10

        变量置换由一个$符号标记,变量置换会导致变量的值而非变量(标识符)本身被插入到字符串中。因为Tcl解释器把10+100看成是一个字符串而不是表达式;y要想得到值110,还必须用命令置换,使得Tcl会把100+10看成一个表达式并求值。

命令置换

set x 10
set y [expr 100+$x]  //这时,y的值就是110了

        命令置换是由 [ ] 括起来的TCL命令及其参数,这里当Tcl解释器遇到字符' [ '时,它就会把随后的expr(下图解释)作为一个命令名,从而激活与expr对应的C/C++过程。命令置换会导致某一个命令的所有或部分单词(参数)被另一个命令的结果所代替,并把expr命令中变量置换后得到的'10+110'传递给该命令过程进行处理。注意,[ ]中必须是一个合法的Tcl脚本,长度不限。[ ]中脚本的值为最后一个命令的返回值。

         补充:expr 后面的两个参数接“比较符”,类似[a 比较 b ? a  :b],为运算符则为普通运算。

反斜杠置换

set msg multiple\\ space

        如果没有'\\'的话,Tcl会报错,因为解释器会把这里最后两个单词之间的空格认为是分隔符,于是发现set命令有多于两个参数从而报错。加入了'\\'后,空格不被当作分隔符,'multiple space'被认为是一个整体。【毕竟TCL语言没有 ; 的要求】

其他置换

        除了使用反斜杠外,Tcl提供双引号” “和花括号 ,使得解释器把分隔符和置换符等特殊字符当作普通字符而不作特殊处理。

but!不同的是:

  • TCL解释器对双引号“ ”中的各种分隔符将不作处理,但是对换行符及$和[]两种置换符会照常处理。
  • 而在花括号 中,所有特殊字符都将成为普通字符,失去其特殊意义,Tcl解释器不会对其作特殊处理

脚步命令

        这个没有太多的东西,常用的主要有两种命令(可以留言补充)

eval命令

eval arg arg ...

        接收一个或多个参数,然后把所有的参数以空格隔开组合到一起成为一个脚本,然后对这个脚本进行求值

source命令

source e:/tcl&c/hello.tcl(例子)

        读一个文件并把这个文件的内容作为一个脚本进行求值。注意路径的描述应该和UNIX相同,使用' / '而不是' \\ '


学完了上面的一些规则之后,下面还要完善一下常用的命令基础


语言命令

        虽然TCL语言有自己独特地用法,但是咱们最好还是按C\\C++语言中标识符的命名规则命名,这样不仅方便理解,也能减少冲突概率,有了上面的概念基础部分之后,语言命令这部分,咱们就由浅入深地聊聊~

简单变量

set a 2   //将2赋值给a
set a.1 5  //名字和值都可以是任何字符串
set b $a.1  //我们希望把变量a.1的值付给b,但是结果不是
set b $a.1  //强大的花括号,实现上一条的想法

        Tcl解释器在分析时只把 $ 符号之后直到第一个不是字母、数字或下划线的字符(这里是 '. ')之间的单词符号当作要被置换的变量的名字,所以TCL解释器把a置换成2,然后把字符串“2.1”付给变量b。这显然与我们的初衷不同。当然,如果变量名中有不是字母、数字或下划线的字符又要用变量置换,可以用花括号把变量名括起来。

数组变量

set day(monday) 1 
set day(tuesday) 2

        数组是一些元素的集合。TCL的数组和一般编程语言中的数组有很大的区别。在TCL中,不能单独声明一个数组,数组只能和数组元素一起声明。数组中数组元素的名字包含两部分:数组名和数组中元素的名字,Tcl中数组元素的名字(下标〕可以为任何字符串。

重构变量及其操作

fomat命令

set msg [format "%s is %d years old" $name $age]

        format命令类似于ANSIC中的sprintf函数,它按formatstring提供的格式,把各个value的值组合到formatstring中形成一个新字符串,并返回。

scan命令

scan "some 26 34" "some %d %d" a b

        scan命令可以认为是format命令的逆,其功能类似于C中的sscanf函数。它formatsting提供的格式分析string字符串,然后把结果存到变量varName中,注意除了空格和TAB键之外,string 和formatsting中的字符和'%'必须匹配。

string命令

string length string
string range string first last
string index string charIndex
string tolower string [first] [last]
string replace string first last [newstring]
string equal [-nocase] [-length int] string1 string2
string match [-nocase] pattern string  //如果pattern 匹配string,那么返回1,否则返回0.
string compare [-nocase] [-length int] string1 string2   //如果有 -length 参数,那么只比较前 int 个字符
string first string1 string2 [startindex]  //在string2 中从头查找与string1匹配的字符序列,如果找到,那么就返回匹配的第一个字母所在的位置(0-based)。如果没有找到,那么返回-1。
string trim string [chars]  //返回值为:从string字符串的首尾删除掉了字符集合chars中的字符后的字符串。如果没有给出chars,那么将删除掉spaces、tabs、newlines、carriage returns这些字符.

        string命令具有强大的操作字符串的功能,并通过其中的subcmd来区别具体将要执行的string操作。

list相关命令

list [ value value...]  //这个命令生成一个list,list的元素就是所有的value
concat list [list...]  //这个命令把多个list合成一个list
llength list  //返回list的元素个数
lindex list index  //返回list的第index个(0-based)元素
lrange list first last   //返回list的第first (0-based)到第last (0-based)元素组成的串,如果last的值是end。就是从第first个直到串的最后
linsert list index value [value...?]  //返回一个新串,新串是把所有的value参数值插入list的第index个(0-based)元素之前得到

 补充命令

         这一部分没有怎么用到过,但是为了方便查询,也给加上了,以后万一需要呢。

补充概念

全局变量和局部变量

        对于在过程中定义的变量,因为它们只能在过程中被访问,并且当过程退出时会被自动删除,所以称为局部变量;在所有过程之外定义的变量我们称之为全局变量。TCL中局部变量和全局变量可以同名,两者的作用域的交集为空:局部变量的作用域是它所在的过程的内部;全局变量的作用域则不包括任何过程的内部。这一点和C语言有很大的不同。如果我们想在过程内部引用一个全局变量的值,可以使用global命令。

缺省参数和可变参数

        可以定义具有缺省参数值的过程,我们可以为过程的部分或全部参数提供缺省值,如果调用过程时未提供那些参数的值,那么过程会自动使用缺省值赋给相应的参数。和C\\C++中具有缺省参数值的函数一样,有缺省值的参数只能位于参数列表的后部,即在第一个具有缺省值的参数后面的所有参数,都只能是具有缺省值的参数。

        TCL的过程定义还支持可变个数的参数,如果过程的最后一个参数是args, 那么就表示这个过程支持可变个数的参数,位于args以前的参数象普通参数一样处理,但任何附加的参数都需要在过程体中作特殊处理,过程的局部变量args将会被设置为一个列表,其元素就是所有附加的变量。如果没有附加的变量,args就设置成一个空串。

引用概念

upvar [level] otherVar myVar otherVar myVar ...

        upvar命令使得用户可以在过程中对全局变量或其他过程中的局部变量进行访问。upvar命令的第一个参数otherVar是我们希望以引用方式访问的参数的名字,第二个参数myVar 是这个过程中的局部变量的名字

proc temp  arg   upvar $arg b set b [expr $b+2]  
proc myexp  var   set a 4 temp a return [expr $var+$a] 
则: myexp 7 13

        一旦使用了upvar 命令把otherVar 和myVar 绑定,那么在过程中对局部变量myVar 的读写就相当于对这个过程的调用者中otherVar 所代表的局部变量的读写。这上面的例子中,upvar 把$arg(实际上是过程myexp中的变量a)和过程temp中的变量b绑定,对b的读写就相当于对a的读写。

upvar 2 other x

        upvar命令语法中的level参数表示:调用upvar命令的过程相对于我们希望引用的变量myVar在调用栈中相对位置,这个命令使得当前过程的调用者的调用者中的变量other,可以在当前过程中利用x访问。缺省情况下,level的值为1,即当前过程(上例中的temp)的调用者(上例中的myexp)中的变量(上例中myexp的a)可以在当前过程中利用局部变量(上例中temp的b)访问。

upvar #0 other x

        要访问全局变量可以这样写,不管当前过程处于调用栈中的什么位置,都可以在当前过程中利用x访问全局变量other。

小结

        一般来说,TCL语言是IC方向设计或者测试应用的一门重要语言,在linux/unix系统在上面写bash shell脚本程式也经常用到,想要学习和建立更好的测试环境,我们需要了解脚本中一些常用的语句和用法。虽然我现在用到的还不是很多,但是也先整理了下来,先大体学习一下,后面再逐步加深印象,不同语言和程序之间有很多思路都是相通的,多接触一门语言也会让我们的思维更加开阔。

        有些函数目前还没有用到,所以也不敢过多注释,后期会随着使用逐步完善,如果有需要调整的地方还请指正,不胜感激!

        最后是整理的一图速查版本,上传图片大小有限制qwq,如果看不清的话可以找我重新发给你,应该是基本都考虑到了

 

Redis从青铜到王者,从环境搭建到熟练使用,看这一篇就够了,超全整理详细解析

目录
一、常见的非关系型数据库NOSQL分类
二、了解Redis
三、Redis的单节点安装教程
四、Redis的常用命令
1、Help帮助命令
2、SET命令
3、过期命令
4、查找键命令
5、操作键命令
6、GET命令
7、步长命令
8、登录不同的库命令
9、清除当前库数据命令
10、清除所有库中的数据命令
五、BITMAP位图
1、位图常用命令
2、位操作命令
3、统计指定位区间上值为1的个数
六、Redis的数据模型
1、Redis的 key 键
2、Redis的 Value 值
1、String字符串
2、 List列表
3、 Hash散列
4、Set集合
5、SortedSet有序集合
七、Redis持久化
1、Redis持久化-RDB
(1)RDB使用策略
(2)SAVE命令
(3)BGSAVE命令
(4)SAVE 和 BGSAVE 命令的区别
(5)RDB持久化的优缺点
2、Redis持久化-AOF
(1)AOF写入机制
(2) 写入磁盘的策略
(3)AOF重写机制
(4)AOF重写触发
(5)AOF持久化的优缺点
八、idea使用Jedis连接Redis

一、常见的非关系型数据库NOSQL分类
点我返回目录

NOSQL类型 主要数据库产品 类型特色
K-V键值对存储类型 Redis、Memcached 使用key可以快速的查询到value,Memcached可以支持String类型的值value,Redis支持的值的数据类型很多如:String\\set\\hash\\sortset\\list等等
文档存储类型 MongoDB、CouchDB 使用JSON或类JSON的BSON数据结构,存储的内容为文档型,能够实现部分关系型数据库的功能
列存储类型 HBase、Cassandra 按照列进行数据存储,该类型便于存储结构化和半结构化的数据,可以方便做数据压缩和针对某一列或者某几列的数据查询
图存储类型 Neo4J、FlockDB 以图形关系存储数据,能够很好的弥补关系型数据库在图形存储时的不足
对象存储类型 Db4o、Versant 该存储类型的数据库通过类似面向对象的方式操作数据库,通过对象的方式存取数据
XML存储类型 Berkeley DB XML、BaseX 该类型数据库可以高效的存储XML数据,并且支持XML的内部查询语法,例如;XQuery、XPath
二、了解Redis
点我返回目录

Redis(Remote Dictionary Server ),即远程字典服务,是一个开源的(BSD协议)使用ANSI C语言编写,基于内存的且支持持久化,高性能的Key-Value的NOSQL数据库;Redis支持的数据结构类型很丰富,如 :字符串(strings), 散列(hashes), 列表(lists), 集合(sets), 有序集合(sorted sets) 以及范围查询, bitmaps(位图), hyperloglogs (超级日志)和 地理空间(geospatial) 索引半径查询等等。并且Redis有着丰富的支持主流语言的客户端,C/C++、Python、Erlang、R、C#、Java、PHP、Objective-C、Perl、Ruby、Scala、Go、JavaScript等;Redis 内置复制、Lua 脚本、LRU 驱逐、事务和不同级别的磁盘持久化,并通过 Redis Sentinel 和 Redis Cluster 自动分区提供高可用性;我们可以将Redis应用在缓存(StackOverFlow)、数据库、消息中间件等上。

Redis官网链接: https://redis.io/

三、Redis的单节点安装教程
点我返回目录

安装准备:Linux虚拟机:CentOS7、操作工具:Xshell 、Xftp
Redis安装包下载地址:https://download.redis.io/releases/

(1)、在安装Redis之前,我们需要先配置阿里云的yum源
下载配置文件

wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
1
生成缓存

yum makecache
1
(2)、安装Redis
1、因为Redis是使用ANSI C语言编写的,所以我们要先安装gcc依赖

yum install -y gcc-c++ gcc tcl
1
2、使用Xftp上传Redis压缩的安装包到Linux虚拟机并解压

上传的压缩包的路径,可以自己指定或创建上传的目录
小北是上传到了/usr/local/module/目录,然后解压到了/usr/local/soft/目录下

tar -xvf redis-3.0.0.tar.gz
1


3、进入解压好的目录redis-3.0.0,编译make

cd redis-3.0.0
1
make
1


下面shell命令是用于测试make的,可用可不用

make test
1
创建安装目录

这是小北的安装目录

mkdir -p /usr/local/soft/redis
1
2
3
安装

make PREFIX=/usr/local/soft/redis install
1


4、复制配置文件

cp /usr/local/soft/redis-3.0.0/redis.conf /usr/local/soft/redis/bin/
1
配置环境变量

vim /etc/profile
1
添加环境变量

export REDIS_HOME=/usr/local/soft/redis/
export PATH=$REDIS_HOME/bin
1
2
让环境变量修改生效

source /etc/profile
1
5、启动Redis

后台启动

cd /usr/local/soft/redis/bin
1
nohup redis-server redis.conf &
1


关闭redis的命令,要先获取Redis的进程号,杀死该进程

ps -aux | grep redis
1
kill -9
1
6、连接Redis

查看启动日志:

cat nohup.out
1

后台启动Redis

redis-cli
1


7、测试使用Redis

插入一条数据

set key1 value1
1
查询数据

get key1
1


四、Redis的常用命令
点我返回目录

1、Help帮助命令


2、SET命令
点我返回目录


(1)设置字符串值
命令使用格式:
SET key value [EX seconds] [PX milliseconds] [NX|XX]
注意:
EX 表示设置过期时间,单位:秒,等同于SETEX key seconds value
PX 表示设置过期时间,单位:毫秒,等同于PSETEX key milliseconds value
NX 表示键不存在,才能设置,等同于SETNX key value
XX 表示键存在时,才能设置

(2)设置多个键的字符串值
使用格式:
MSET key value [key value ...]

(3)当键不存在时,设置字符串值
MSETNX key value [key value ...]
注意:这是原子操作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18


3、过期命令
点我返回目录

Redis中可以给Key设置一个生存时间(秒或毫秒),当达到这个时长后,这些键值将会被自动删除。


(1)设置多少秒或者毫秒后过期
EXPIRE key seconds
PEXPIRE key milliseconds

(2)设置在指定Unix时间戳过期
EXPIREAT key timestamp
PEXPIREAT key milliseconds-timestamp

(3)删除过期
PERSIST key

(4)生存时间
Time To Live,指Key的剩余生存时间
(5)查看剩余生存时间
TTL key
PTTL key
key存在但没有设置TTL,返回-1
key存在,但还在生存期内,返回剩余的秒或者毫秒
key曾经存在,但已经消亡,返回-2(2.8版本之前返回-1)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21


4、查找键命令
点我返回目录

(1)查找键使用格式:
KEYS pattern

(2)pattern的取值
* 任意长度字符
? 任意一个字符
[] 字符集合,表示可以是集合中的任意一个

1
2
3
4
5
6
7
8


5、操作键命令
点我返回目录

(1)查看键的数据类型
TYPE key
(2)判断键是否存在
EXISTS key
(3)给键重命名
RENAME key newkey
RENAMENX key newkey 若键存在就rename
(4)删除键
DEL key [key ...]
1
2
3
4
5
6
7
8
9


6、GET命令
点我返回目录

(1)获取值
GET key

(2)获取多个给定的键的值
MGET key [key ...]

(3)返回旧值并设置新值
GETSET key value 如果键不存在,就创建并赋值

(4)获取字符串长度
STRLEN key

(5)追加字符串
APPEND key value
如果键存在就追加;如果不存在就等同于SET key value

(6)获取子字符串
GETRANGE key start end
索引值从0开始,负数表示从字符串右边向左数起,-1表示最有一个字符

(7)覆盖字符串
SETRANGE key offset value
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22


7、步长命令
点我返回目录

注意:只能对整形的数据进行步长操作

(1)步长1的增减
INCR key
DECR key
字符串值会被解释成64位有符号的十进制整数来操作,结果依然转成字符串

(2)步长增减,指定步长长度
INCRBY key decrement
DECRBY key decrement
字符串值会被解释成64位有符号的十进制整数来操作,结果依然转成字符串
1
2
3
4
5
6
7
8
9
10
11


8、登录不同的库命令
点我返回目录

redis-cli --help
redis-cli -n 2
1
2
9、清除当前库数据命令
点我返回目录

FLUSHDB
1
10、清除所有库中的数据命令
点我返回目录

FLUSHALL
1
五、BITMAP位图
点我返回目录

位图不是真正的数据类型,它是定义在字符串类型中的,我们知道一个字符串类型的值最多能存储512M字节的内容,其中位上限:2^(9+10+10+3) =2^32b

1、位图常用命令
点我返回目录

(1)设置某一位上的值
SETBIT key offset value
offset偏移量,从0开始
value不写,默认是0
(2)获取某一位上的值
GETBIT key offset
(3)返回指定值0或者1在指定区间上第一次出现的位置
BITPOS key bit [start] [end]
1
2
3
4
5
6
7
8

 

2、位操作命令
点我返回目录

对一个或多个保存二进制位的字符串 key 进行位元操作,并将结果保存到 dteskey 上

operation 可以是 AND 、 OR 、 NOT 、 XOR 这四种操作中的任意一种
BITOP AND destkey key [key …] ,对一个或多个 key 求逻辑并,并将结果保存到 destkey
BITOP OR destkey key [key …] ,对一个或多个 key 求逻辑或,并将结果保存到 destkey
BITOP XOR destkey key [key …] ,对一个或多个 key 求逻辑异或,并将结果保存到 destkey
BITOP NOT destkey key ,对给定 key 求逻辑非,并将结果保存到 destkey
除了 NOT 操作之外,其他操作都可以接受一个或多个 key 作为输入
当 BITOP 处理不同长度的字符串时,较短的那个字符串所缺少的部分会被看作 0
空的 key 也被看作是包含 0 的字符串序列
已知a和b的二进制表示:
a = 01100001
b = 01100010

都为1才为1
AND=》求逻辑并(与) 1 and 1->1 0 and 0->0 1 and 0->0
bitop and aband a b

有一个为1就为1
OR=》求逻辑或 1 or 1->1 0 or 0->0 1 or 0->1
bitop or abor a b

就是取反(反转)
NOT=》求逻辑非 not 0 ->1 not 1->0
bitop not anot a
bitop not bnot b

相同为0,相异为1
XOR=》求逻辑异或 0 xor 0->0 1 xor 1->0 1 xor 0->1
bitop xor abxor a b

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
3、统计指定位区间上值为1的个数
点我返回目录

使用格式1:
BITCOUNT key [start] [end]
从左向右从0开始,从右向左从-1开始,
注意:官方start、end是位,测试后是字节
使用格式2:
BITCOUNT testkey 0 0
表示从索引为0个字节到索引为0个字节,也就是指对第一个字节的统计
注意:
BITCOUNT testkey 0 -1 等同于BITCOUNT testkey

我们最常用的格式就是 BITCOUNT testkey
1
2
3
4
5
6
7
8
9
10
11


六、Redis的数据模型
点我返回目录

 

1、Redis的 key 键
点我返回目录

Redis的 key 值是二进制安全的,这意味着可以用任何二进制序列作为key值,从形如”foo”的简单字符串到一个JPEG文件的内容都可以。空字符串也是有效key值。

Key取值原则:

键值不需要太长,太长会消耗内存,且在数据中查找这类键值的计算成本较高
键值不宜过短,过短则可读性较差
2、Redis的 Value 值
点我返回目录

1、String字符串
点我返回目录

字符串是一种最基本的Redis值类型。Redis字符串是二进制安全的,这意味着一个Redis字符串能包含任意类型的数据;并且一个字符串类型的值最多能存储512M字节的内容。

2、 List列表
点我返回目录

List列表是基于Linked List实现的,列表中的元素是字符串类型;而列表的头尾增删速度快,中间增删速度慢,正常使用过程中增删元素是常态,列表中元素可以重复出现,并且列表中最多能包含2^32-1个元素;列表的索引,从左至右,从0开始;从右至左,从-1开始

(1)注意:
命令说明:
B --》block 块,阻塞
L --》left 左
R --》right 右
X --》exist 存在

1
2
3
4
5
6
7
(2)左右(或者头尾)压入元素
左(头)压入元素:
格式: LPUSH key value [value ...]
举例: LPUSHX key value

左(头)压入元素:
格式:RPUSH key value [value ...]
举例:RPUSHX key value
1
2
3
4
5
6
7
8


(3)左右(或者头尾)弹出元素(取出元素后,原先的位置就没有了)
LPOP key
RPOP key

(4)从一个列表尾部弹出元素压入到另一个列表的头部
RPOPLPUSH source destination

(5)返回列表中指定范围元素(返回元素后,原先的位置还有)
LRANGE key start stop
LRANGE key 0 -1 表示返回所有元素

(6)获取指定位置的元素
LINDEX key index

(7)设置指定位置元素的值
LSET key index value

(8)获取列表长度(元素个数)
LLEN key

(9)从列表头部开始删除值等于value的元素count次
LREM key count value
count > 0 : 从表头开始向表尾搜索,移除与 value 相等的元素,数量为 count
count < 0 : 从表尾开始向表头搜索,移除与 value 相等的元素,数量为 count 的绝对值
count = 0 : 移除表中所有与 value 相等的值

(10)去除指定范围外元素
LTRIM key start stop

(11)在列表中某个存在的值(pivot)前或后插入元素
LINSERT key BEFORE|AFTER pivot value
若key和pivot不存在,则不进行任何操作

(12)阻塞
如果弹出的列表不存在或者为空,就会造成阻塞
若超时时间设置为0,就是永久阻塞,直到有数据可以弹出
如果多个客户端阻塞在同一个列表上,那么使用First In First Service原则,先到先服务

(13)左右(或者头尾)阻塞弹出元素
BLPOP key [key ...] timeout
BRPOP key [key ...] timeout

(14)从一个列表尾部阻塞弹出元素压入到另一个列表的头部
BRPOPLPUSH source destination timeout
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
36
37
38
39
40
41
42
43
44
3、 Hash散列
点我返回目录

Hash散列是由field和关联的value组成的map键值对,而field和value都是字符串类型,一个hash中最多包含2^32-1键值对。

(1)设置单个字段
HSET key field value
HSETNX key field value
当在key的filed不存在的情况下执行,那么key不存在会直接创建

(2)设置多个字段
HMSET key field value [field value ...]

(3)返回字段个数
HLEN key

(4)判断字段是否存在
HEXISTS key field
key或者field不存在,返回0

(5)返回字段值
HGET key field

(6)返回多个字段值
HMGET key field [field ...]

(7)返回所有的键值对
HGETALL key

(8)返回所有字段名
HKEYS key

(9)返回所有值
HVALS key

(10)在字段对应的值上进行整数的增量计算
HINCRBY key field increment

(11)在字段对应的值上进行浮点数的增量计算
HINCRBYFLOAT key field increment

(12)删除指定的字段
HDEL key field [field ...]

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
36
37
38
39
1).使用Hash的优点

节约内存空间
每创建一个键,它都会为这个键储存一些附加的管理信息(例如这个键最后一次被访问的时间等等)所以数据库里面的键越多,Redis数据库服务器在储存附加管理信息方面耗费的内存就会越多,那么用在管理数据库键上的CPU也会越多,在字段对应的值上进行浮点数的增量计算。
2).不适合使用Hash的情况

使用二进制位操作命令:因为Redis目前支持对字符串键进行SETBIT、GETBIT、BITOP等操作,若要使用这些操作,那么只能使用字符串键,虽然散列也能保存二进制数据
使用过期键功能:Redis的键过期功能目前只能对键进行过期操作,而不能对散列的字段进行过期操作,因此如果你要对键值对数据使用过期功能的话,那么只能把键值对储存在字符串里面
4、Set集合
点我返回目录

Set集合内存储的元素是无序的、去重的,元素是字符串类型,最多包含2^32-1个元素

(1)增加一个或多个元素
SADD key member [member ...]
如果元素已经存在,则自动忽略

(2)移除一个或者多个元素
SREM key member [member ...]
元素不存在,自动忽略

(3)返回集合包含的所有元素
SMEMBERS key
如果集合元素过多,例如百万个,需要遍历,可能会造成服务器阻塞,生产环境应避免使用

(4)检查给定元素是否存在于集合中
SISMEMBER key member

(5)集合的无序性
SADD friends "java" "hadoop" "tomcat" "hive" "mapreduce" "spark"
SADD anotherfriends "java" "hadoop" "tomcat" "hive" "mapreduce" "spark"
SMEMBERS friends
SMEMBERS anotherfriends
注意:
SMEMBERS 有可能返回不同的结果,
如果需要存储有序且不重复的数据使用有序集合,存储有序可重复的使用列表

(6)随机返回集合中指定个数的
SRANDMEMBER key [count]
如果 count 为正数,且小于集合基数,
那么命令返回一个包含 count 个元素的数组,数组中的元素各不相同。
如果 count 大于等于集合基数,那么返回整个集合
如果 count 为负数,
那么命令返回一个数组,数组中的元素可能会重复出现多次,而数组的长度为 count 的绝对值
如果 count 为 0,返回空
如果 count 不指定,随机返回一个元素

(7)返回集合中元素的个数
SCARD key
键的结果会保存信息,集合长度就记录在里面,所以不需要遍历

(8)随机从集合中移除并返回这个被移除的元素
SPOP key

(9)把元素从源集合移动到目标集合
SMOVE source destination member

(10)求差集
SDIFF key [key ...],从第一个key的集合中去除其他集合和自己的交集部分
SDIFFSTORE destination key [key ...],将差集结果存储在目标key中

(11)求交集
SINTER key [key ...],取所有集合交集部分
SINTERSTORE destination key [key ...],将交集结果存储在目标key中

(12)求并集
SUNION key [key ...],取所有集合并集
SUNIONSTORE destination key [key ...],将并集结果存储在目标key中

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
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56

 

http://www.at-lib.com/108/80671.html
http://www.seojcw.com/108/13171.html
http://www.xsfcn.com/108/18820.html
http://twonders.com/108/25455.html
https://www.n360.cn/siteinfo/18541.html
https://www.kuaishouba.com/siteinfo/21616.html
http://www.mingdanwang.com/108/29013.html
http://www.yingfengba.com/xiuxian/21597.html
http://www.yvgu.cn/siteinfo/9916.html
http://www.5gba.com/SiteInfo.asp?SiteID=2064
http://www.xmyshyl.com/showinfo-108-22127-0.html
http://www.wpgood.cn/?mod=siteinfo&wid=9349
http://www.xun296.com/siteinfo-4862.html
https://www.hwhidc.com/siteinfo/3146.html
http://www.baidumulu.com/siteinfo-11512.html
http://www.zhizhan.net/siteinfo-10160.html
https://www.169zx.com/sitedir/2890.html
https://www.37274.com/siteinfo/4859.html
http://www.szeblog.cn/108/3790.html

https://hao123.cnease.cn/siteinfo/108732.html
https://www.7dadi.com/siteinfo/31521.html
http://www.shoulula.com/siteinfo/11363.html
https://www.xinzhandao.com/siteinfo/107477.html
http://www.119g.cn/showinfo-104-8854-0.html


5、SortedSet有序集合
点我返回目录

SortedSet有序集合与Set集合类似,它是有序的、去重的,元素是字符串类型,每一个元素都关联着一个浮点数分值(Score),并按照分值从小到大的顺序排列集合中的元素。其分值可以相同;最多包含2^32-1个元素。

(1)增加一个或多个元素
ZADD key score member [score member ...]
如果元素已经存在,则使用新的score

(2)移除一个或者多个元素
ZREM key member [member ...]
元素不存在,自动忽略

(3)显示分值
ZSCORE key member

(4)增加或者减少分值
ZINCRBY key increment member
increment为负数就是减少

(5)返回元素的排名(索引)
ZRANK key member

(6)返回元素的逆序排名
ZREVRANK key member

(7)返回指定索引区间元素
ZRANGE key start stop [WITHSCORES]
如果score相同,则按照字典序lexicographical order 排列
默认按照score从小到大,如果需要score从大到小排列,使用ZREVRANGE

(8)返回指定索引区间元素
ZREVRANGE key start stop [WITHSCORES]
如果score相同,则按照字典序lexicographical order 的 逆序 排列
默认按照score从大到小,如果需要score从小到大排列,使用ZRANGE

(9)返回指定分值区间元素(升序排序)
ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count]
返回score默认属于[min,max]之间,元素按照score升序排列,若score相同则按照字典排序
LIMIT中offset代表跳过多少个元素,count是返回几个。类似于Mysql
使用小括号,则修改区间为开区间,例如(5、(10、5)
-inf 和 +inf 分别表示负无穷和正无穷
http://www.sun0817.com/
(10)返回指定分值区间元素(降序排序)
ZREVRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count]
返回score默认属于[min,max]之间,元素按照score降序排列,score相同字典降序
LIMIT中offset代表跳过多少个元素,count是返回几个。类似于Mysql
使用小括号,修改区间为开区间,例如(5、(10、5)
-inf和+inf表示负无穷和正无穷

(11)移除指定排名范围的元素
ZREMRANGEBYRANK key start stop

(12)移除指定分值范围的元素
ZREMRANGEBYSCORE key min max

(13)返回集合中元素个数
ZCARD key

(14)返回指定范围中元素的个数
ZCOUNT key min max
ZCOUNT fruits 4 7
ZCOUNT fruits (4 7

(15)求并集
ZUNIONSTORE destination numkeys key [key ...] [WEIGHTS weight] [AGGREGATE SUM|MIN|MAX]
numkeys必须指定key的数量
WEIGHTS选项,与前面设定的key对应,对应key中每一个score都要乘以这个权重
AGGREGATE选项,指定并集结果的聚合方式
SUM:将所有集合中某一个元素的score值之和作为结果集中该成员的score值
MIN:将所有集合中某一个元素的score值中最小值作为结果集中该成员的score值
MAX:将所有集合中某一个元素的score值中最大值作为结果集中该成员的score值

(16)求交集
ZINTERSTORE destination numkeys key [key ...] [WEIGHTS weight] [AGGREGATE SUM|MIN|MAX]
numkeys指定key的数量,必须
WEIGHTS选项,与前面设定的key对应,对应key中每一个score都要乘以这个权重
AGGREGATE选项,指定并集结果的聚合方式
SUM:将所有集合中某一个元素的score值之和作为结果集中该成员的score值
MIN:将所有集合中某一个元素的score值中最小值作为结果集中该成员的score值
MAX:将所有集合中某一个元素的score值中最大值作为结果集中该成员的score值

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
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
七、Redis持久化
点我返回目录

Redis持久化是指将数据从掉电易失的内存存放到能够永久存储的设备上
Redis持久化两种方式:RDB(Redis DB) 和 AOF(AppendOnlyFile)

1、Redis持久化-RDB
点我返回目录

在默认情况下,Redis 将数据库快照保存在名字为 dump.rdb的二进制文件中

(1)RDB使用策略
点我返回目录

自动:按照配置文件中的条件满足就执行BGSAVE
save 60 10000,Redis要满足在60秒内至少有10000个键被改动,会自动保存一次
手动:客户端发起SAVE、BGSAVE命令
注意:RDB策略会容易造成数据丢失

(2)SAVE命令
点我返回目录

在redis 客户端使用 save命令用于将数据持久化的保存到disk(磁盘)中,但执行该命令时会阻塞Redis服务,无法响应客户端请求,也就是在服务器执行save命令期间,Redis服务器不允许执行其它的命令直到save命令执行完,执行save命令会创建新的dump.rdb替代旧文件。

(3)BGSAVE命令
点我返回目录

(该命令是在后台执行的,是一个异步命令)
在redis客户端 使用 bgsave命令时,不会阻塞Redis服务,也就是非阻塞,Redis服务正常接收处理客户端请求,并且Redis会folk()一个新的子进程来创建RDB文件,子进程处理完后会向父进程发送一个信号,通知它处理完毕,父进程用新的dump.rdb替代旧文件

(4)SAVE 和 BGSAVE 命令的区别
点我返回目录

SAVE不用创建新的进程,速度略快
BGSAVE需要创建子进程,消耗额外的内存
SAVE适合停机维护,服务低谷时段
BGSAVE适合线上执行
(5)RDB持久化的优缺点
点我返回目录

优点

完全备份,不同时间的数据集备份可以做到多版本恢复
紧凑的单一文件,方便网络传输,适合灾难恢复
恢复大数据集速度较AOF快
缺点

会丢失最近写入、修改的而未能持久化的数据
folk过程非常耗时,会造成毫秒级不能响应客户端请求
2、Redis持久化-AOF
点我返回目录

Append only file(AOF),该方式采用追加的方式保存数据,默认保存的文件appendonly.aof;该方式会记录所有的写操作命令,在服务启动的时候使用这些命令就可以还原数据库;调整AOF持久化策略,可以在服务出现故障时,不丢失任何数据,也可以丢失一秒的数据。相对于RDB方式损失要小得多

(1)AOF写入机制
点我返回目录

AOF方式不能保证绝对不丢失数据
目前常见的操作系统中,执行系统调用write函数,将一些内容写入到某个文件里面时,为了提高效率,系统通常不会直接将内容写入硬盘里面,而是先将内容放入一个内存缓冲区(buffer)里面,等到缓冲区被填满,或者用户执行fsync调用和fdatasync调用时才将储存在缓冲区里的内容真正的写入到硬盘里,而在未写入磁盘之前,数据可能会丢失。
(2) 写入磁盘的策略
点我返回目录

在redis.conf文件中的appendfsync选项,这个选项的值可以是always、everysec或者no

Always:服务器每写入一个命令,就调用一次fdatasync,将缓冲区里面的命令写入到硬盘。这种模式下,服务器出现故障,也不会丢失任何已经成功执行的命令数据
Everysec(默认):服务器每一秒重调用一次fdatasync,将缓冲区里面的命令写入到硬盘。这种模式下,服务器出现故障,最多只丢失一秒钟内的执行的命令数据
No:服务器不主动调用fdatasync,由操作系统决定何时将缓冲区里面的命令写入到硬盘。这种模式下,服务器遭遇意外停机时,丢失命令的数量是不确定的
运行速度:always的速度慢,everysec和no都很快

(3)AOF重写机制
点我返回目录

AOF文件过大
合并重复的操作,AOF会使用尽可能少的命令来记录
重写的过程

folk一个子进程负责重写AOF文件
子进程会创建一个临时文件写入AOF信息
父进程会开辟一个内存缓冲区接收新的写命令
子进程重写完成后,父进程会获得一个信号,将父进程接收到的新的写操作由子进程写入到临时文件中
新文件替代旧文件
注意:如果写入操作的时候出现故障导致命令写半截,可以使用redis-check-aof工具修复

(4)AOF重写触发
点我返回目录

手动:客户端向服务器发送BGREWRITEAOF命令
自动:配置文件中的选项,自动执行BGREWRITEAOF命令
auto-aof-rewrite-min-size < size >,触发AOF重写所需的最小体积:只要在AOF文件的体积大于等于size时,才会考虑是否需要进行AOF重写,这个选项用于避免对体积过小的AOF文件进行重写
auto-aof-rewrite-percentage < percent >,指定触发重写所需的AOF文件体积百分比:当AOF文件的体积大于auto-aof-rewrite-min-size指定的体积,并且超过上一次重写之后的AOF文件体积的percent %时,就会触发AOF重写。(如果服务器刚刚启动不久,还没有进行过AOF重写,那么使用服务器启动时载入的AOF文件的体积来作为基准值)。将这个值设置为0表示关闭自动AOF重写
举例:

auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb

当AOF文件大于64MB时候,可以考虑重写AOF文件
只有当AOF文件的增量大于起始size的100%时,
也就是文件大小翻了一倍时,启动重写
1
2
3
4
5
6
(5)AOF持久化的优缺点
点我返回目录

优点

写入机制,默认fysnc每秒执行,性能很好不阻塞服务,最多丢失一秒的数据
重写机制,优化AOF文件
如果误操作了(例如:FLUSHALL等),只要AOF未被重写,停止服务移除AOF文件尾部FLUSHALL命令,重启Redis,可以将数据集恢复到 FLUSHALL 执行之前的状态
缺点

相同数据集,AOF文件体积较RDB大了很多
恢复数据库速度叫RDB慢(文本,命令重演)

————————————————
版权声明:本文为CSDN博主「北慕辰」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

以上是关于TCL脚本语言光速入门教程,一篇就够了(超全查表)的主要内容,如果未能解决你的问题,请参考以下文章

Redis从青铜到王者,从环境搭建到熟练使用,看这一篇就够了,超全整理详细解析

2021超全大数据面试宝典,吐血总结十万字,大数据面试收藏这一篇就够了

2021超全大数据面试宝典,吐血总结十万字,大数据面试收藏这一篇就够了

Elasticsearch入门,看这一篇就够了

Elasticsearch入门,看这一篇就够了

C语言基础知识入门这一篇就够了