ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

四、基础:数据库基础(mysql、redis等)【转】

2019-10-17 17:00:33  阅读:215  来源: 互联网

标签:name redis 基础 字段 key mysql test table


四、基础:数据库基础(mysql、redis等)

关系型数据库 

关系型数据库【第一篇】Mysql常用操作

mysql常用操作(测试必备)

 

阅读目录

现在互联网的主流关系型数据库是mysql,掌握其基本的增、删、改、查是每一个测试人员必备的技能。 

回到顶部

sql语言分类 

1、DDL语句(数据库定义语言): 数据库、表、视图、索引、存储过程,例如:CREATE、DROP、ALTER 

2、DML语句(数据库操纵语言): 插入数据INSERT、删除数据DELETE、更新数据UPDATE、查询数据SELECT 

3、DCL语句(数据库控制语言): 控制用户的访问权限GRANT、REVOKE 

回到顶部

操作库

我们可以把库看做是文件夹。

mysql自带的库:

information_schema: 虚拟库,不占用磁盘空间,存储的是数据库启动后的一些参数,如用户表信息、列信息、权限信息、字符信息等

performance_schema: MySQL 5.5开始新增一个数据库:主要用于收集数据库服务器性能参数,记录处理查询请求时发生的各种事件、锁等现象

mysql: 授权库,主要存储系统用户的权限信息

test: MySQL数据库系统自动创建的测试数据库

连接数据库,查看已有的数据库,show databases;

展示了已有的所有库(包含了我自己创建的数据库),如果只看到部分数据库,解决方案参考:https://www.cnblogs.com/UncleYong/p/10931195.html

创建库,指定编码,create database qzcsbj charset utf8; 

库的存放位置

show create database qzcsbj;

show databases;

查看当前所在的库

select database(); 

修改编码,alter database qzcsbj charset gbk;

drop database qzcsbj;

回到顶部

操作表及列

我们可以把表看做是文件

切换数据库(文件夹):use qzcsbj ;

查看当前所在数据库(文件夹):select database();

1 2 3 4 5 create table 表名(     字段名1 类型[(宽度) 约束条件],     字段名2 类型[(宽度) 约束条件],     字段名3 类型[(宽度) 约束条件] );

增加前,只有一个opt文件

create table test(id int, name varchar(255));

增加后,多了一个frm文件,frm是表结构

show create table test \G; # \G表示按行显示表的详细结构

show tables;

desc test; # 等价于describe test;

复制

insert test(id,name) values(1,'qzcsbj1'),(2,'qzcsbj2'),(3,'qzcsbj3');

复制表结构+记录:

  create table test2 select * from test;

只复制表结构:

  create table test3 select * from test where 1=2;

  或者:

  create table test4 like test;

1 2 3 4 5 6 7 8 9 10 11 12 13 ALTER TABLE 表名     # 修改表名       RENAME 新表名;      # 增加字段       ADD 字段名  数据类型 [完整性约束条件…];       ADD 字段名  数据类型 [完整性约束条件…]  FIRST; # 添加到第一个字段       ADD 字段名  数据类型 [完整性约束条件…]  AFTER 字段名;  # 添加到某个字段之后     # 删除字典       DROP 字段名;     # 修改字段       MODIFY  字段名 数据类型 [完整性约束条件…];       CHANGE 旧字段名 新字段名 旧数据类型 [完整性约束条件…];       CHANGE 旧字段名 新字段名 新数据类型 [完整性约束条件…];

MODIFY,可以改字段属性

CHANGE,可以改字段名、字段属性 

 

alter table test modify name varchar(256);

desc test;

alter table test change name NAME varchar(257);

desc test;

drop table test;

show tables;

回到顶部

操作记录

记录可以看做文件夹中文件的内容

全字段插入

1 INSERT INTO 表名(字段1,字段2,字段3…字段n) VALUES(值1,值2,值3…值n);  # into可以省略

多条数据逗号分隔

1 2 3 4 INSERT INTO 表名 VALUES         (值1,值2,值3…值n),         (值1,值2,值3…值n),         (值1,值2,值3…值n);

指定字段插入

1 INSERT INTO 表名(字段1,字段2,字段3…) VALUES (值1,值2,值3…);

插入查询结果  

1 2 INSERT INTO 表名(字段1,字段2,字段3…字段n)     SELECT (字段1,字段2,字段3…字段n) FROM 表2 WHERE …;

create table test(id int, name varchar(255));

insert test(id,name) values(1,'qzcsbj1'),(2,'qzcsbj2'),(3,'qzcsbj3');

select * from test;

如果在其它库查test,表前必须加库作为前缀。

select * from qzcsbj.test; 

1 2 3 UPDATE 表名 SET     字段1=1     WHERE 约束条件;

update test set name='qzcsbj' where id=2;

delete from test where id=3;

delete,用于删除数据,自增长字段的值未重置

truncate,用于清空表,自增长字段的值也被重置

 

注意:delete不能给表取别名

回到顶部

数据类型

数字

参考:https://www.runoob.com/mysql/mysql-data-types.html

日期类型

年:year

年月日:date

时分秒:time

年月日时分秒:datetime

1 2 3 4 5 6 7 8 create table student(     id int,     name char(6),   # 最大存储6个字符     born_year year,  # 年     birth_date date,  # 年月日     class_time time,  # 时分秒     reg_time datetime  # 年月日时分秒 );

插入数据

1 2 insert into student values(1,'jack',now(),now(),now(),now()); insert into student values(2,'tom',"2017","2017-12-12","12:12:12","2017-12-12 12:12:12");

now()是mysql提供的函数

 

字符类型

1 2 3 # 宽度指的是字符的个数 create table test(name char(5)); create table test(name varchar(5));

char:按指定长度存,存取速度快,但是当存的数据的长度小于字段定义的长度时浪费空间

varchar:存数据更精简,更加节省空间(是在存的数据的长度小于字段定义的长度时;否则必char浪费空间,因为多少了头,要花1个byte),缺点,存取速度慢,要先存头,再存数据;先取头,再取数据;

现如今,存储空间已经不是限制了,要追求存取速度,大部分用char,与查询无关的用varchar

建表的时候,定长的数据往前放,变长的往后放,而且,一张表中,不要char和varchar混用

枚举及集合类型

enum 单选,只能在给定的范围内选一个值,如性别

sex enum('male','female','other'),

set 多选,在给定的范围内可以选择一个或一个以上的值(爱好1,爱好2,爱好3...)

hobbies set('play','music','read','run')

1 2 3 4 5 6 drop table test;<br>create table test(   id int,   name char(16),   sex enum('male','female','other'),   hobbies set('play','music','read','run') );

插入 

insert into test values(1,'jack','male','music,read');  # 集合多个值用逗号分隔 

回到顶部

存储引擎

分类

1 2 3 4 5 6 7 1、InnoDB 存储引擎 2、MyISAM 存储引擎 3、NDB 存储引擎 4、Memory 存储引擎 5、Infobright 存储引擎 6、NTSE 存储引擎 7、BLACKHOLE

详见mysql性能调优篇。

回到顶部

约束

作用:保证数据的完整性和一致性

分类

1 2 3 4 5 6 PRIMARY KEY (PK),标识该字段为该表的主键,可以唯一的标识记录 FOREIGN KEY (FK),标识该字段为该表的外键 NOT NULL,标识该字段不能为空 UNIQUE KEY (UK),标识该字段的值是唯一的 AUTO_INCREMENT, 标识该字段的值自动增长(整数类型,而且为主键) DEFAULT, 为该字段设置默认值

primary key

#方法一:在某一个字段后用primary key

1 2 3 4 5 drop table test; create table test(   id int primary key,   name char(255) );

#方法二:not null+unique

创建表时未指定主键,会找不为空且唯一的字段作为主键

1 2 3 4 5 drop table test; create table test(   id int not null unique,   name char(255) ); 

#方法三:在所有字段后单独定义primary key

1 2 3 4 5 6 drop table test; create table test(   id int,   name varchar(255),   constraint pk_name primary key(id) );

foreign key

建立表之间的关系

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 create table student(     id int primary key,     name char(255),     age int );     # 关联的表 create table class(     id int primary key,     name char(255),     stu_id int,     foreign key(stu_id) references student(id)     on delete cascade   # 删除同步     on update cascade  # 修改同步 );

not null与default

1 2 3 4 5 drop table test;<br>create table test(     id int,     name char(255),     sex enum('male','female'not null default 'male' );

unique key

单列唯一:方式一

1 2 3 4 5 drop table test; create table test(     id int unique,     name char(255) unique );

单列唯一:方式二

1 2 3 4 5 6 7 drop table test; create table test(     id int,     name char(255),     unique(id),     unique(name) ); 

联合唯一

1 2 3 4 5 6 drop table test; create table test(     id int,     name char(255),     unique(id,name) );

复合主键

1 2 3 4 5 6 drop table test; create table test(   id int,   name char(255),   primary key(id, name) );

auto_increment

约束字段为自动增长,增长字段必须设置为key,primary key,unique key

1 2 3 4 5 drop table test; create table test(     id int primary key auto_increment,     name char(255) );
回到顶部

表与表之间的关系

一对一:身份证号与姓名

一对多:一个班级有多个学生

多对多:一个老师给多个班级授课,一个班级有多位授课老师

回到顶部

固定套路格式

一个单表复杂且完整的sql格式是如下的样子,如果是多表,加个join及连接条件就可以了,很简单。

1 2 3 4 5 6 7 select distinct 字段1,字段2,字段3  # 要查询的字段或者分组字段聚合函数 from 库.表 # 从哪个表查,如果当前所在的库不是这个表所在的库,表的前面需要加上库名 where  # 约束条件 group by  # 分组 having  # 过滤 order by  # 排序 limit  # 限制条数

select

select distinct 字段1,字段2,字段3 # 要查询的字段或者分组字段聚合函数

distinct

去重

from

from 库.表 # 从哪个表查,如果当前所在的库不是这个表所在的库,表的前面需要加上库名

where 

where是分组之前过滤,后面是普通条件

1 2 3 4 5 1.比较运算符:><>= <= <> != 2.逻辑运算符:在多个条件直接可以使用逻辑运算符 and or not 3.between 10 and 100 值在10100之间 4.in(80,90) 值是8090 5.like 'qzcsbj%',除了%还可以_,%表示任意多字符,_表示一个字符

group by

一般来说,“每”这个字后面的字段,就是我们分组的字段

having

having是分组之后过滤,后面是聚合条件

聚合函数(以组为单位进行统计)
max,最大
min,最小
avg,平均
sum,和
count,数量

order by

默认升序,asc

降序,desc

也可以先按某个字段升序,再按某个字段降序,例如:select * from test order by id asc, name desc;

limit

limit n,默认初始位置为0,从1开始取,取n条,如果不足n条记录,那么有多少条就取多少条

limit m,n,表示位置m,从m+1开始取,取n条记录,如果不足n条记录,那么有多少条就取多少条

回到顶部

执行顺序

1 2 3 4 5 6 7 5 select <br>6 distinct 1 from 库.表 2 where  3 group by  4 having  7 order by 8 limit
回到顶部

多表查询

我们不可能把数据都存在一个表中,而是存多个表中,这就涉及到多表查询了

交叉连接

生成笛卡尔积,不适用任何匹配条件。 

内连接

只取两张表的共同部分,join on

左外连接

显示左表全部记录,在内连接的基础上增加左边有右边没有的结果,left join on

右外连接

显示右表全部记录,在内连接的基础上增加右边有左边没有的结果,right join on

全外连接

显示左右两个表全部记录,在内连接的基础上增加左边有右边没有的和右边有左边没有的结果,

union,其与union all的区别是,union会去掉相同的纪录,另外,mysql不支持full join on

回到顶部

账号权限管理

创建新用户:CREATE USER 'test'@'localhost' IDENTIFIED BY '123456';

新用户授权:GRANT ALL PRIVILEGES ON *.* TO 'test'@'%'IDENTIFIED BY '123456' WITH GRANT OPTION;

1 2 3 4 5 6 7 8 授权(只能root操作) *.*  # 所有库下的所有表(以及表下的所有字段)都有权限 qzcsbj.*  # test库下的所有表(qzcsbj数据库下所有表,以及表下的所有字段) qzcsbj.test  # qzcsbj库下test表(某一张表,以及该表下的所有字段) columns_priv字段:id,name  # 字段(某一个或几个字段),grant select(id,name),update(name) on qzcsbj.test to 'test'@'localhost';   收回权限 revoke select on qzcsbj.test from 'test'@'localhost';

刷新授权:flush privileges;   

回到顶部

内置函数

(待补充)

数值函数

字符串函数

日期时间函数

流程控制函数

系统信息函数

回到顶部

索引

见性能优化篇 

回到顶部

python操作mysql

参考:https://www.cnblogs.com/UncleYong/p/10938993.html 

回到顶部

综合练习

设计表

表关系: 下面每个表的第一个字段是主键,未建立外键,使用逻辑外键

创建表

班级表

1 2 3 4 5 6 7 DROP TABLE IF EXISTS `class`; CREATE TABLE `class` ( `cid` int(11) NOT NULL AUTO_INCREMENT, `caption` varchar(255) NOT NULL, `grade_id` int(11) NOT NULL, PRIMARY KEY (`cid`) ) ENGINE=InnoDB AUTO_INCREMENT=16 DEFAULT CHARSET=utf8;

年级表

1 2 3 4 5 6 DROP TABLE IF EXISTS `class_grade`; CREATE TABLE `class_grade` ( `gid` int(11) NOT NULL AUTO_INCREMENT, `gname` varchar(255) NOT NULL, PRIMARY KEY (`gid`) ) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8;

课程表

1 2 3 4 5 6 7 DROP TABLE IF EXISTS `course`; CREATE TABLE `course` ( `cid` int(11) NOT NULL, `cname` varchar(255) NOT NULL, `teacher_id` int(11) NOT NULL, PRIMARY KEY (`cid`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; 

成绩表

1 2 3 4 5 6 7 8 DROP TABLE IF EXISTS `score`; CREATE TABLE `score` ( `sid` int(11) NOT NULL AUTO_INCREMENT, `student_id` int(11) NOT NULL, `course_id` int(11) NOT NULL, `score` varchar(255) DEFAULT NULL, PRIMARY KEY (`sid`) ) ENGINE=InnoDB AUTO_INCREMENT=20 DEFAULT CHARSET=utf8;

学生表

1 2 3 4 5 6 7 8 DROP TABLE IF EXISTS `student`; CREATE TABLE `student` ( `sid` int(11) NOT NULL AUTO_INCREMENT, `sname` varchar(255) NOT NULL, `gender` enum('女','男') NOT NULL DEFAULT '男', `class_id` int(11) NOT NULL, PRIMARY KEY (`sid`) ) ENGINE=InnoDB AUTO_INCREMENT=17 DEFAULT CHARSET=utf8;

老师表

1 2 3 4 5 6 DROP TABLE IF EXISTS `teacher`; CREATE TABLE `teacher` ( `tid` int(11) NOT NULL, `tname` varchar(255) DEFAULT NULL, PRIMARY KEY (`tid`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

班级任职表

1 2 3 4 5 6 7 DROP TABLE IF EXISTS `teacher2cls`; CREATE TABLE `teacher2cls` ( `tcid` int(11) NOT NULL AUTO_INCREMENT, `tid` int(11) NOT NULL, `cid` int(11) NOT NULL, PRIMARY KEY (`tcid`) ) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8; 

初始化数据

大家自己完成,这样可以熟悉表关系。

练习题

1.查询“生物”课程和“物理”课程成绩都及格的学生id和姓名;

2.查询每个年级的班级数,取出班级数最多的前三个年级;

3.查询每位学生的学号,姓名,选课数,平均成绩;

4.查询每个年级的学生人数;

(文末加群获取参考答案)

 


 

 

关系型数据库【第二篇】Oracle常用操作

 


 

 

非关系型数据库

redis【第一篇】常用操作

redis常用操作(测试必备)

 

阅读目录

回到顶部

连接redis

redis的安装及基础配置,参考:https://www.cnblogs.com/UncleYong/p/9882843.html

redis中,数据是key-value方式存储,key永远都是string类型,value可以是String、List、Set、Sorted-Sets、Hash。

连接redis服务器,默认是第一个数据库

默认有16个数据库,索引从0开始

切换到第二个数据库

切换到第一个数据库,显示所有的键key

命令不区分大小写,但key和value区分大小写

命令可以通过tab补全,补全的命令都是大写

回到顶部

String

set,设置键

get,获取键的值

exists,判断该键是否存在,存在返回1,不存在返回0

append,如果该键不存在,则创建,返回当前value的长度;如果该键已经存在,则追加,返回追加后value的长度

如果值有空格,需要加引号

strlen,获取key的长度

可以看到提示,有很多选项

EX和PX表示失效时间,单位为秒和毫秒,两者不能同时使用;

NX表示数据库中不存在时才能设置,XX表示存在时才能设置

ttl查看过期剩余时间,如果为-2表示已经过期

下面第二次set不成功

如果是一直不失效的,ttl的值是-1

flushdb,清空数据库

incr,递增1

decr,递减1

del,删除键

删除后,get不到值,但是可以进行incr和decr操作,是基于默认值为0进行操作

下面字符串不能转换为整型,所以报错

下面字符串能转换为整型

incrby,递增,可以设置步长 

不加步长报错

decrby,递减,可以设置步长 

getset,获取的同时并设置新的值

setex,设置过期时间

等同于set name jack ex 10

setnx,当key不存在时才能设置,等同于set name jack nx;如果key存在,就不能设置

setrange,设置指定索引位置的字符,索引从0开始

从索引为6的位置开始替换

超过的长度使用0代替

getrange,获取指定索引位置的字符,索引从0开始 

获取索引为[1,7]之间的内容,闭区间

setbit/getbit,设置/获取指定位的BIT值,应用场景:考勤打卡

设置从0开始计算的第七位BIT值为1,返回原有BIT值0

获取设置的结果,二进制的0000 0001的十六进制值为0x01

设置从0开始计算的第六位BIT值为1,返回原有BIT值0

获取设置的结果,二进制的0000 0011的十六进制值为0x03

返回了指定Offset的BIT值

如果offset已经超出了value的长度,则返回0 

mset,批量设置key

mget,批量获取

msetnx,批量设置key,如果key都不存在,执行成功并返回1;如果有一个key存在,执行失败并返回0。

key5没设置成功

 

回到顶部

List

是按照插入顺序排序的字符串链表

lpush
创建键test及与其关联的List,然后将参数中的values从左到右依次插入【看着从左往右放的栈】

可以通过type查看数据类型

lrange

获取从位置0开始到位置2结束的3个元素

获取链表中的全部元素,其中0表示第一个元素,­1表示最后一个元素

获取从倒数第3个到倒数第2个的元素

lpushx,表示键存在时才能插入

如果键不存在,命令将不会进行任何操作,其返回值为0

可以看到test2没有关联任何List Value

test键此时已经存在,所以该命令插入成功,并返回链表中当前元素的数量

获取该键的List中的第一个元素

lpop,取出链表头部的元素,该元素在链表中就已经不存在了 

llen,列表长度。在执行lpop命令两次后,链表头部的两个元素已经被弹出,此时链表中元素的数量是3

lrem,从头部(left)向尾部(right)操作链表,删除2个值等于a的元素,返回值为实际删除的数量

查看删除后链表中的全部元素

lindex,根据索引获取值

获取索引值为1(头部的第二个元素)的元素值

lset

将索引值为1(头部的第二个元素)的元素值设置为新值w

索引值6超过了链表中元素的数量,该命令返回nil

设置的索引值6超过了链表中元素的数量,设置失败,该命令返回错误信息

ltrim

仅保留索引值0到2之间的3个元素,注意第0个和第2个元素均被保留

linsert

在a的前面插入新元素a0

在e的后面插入新元素e2,从返回结果看已经插入成功

在不存在的元素之前或之后插入新元素,该命令操作失败,并返回­1

为不存在的Key插入新元素,该命令操作失败,返回0

rpush

从链表的尾部插入参数中给出的values,插入顺序是从右到左依次插入【看作是从右到左的栈】

rpushx

键已经存在并且包含5个元素,rpushx命令将执行成功,并将元素e插入到链表的尾部

rpop

从尾部(right)弹出元素,即取出元素

rpoplpush

创建test2

将test的尾部元素弹出,然后插入到test2的头部(原子性的完成这两步操作)

将source和destination设为同一键,将test中的尾部元素移到其头部

 

回到顶部

Set

没有排序的字符集合,Set集合中不允许出现重复的元素,和List类型相比,Sets之间可以聚合计算操作,如unions并、intersections交和differences差。

sadd

由于该键test之前并不存在,因此参数中的三个成员都被正常插入

smembers

查看集合中的元素,从结果可以,输出的顺序和插入顺序无关(无序的)

由于参数中的a在test中已经存在,因此本次操作仅仅插入了d和e两个新成员(不允许重复)

sismember

判断a是否已经存在,返回值为1表示存在

判断w是否已经存在,返回值为0表示不存在

scard

获取集合中元素的数量

srandmember

随机返回一个成员,成员还在集合中

spop

取出一个成员,成员会从集合中删除

srem

从Set中移出b、d和w三个成员,其中f并不存在,因此只有b和d两个成员被移出,返回为2

smove

将a从test移到test2,从结果可以看出移动成功

再次将a从test移到test2,由于此时a已经不是test的成员了,因此移动失败并返回0

sdiff

获取多个集合之间的不同成员,要注意匹配的规则
先将test和test2进行比较,a、b和d三个成员是两者之间的差异成员,然后再用这个结果继续和
test3进行差异比较,b和d是test3不存在的成员

sdiffstore

将3个集合的差异成员存储到与diffkey关联的Set中,并返回插入的成员数量

sinter

获取多个集合之间的交集,这三个Set的成员交集只有c

sinterstore

将3个集合中的交集成员存储到与intertest关联的Set中,并返回交集成员的数量

sunion

获取多个集合之间的并集

sunionstore

将3个集合中成员的并集存储到uniontest关联的set中,并返回并集成员的数量

回到顶部

Sorted-Sets

也称为Zset,每一个成员都会有一个分数(score)与之关联,Redis正是通过分数来为集合中的成员进行从小到大的排序(默认)。尽管Sorted­Sets中的成员必须是唯一的,但是分数(score)却是可以重复的。

zadd

添加一个分数为10的成员

添加两个分数分别是20和30的两个成员

zrange

通过索引获取元素,0表示第一个成员,­1表示最后一个成员。WITHSCORES选项表示返回的结果中包含每个成员及其分数,否则只返回成员

zcard

获取test键中成员的数量

zrank

获取成员在集合中的索引,索引从0开始

成员ddd并不存在,因此返回nil

zcount

获取符合指定条件的成员数量,分数满足表达式10 <= score <= 20的成员的数量

zrem

删除成员aaa和bbb,返回实际删除成员的数量

zscore

获取成员ccc的分数。返回值是字符串形式

由于成员aaa已经被删除,所以该命令返回nil

zincrby

将成员ccc的分数增加10,并返回该成员更新后的分数

将成员ccc的分数增加­-5,并返回该成员更新后的分数

zrangebyscore

通过分数获取元素,获取分数满足表达式10 <= score <= 20的成员

­inf表示第一个成员,+inf表示最后一个成员,limit后面的参数用于限制返回成员的数量,
limit 2 3,2表示从位置索引(0­-based)等于2的成员开始,取后面3个成员,成员不足就有多少显示多少,类似于MySQL中的limit

zremrangebyscore

根据分数删除成员,删除分数满足表达式10 <= score <= 20的成员,并返回实际删除的数量

zremrangebyrank

根据索引删除成员,删除索引满足表达式0 <= rank <= 1的成员 

zrevrange

按索引从高到低的方式获取成员(获取top10:zrevrange test 0 9)

由于是从高到低的排序,所以位置等于0的是ddd,1是ccc,并以此类推

zrevrangebyscore

按索引从高到低的方式根据分数获取成员,分数满足表达式30 >= score >= 10的成员

limit选项的含义等同于zrangebyscore中的该选项,只是在计算位置时按照相反的顺序计算和获取

zrevrank

获取成员aaa在集合中的索引,由于是从高到低的排序,所以aaa的位置是3

由于是从高到低的排序,所以ddd的位置是0

回到顶部

Hash

hset

给键为test的键设置字段为name,值为jack

hget

获取键为test,字段为name的值

test键中不存在age字段,因此返回nil

hlen

获取test键的字段数量

hexists

判断test键中是否存在字段名为city的字段,由于存在,返回值为1

hdel

删除test键中字段名为age的字段,删除成功返回1

再次删除test键中字段名为age的字段,由于上一条命令已经将其删除,因为没有删除,返回0

hsetnx

通过hsetnx命令给test添加新字段age,其值为18,因为该字段已经被删除,所以该命令添加成功并返回1

由于test的age字段已经通过上一条命令添加成功,因为本条命令不做任何操作后返回0

hincrby

给test的age字段的值加1,返回加后的结果

给test的age字段的值加-­1、-20,返回加后的结果

hmset

为该键test,一次性设置多个字段,分别是:name=jack,age=18

hmget

获取test键的多个字段,其中city并不存在,因为在返回结果中与该字段对应的值为nil

hgetall

返回test键的所有字段及其值,从结果中可以看出,他们是逐对列出的

hkeys

仅获取test键中所有字段的名字

hvals

仅获取test键中所有字段的值

 

回到顶部

Key操作命令

keys

根据参数中的模式,获取当前数据库中符合该模式的所有key,从输出可以看出,该命令在执行时并不区分与Key关联的Value类型

del

删除一个或多个key

删除了两个Keys

批量删除,其余参数:-h redis所在服务器ip

 

 

exists

如果存在,返回整数类型1,否则返回0

查看刚刚删除的Key是否还存在,从返回结果看,name确实已经删除了

查看一下没有删除的Key,以和上面的命令结果进行比较

move

将当前数据库中的testset键移入到ID为1的数据库中

rename

修改键的名称,将name改名为username,然后获取值只能通过新的键

renamenx

当新名称不存在时才会执行。由于mycity已经存在,因此该命令未能成功执行

ttl

将该键的超时设置为1000秒

通过ttl命令查看还剩多少秒

persist

立刻执行persist命令,该存在超时的键变成持久化的键,即将该Key的超时去掉;-1表示该键已经没有超时了

expire

设置该键的超时被1000秒;用ttl命令看当前还剩下多少秒,从结果中可以看出还剩下991秒

重新更新该键的超时时间为200秒,从返回值可以看出该命令执行成功;再用ttl确认一下,从结果中可以看出被更新了

立刻更新该键的值,以使其超时无效;从ttl的结果可以看出,在上一条修改该键的命令执行后,该键的超时也无效了

expireat

以 UNIX 时间戳(unix timestamp)格式设置 key 的过期时间

type

添加不同类型的测试数据

分别查看数据的类型

randomkey

返回数据库中的任意键

由于没有数据了,因此返回nil

flushdb

清空当前打开的数据库,不影响其它数据库

dbsize

返回当前数据库的key的数量

 

回到顶部

事务

Redis事务中如果有某一条命令执行失败,其后的命令仍然会被继续执行。

multi,标记事务的开始

exec,执行在一个事务内命令队列中的所有命令

discard,回滚事务队列中的所有命令,discard只能在exec前执行

在当前连接上启动一个新的事务

执行事务中的第一条命令,从该命令的返回结果可以看出,该命令并没有立即执行,而是存于事务的命令队列

又执行一个新的命令,从结果可以看出,该命令也被存于事务的命令队列

执行事务命令队列中的所有命令,从结果可以看出,队列中命令的结果得到返回

开启一个新的事务,设置键name的值为string类型的jack

从键name所关联的值的头部弹出元素,由于该值是字符串类型,而lpop命令仅能用于List类型,因此在执行exec命令时,该命令将会失败

再次设置键name的值为字符串

获取键name的值,以便确认该值是否被事务中的第二个set命令设置成功

从结果中可以看出,事务中的第二条命令lpop执行失败,而其后的set和get命令均执行成功,这一点是Redis的事务与关系型数据库中的事务之间最为重要的差别

为键city设置一个事务执行前的值;开启一个事务;在事务内为该键设置一个新值;放弃事务;查看键city的值,从结果中可以看出该键的值仍为事务开始之前的值

discard只能在exec前执行

 

参考:1.https://www.runoob.com/redis/redis-tutorial.html

      2.其它Q群分享的汤小洋笔记.pdf

 


 

 

redis【第二篇】主从配置

 


 

 

redis【第三篇】java、python及jmeter操作redis

java、python及jmeter操作redis(接口自动化必备)

 

阅读目录

redis是nosql数据库之一,其存储结构简单,提供高性能服务,所以在架构中是很常用的。

在做接口自动化测试过程中,有时也会涉及到redis,比如:发送短信验证码,我们做接口自动化测试,如何模拟发送短信验证码呢?

一般来说,短信验证码都是存储到redis中的,且有过期时间,我们完全可以直接往redis里面插入一个k-v来模拟发送短信验证码,所以,就得学会java、python及jmeter操作redis了。

回到顶部

java操作redis

创建项目

创建maven项目,添加依赖

1 2 3 4 5 6 <!-- https://mvnrepository.com/artifact/redis.clients/jedis --> <dependency>     <groupId>redis.clients</groupId>     <artifactId>jedis</artifactId>     <version>2.9.0</version> </dependency> 

连接redis

1 2 3 4 5 System.out.println("---连接redis---"); Jedis jedis = new Jedis("192.168.168.168",6379); jedis.auth("test123");  // redis数据库的密码 jedis.select(0);  // 哪怕注释这行,也没问题,因为默认就是选择的db0 jedis.flushDB(); 

string

1 2 3 4 System.out.println("\n---string---"); jedis.set("name","jack"); String name = jedis.get("name");  // 返回的string System.out.println("name: " + name);

结果:

---string---
name: jack

list

1 2 3 4 5 System.out.println("\n---list---"); jedis.lpush("testlist""aaa""bbb""ccc"); System.out.println(jedis.lrange("testlist",0,-1)); List<String> keys = jedis.lrange("testlist",0,-1);  // 返回的list System.out.println(keys);

结果:

---list---
[ccc, bbb, aaa]
[ccc, bbb, aaa]

set

1 2 3 4 5 System.out.println("\n---set---"); jedis.sadd("testset""a""b""c"); System.out.println(jedis.smembers("testset")); Set<String> keys2 = jedis.smembers("testset");  // 返回的set System.out.println(keys2);

结果:

---set---
[b, a, c]
[b, a, c]

zset

1 2 3 4 5 6 7 System.out.println("\n---zset---"); jedis.zadd("testzset",10,"aa"); jedis.zadd("testzset",20,"bb"); jedis.zadd("testzset",30,"cc"); System.out.println(jedis.zrange("testzset"0, -1)); Set<String> keys3 = jedis.zrange("testzset"0, -1);  // 返回的set System.out.println(keys3);

结果:

---zset---
[aa, bb, cc]
[aa, bb, cc]

hash

1 2 3 4 5 6 7 8 System.out.println("\n---hash---"); jedis.hset("testhash""name""lucy"); jedis.hset("testhash""age""18"); Set<String> keys4 = jedis.hkeys("testhash");  // 返回的set System.out.println(keys4); for (String key:keys4){     System.out.println(key+"="+jedis.hget("testhash",key)); }

结果:

[name, age]
name=lucy
age=18

获取所有key

1 2 3 System.out.println("\n---获取所有key---"); Set<String> keys5 = jedis.keys("*");  // 返回的set System.out.println(keys5);

结果:

---获取所有key---
[testlist, name, testzset, testhash, testset]

关闭连接

1 jedis.close();
回到顶部

python操作redis

参考:https://gitee.com/UncleYong/my_rf/blob/master/db_operate/redis_operate.py

回到顶部

jmeter操作redis

下载jar包,下载地址:https://mvnrepository.com/,获取点击左侧加群获取。

放到如下目录,即:D:\apache-jmeter-5.1.1\lib\ext

清空redis中db0

beanshell脚本

1 2 3 4 5 6 7 8 import redis.clients.jedis.Jedis;   Jedis jedis = new Jedis("192.168.168.168",6379);   jedis.auth("test123"); jedis.select(0); jedis.hset("mobile:13888088168","vefication","168168"); jedis.close();

运行上面脚本,然后通过命令查看添加的结果

更多redis命令,参考:https://www.cnblogs.com/UncleYong/p/10950727.html

 

 


 

mongodb【第一篇】mongodb常用操作

memcache【第一篇】memcache常用操作

 

 


 

 

 

==============================================

邮箱:zhanghanhaichuan@163.com

> > > 声明:部分转载、整理自网络,如有侵权,请联系删除。

==============================================

==============================================

 

标签:name,redis,基础,字段,key,mysql,test,table
来源: https://www.cnblogs.com/zhanghan123/p/11693181.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有