MyBatis的CRUD

根据ID查询

1.持久层接口添加fndById

1
User findById(Integer id);

2.在用户的映射配置文件中配置

细节:

resultType 属性:用于指定结果集的类型。

parameterType 属性:用于指定传入参数的类型。

sql语句中使用#{}字符: 它代表占位符,相当于原来 jdbc 部分所学的 **?**,都是用于执行语句时替换实际的数据。具体的数据是由#{}里面的内容决定的。

**#{}**中内容的写法:由于数据类型是基本类型,所以此处可以随意写。

1
2
3
<select id="findById" resultType="cn.hxx.domain.User" parameterType="Integer">
select * from user where id=#{uid};
</select>

添加操作

1.在持久层接口添加新增方法

1
void insertOneUser(User user);

2.在用户的映射配置文件中配置

细节:

parameterType 属性:代表参数的类型,因为我们要传入的是一个类的对象,所以类型就写类的全名称。

#{}中内容的写法:由于我们保存方法的参数是 一个 User 对象,此处要写 User 对象中的属性名称。它用的是 ognl 表达式。

新增用户之前用户ID为null,新增成功之后ID不为null

1
2
3
4
5
6
7
<insert id="insertOneUser" parameterType="cn.hxx.domain.User">
<!--新增用户后,同时还要返回当前新增用户的 id 值,因为 id 是由数据库的自动增长来实现的,所以 就相当于我们要在新增后将自动增长 auto_increment 的值返回。keyProperty对应类中属性, keyColumn对应表中名-->
<selectKey keyProperty="id" keyColumn="id" resultType="int" order="AFTER">
select last_insert_id();
</selectKey>
insert into user (username,address,sex,birthday) values (#{username},#{address},#{sex},#{birthday});
</insert>

更新操作

1.在持久层接口中添加更新方法

1
void deleteById(Integer id);

2.配置文件

1
2
3
<update id="updateUser" parameterType="cn.hxx.domain.User">
update user set username=#{username} where id=#{id};
</update>

删除操作

1.在持久层接口中添加删除方法

1
void deleteById(Integer id);

2.配置文件

1
2
3
<delete id="deleteById" parameterType="Integer">
delete from user where id=#{uid};
</delete>

模糊查询

1.在持久层接口中添加查询方法

1
List<User> findByName(String name);

2.配置文件

1
2
3
<select id="findByName" parameterType="String" resultType="cn.hxx.domain.User">
select * from user where username like #{name};
</select>

3.测试

1
List<User> users = userDao.findByName("%王%");

在控制台输出的语句是:

Preparing select *from user where username like ? 我们在配置文件中没有加入%来作为模糊查询的条件,所以在传入字符串实参时,就需要给定模糊查询的标识%。配置文件中的#{username}也只是一个占位符,所以 SQL 语句显示为“?”。

聚合函数

1.在持久层接口中添加聚合方法

1
int findTotal();

2.配置文件

1
2
3
<select id="findTotal" resultType="int">
select count(id) from user;
</select>

MyBatis和JDBC编程的比较

  1. 数据库链接创建、释放频繁造成系统资源浪费从而影响系统性能,如果使用数据库链接池可解决此问题。

解决:在 SqlMapConfig.xml 中配置数据链接池,使用连接池管理数据库链接。

  1. Sql 语句写在代码中造成代码不易维护,实际应用 sql 变化的可能较大,sql 变动需要改变 java 代码。

解决:将 Sql 语句配置在 XXXXmapper.xml 文件中与 java 代码分离。

  1. 向 sql 语句传参数麻烦,因为 sql 语句的 where 条件不一定,可能多也可能少,占位符需要和参数对应。

解决:Mybatis 自动将 java 对象映射至 sql 语句,通过 statement 中的 parameterType 定义输入参数的类型。

  1. 对结果集解析麻烦,sql 变化导致解析代码变化,且解析前需要遍历,如果能将数据库记录封装成 pojo 对

象解析比较方便。

解决:Mybatis 自动将 sql 执行结果映射至 java 对象,通过 statement 中的 resultType 定义输出结果的类型。

OGNL表达式

全称:Object Graphic Navigation Language

通过对象的取值方式来获取数据,在写法上把get省略了。比如,我们获取用户的名称,在类中:user.getUsername(); 在OGNL表达式写法:user.username。

#{user.username}它会先去找 user 对象,然后在 user 对象中找到 username 属性,并调用getUsername()方法把值取出来。但是我们在 parameterType 属性上指定了实体类名称,所以可以省略 user.,而直接写username。

#{}或者${}中的值为pojo属性名称

1
2
3
<update id="updateUser" parameterType="cn.hxx.domain.User">
update user set username=#{username} where id=#{id};
</update>

ResultMap结果集

resultMap 标签可以在查询的列名和实体类的属性名称不一致时,建立对应关系。从而实现封装。

在 select 标签中使用 resultMap 属性指定引用即可。同时 resultMap 可以实现将查询结果映射为复杂类型的pojo,比如在查询结果映射对象中包括 pojo 对象和 list 实现一对一查询和一对多查询

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<!-- resultMap 建立 User 实体和数据库表的对应关系
type 属性:指定实体类的全限定类名
id 属性:给定一个唯一标识,是给查询 select 标签引用用的。
-->
<resultMap type="cn.hxx.domain.User" id="userMap">
<!--
id 标签:用于指定主键字段
result 标签:用于指定非主键字段
column 属性:用于指定数据库列名
property 属性:用于指定实体类属性名称
-->
<id column="id" property="userId"/>
<result column="username" property="userName"/>
<result column="sex" property="userSex"/>
<result column="address" property="userAddress"/>
<result column="birthday" property="userBirthday"/>
</resultMap>

映射配置:原来的resultType修改为配置resultMap=”userMap”

1
2
3
<select id="findAll" resultMap="userMap">
select * from user
</select>

Mybatis概述和入门

MyBatis概述

mybatis 是一个优秀的基于 java 的持久层框架,它内部封装了 jdbc,使开发者只需要关注 sql 语句本身,而不需要花费精力去处理加载驱动、创建连接、创建 statement 等繁杂的过程。

mybatis 通过 xml 或注解的方式将要执行的各种 statement 配置起来,并通过 java 对象和 statement 中sql 的动态参数进行映射生成最终执行的 sql 语句,最后由 mybatis 框架执行 sql 并将结果映射为 java 对象并返回。

采用 ORM 思想解决了实体和数据库映射的问题,对 jdbc 进行了封装,屏蔽了 jdbc api 底层访问细节,使我们不用与 jdbc api 打交道,就可以完成对数据库的持久化操作。

​ ORM:Object Relational Mapping 对象关系映射,把数据库表和实体类的属性对应起来,通过操作实体类实现操作数据库。

JDBC问题分析

1、数据库链接创建、释放频繁造成系统资源浪费从而影响系统性能,如果使用数据库链接池可解决此问题。

2、Sql 语句在代码中硬编码,造成代码不易维护,实际应用 sql 变化的可能较大,sql 变动需要改变 java代码。

3、使用 preparedStatement 向占有位符号传参数存在硬编码,因为 sql 语句的 where 条件不一定,可能多也可能少,修改 sql 还要修改代码,系统不易维护。

4、对结果集解析存在硬编码(查询列名),sql 变化导致解析代码变化,系统不易维护,如果能将数据库记录封装成对象解析比较方便。

MyBatis入门案例—XML方式配置

第一步:创建maven工程并在pom.xml中导入坐标

1
2
3
4
5
6
7
8
9
10
11
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.6</version>
</dependency>

<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.22</version>
</dependency>

第二步:在src/main/java下创建实体类User和Dao的接口UserDao

1
2
3
4
5
6
7
8
9
10
11
12
13
/*实体类package cn.hxx.domain;*/
public class User {
private Integer id;
private String username;
private Date birthday;
private String sex;
private String address;
//省略get和set方法
}
/*用户的持久层接口package cn.hxx.Dao;*/
public interface UserDao {
List<User> findAll();
}

第三步:在src/main/resources下创建MyBatis的主配置文件 SqlMapConfig.xml

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
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<!--mybatis的主配置文件-->
<configuration>
<!--配置环境-->
<environments default="mysql">
<environment id="mysql">
<!--配置事务类型JDBC-->
<transactionManager type="JDBC"></transactionManager>
<!--配置数据源,即连接池-->
<dataSource type="POOLED">
<!--配置连接数据库的4个基本信息-->
<property name="driver" value="com.mysql.cj.jdbc.Driver"></property>
<property name="url" value="jdbc:mysql://localhost:3306/mybatis?serverTimezone=GMT%2B8"></property>
<property name="username" value="root"></property>
<property name="password" value="123456"></property>
</dataSource>
</environment>
</environments>

<!--指定映射配置文件的位置,映射配置文件指的是每个dao独立的配置文件-->
<mappers>
<mapper resource="cn/hxx/Dao/UserDao.xml"></mapper>
</mappers>
</configuration>

第四步:在src/mian/resources创建映射配置文件 UserDao.xml

1
2
3
4
5
6
7
8
9
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--namespace写接口的全类名,告诉mybatis这个配置文件是实现UserDao接口-->
<mapper namespace="cn.hxx.Dao.UserDao">
<!--配置查询所有,id是UserDao的方法名,resultType为告知要封装到哪个实体类中-->
<select id="findAll" resultType="cn.hxx.domain.User"> select * from user </select>
</mapper>

第五步 在test/java下编写测试文件MyBatisTest.java

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
package cn.hxx.test;

import cn.hxx.Dao.UserDao;
import cn.hxx.domain.User;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import java.io.IOException;
import java.io.InputStream;
import java.util.List;

public class MyBatisTest {
public static void main(String[] args) throws IOException {
//1.读取配置文件
InputStream in = Resources.getResourceAsStream("SqlMapConfig.xml");
//2.创建SqlSessionFactory工厂
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
SqlSessionFactory factory = builder.build(in);//这是一个接口,不能直接new
//3.使用工厂生产SqlSession对象
SqlSession session = factory.openSession();
//4.使用SqlSession创建Dao接口的代理对象
UserDao mapper = session.getMapper(UserDao.class);
//5.使用代理对象执行方法
List<User> userList = mapper.findAll();
for (User user : userList) {
System.out.println(user);
}
//6.释放资源
in.close();
session.close();
}
}

注意事项

  1. 在MyBatis中持久层的操作接口名称和映射文件也叫做mapper,所以创建的UserDao.xml和UserDao.java时,也有的会命名为UserMapper.xml UserMapper.java

  2. mybatis的映射配置文件位置必须和dao接口的包结构相同

  3. 映射配置文件的mapper标签namespace属性的取值必须是dao接口的全限定类名

  4. 映射配置文件的操作配置,id属性的取值必须是dao接口的方法名

MyBatis入门案例—注解方式配置

不需要UserDao.xml,需要在UseDao接口的方法上使用@Select注解,并且指定SQL语句。同时需要在SqlMapConfig.xml中的mapper配置时,使用class属性指定UseDao接口的全限定类名。

第一步:导入坐标

第二步:创建User和UserDao接口

1
2
3
4
5
/*用户的持久层接口*/
public interface UserDao {
@Select("select * from user")
List<User> findAll();
}

第三步:在src/main/resources下创建MyBatis的主配置文件 SqlMapConfig.xml,这里和上面XML配置方式的差距只有不需要指定映射配置文件的位置。

1
2
3
4
<!--映射配置文件指的是每个dao独立的配置文件-->
<mappers>
<mapper class="cn.hxx.Dao.UserDao"></mapper>
</mappers>

第四步:测试

测试案例MyBatisTest.java解析

maven集成tomcat7插件

1.集成tomcat7插件

https://tomcat.apache.org/maven-plugin.html 中有tomcat-maven-plugin,选择2.2版本进入https://tomcat.apache.org/maven-plugin-2.2/ 复制下面这段代码到pom.xml中,并添加一段配置代码,注意如果没有下载插件,不要放到pluginManagement标签下!!!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<plugins>
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat6-maven-plugin</artifactId>
<version>2.2</version>
</plugin>
<configuration>
<!--访问端口-->
<port>8000</port>
<!--访问项目前缀路径-->
<path>/SpringIOC</path>
<uriEncoding>UTF-8</uriEncoding>
<server>tomcat7</server>
</configuration>
</plugin>
</plugins>

点击load,进行加载,就会自动下载

加载成功后会显示tomcat,点击下面的命令就可以运行。

在浏览器中要自己输入URL,不支持从IDEA中自动进入页面

2.edit configuration

按照下面的操作执行,但是run可以方便使用,点击红色停止按钮应该不能完全中止程序,尽量使用tomcat:shutdown命令

3.快速书写tomcat 配置代码

完成上述操作后,在pom.xml中直接写tomcat7就可以快速生成代码

IDEA中maven创建servlet导入依赖

创建maven项目中,当需要添加servlet和jsp依赖,要在pom.xml文件中添加依赖声明。可以直接在中央仓库网址中复制:https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api/4.0.1(我选择了4.0.1版本,根据自己需要选择好进入下面这个页面)

将这段复制到pom.xml文件中,并进行load,此时会先在本地仓库寻找,(联网状态下)如果没有找到则自动会从这个中央仓库下载

在External Libraries中查看引入成功

在本地仓库文件中新增了jar包

IDEA开发maven项目

IDEA的maven设置

*打开—>File—->Settings 配置 maven**

设置runner下的VM option为-DarchetypeCatalog=internal

在IDEA中创建一个maven工程

1.选择 idea 提供好的 maven 的web 工程模板,也可以不选择

2.确认项目名称

3.确认maven配置

4.补充目录

5.标记为资源文件

6.其中App.java是默认写好可以运行

建立web的maven工程选择maven-archetype-webapp骨架即可

需要补充java目录,并将其标记为Sources root

maven原理

maven依赖管理

依赖管理:maven工程对jar包的管理过程

在运行传统web项目工程时,必须将该项目所依赖的一些jar包添加到工程中。当具有相同架构的项目不止一个,那么就需要赋值这份jar包到每一个工程中,那么其占用的空间就会很大。可重用性也很差。

maven开发的web项目jar包不在项目中,而是有一个专门的jar包仓库,而当每一个maven工程编译运行时,会通过jar包坐标找到对应jar包,提高代码可重用性。

maven一键构造

一个项目往往需要经历编译、测试、运行、打包、安装、部署等一系列过程。

构建:指的是项目从编译、测试、运行、打包、安装、部署整个过程都交给maven进行管理

一键构建:maven一个命令来完成整个工作,规范化构建流程:清理、编译、测试、报告、打包、部署

maven安装

  1. 下载

    下载地址:https://maven.apache.org/download.cgi

    下载 apache-maven-3.6.3-bin.zip

  2. 解压(不要由中文)

    bin目录下的mvn文件:用来构建项目

    boot目录下存放maven自身运行的类加载器

    conf目录下settings.xml对maven进行配置

    lib目录下maven自身运行依赖的jar包,继承了tomcat插件

  3. maven环境变量配置

    右击我的电脑—-》属性—–》高级系统设置—–》环境变量—–》

    • 系统变量中新建:变量名MAVEN_HOME,变量值maven解压后的目录,点击确定
    • 编辑系统变量的PATH:新建 %MAVEN_HOME%\bin
    • 注意在系统变量中有JAVA_HOME

    打开cmd命令窗口,运行mvn -v,可以看是否安装好maven

maven仓库种类和关系

在settings.xml中设置了默认的本地仓库路径:${user.home}/.m2/repository(C:\Users\用户\ .m2)

也可以自己设置本地仓库路径:<localRepository>设置路径</localRepository>

1
2
3
4
5
6
<!-- localRepository
| The path to the local repository maven will use to store artifacts.
|
| Default: ${user.home}/.m2/repository
<localRepository>/path/to/local/repo</localRepository>
-->

仓库分三类:本地仓库、远程仓库、中央仓库

​ 默认情况下:当启动maven工程时默认在上面的本地仓库路径中找jar包。如果电脑联网,本地找不到jar包,会自动从中央仓库下载jar包。

​ 在公司中:首先可以采用本地上传jar包的方式。中央仓库放置了几乎所有开源的jar包。实际开发中maven不会使用全部jar包,为了保证不联网的状况下可以开发项目,以及统一放置所需要的jar包,会再创建一个远程仓库(私服)。当远程仓库和自己的电脑在一个局域网下,就可以直接访问远程仓库下载jar包,若远程仓库没有所需要的jar包,会去中央仓库下载jar包。

maven项目标准目录

src/main/java:核心代码

src/main/resources:配置文件

src/test/java:测试代码

src/test/resources:测试配置

src/main/webapp:页面资源、js,css,图片等

maven生命周期

maven有三个生命周期:清除生命周期、默认生命周期、站点生命周期

清除生命周期:清楚项目编译信息 mvn clean

默认生命周期:编译(mvn compile)、测试(mvn test)、打包(mvn package)、安装(mvn install)、部署(mvn deploy)

maven概念模型

项目对象模型 (Project Object Model)

一个 maven 工程都有一个 pom.xml 文件,通过 pom.xml 文件定义项目的坐标、项目依赖、项目信息、

插件目标等。

依赖管理系统(Dependency Management System)

通过 maven 的依赖管理对项目所依赖的 jar 包进行统一管理。

比如:项目依赖 junit4.9,通过在 pom.xml 中定义 junit4.9 的依赖即使用 junit4.9

Jedis操作redis

  • jedis:Java操作redis数据库的工具
  • 下载两个jar包:commons-pool2-2.9.0.jar jedis-2.9.0.jar

jedis操作String

set(key,value)

get(key)

setex(key,time,value)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
@Test
public void test(){
//获取连接
Jedis jedis = new Jedis("127.0.0.1",6379);//如果使用空参构造,默认值localhost,6379
//操作数据库
jedis.set("username","hxx");
String username = jedis.get("username");
System.out.println(username);
//可以使用setex()方法,可以指定过期时间
//将activecode value键值对存入redis,并在10秒后删除
jedis.setex("activecode",20,"hehe");
//关闭数据库
jedis.close();
}

jedis操作hash

hset(key,field,value)

hget(key,field)

hgetAll(key)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
@Test
public void test1(){
//获取连接
Jedis jedis = new Jedis("127.0.0.1",6379);
//操作数据库
jedis.hset("user","name","hxx");
jedis.hset("user","age","20");
//获取hash
String name = jedis.hget("user", "name");
System.out.println(name);
//获取所有数据
Map<String, String> user = jedis.hgetAll("user");
Set<String> keySet = user.keySet();
for (String field : keySet) {
System.out.println(field+":"+user.get(field));
}
//关闭数据库
jedis.close();
}

jedis操作list

lpush/rpush

lpop/rpop

lrange start end

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
@Test
public void test2(){
//获取连接
Jedis jedis = new Jedis("127.0.0.1",6379);
//操作数据库
//存储 cbaabc
jedis.lpush("mylist","a","b","c");
jedis.rpush("mylist","a","b","c");
//范围获取
List<String> mylist = jedis.lrange("mylist", 0, -1);
System.out.println(mylist);

jedis.lpop("mylist");
jedis.rpop("mylist");

//关闭数据库
jedis.close();
}

jedis操作set

sadd

smembers:获取所有元素

1
2
3
4
5
6
7
8
9
10
11
@Test
public void test3(){
//获取连接
Jedis jedis = new Jedis("127.0.0.1",6379);
//操作数据库
jedis.sadd("myset","a","a","b");
Set<String> myset = jedis.smembers("myset");
System.out.println(myset);
//关闭数据库
jedis.close();
}

jedis操作sortedset

zadd

zrange

1
2
3
4
5
6
7
8
9
10
11
12
@Test
public void test4(){
//获取连接
Jedis jedis = new Jedis("127.0.0.1",6379);
//操作数据库
jedis.zadd("sortedset",3,"hxx");
jedis.zadd("sortedset",4,"qzy");
Set<String> myset = jedis.zrange("sortedset",0,-1);
System.out.println(myset);
//关闭数据库
jedis.close();
}

jedis连接池

创建连接池对象JedisPool

调用方法getReasource获取Jedis连接

1
2
3
4
5
6
7
8
9
10
11
12
@Test
public void test5(){
//创建配置对象
JedisPoolConfig config = new JedisPoolConfig();
config.setMaxTotal(2);//最大允许连接数

JedisPool jedisPool = new JedisPool(config,"127.0.0.1",6379);
JedisPool jedisPool1 = new JedisPool();
Jedis jedis = jedisPool.getResource();
//归还到连接池中
jedis.close();
}

jedis工具类

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
public class JedisBeanUtils {
private static JedisPool jedisPool;
static {
//读取配置文件
InputStream is = JedisBeanUtils.class.getClassLoader().getResourceAsStream("jedis.properties");
//创建Properties对象
Properties pro = new Properties();
try {
pro.load(is);//加载配置文件
} catch (IOException e) {
e.printStackTrace();
}
//创建jedis配置文件
JedisPoolConfig config = new JedisPoolConfig();
config.setMaxTotal(Integer.parseInt(pro.getProperty("maxTotal")));
config.setMaxIdle(Integer.parseInt( pro.getProperty("maxIdle")));
//传递给jedisPool
jedisPool = new JedisPool(config,pro.getProperty("host"), Integer.parseInt(pro.getProperty("port")));
}
/*获取连接方法*/
public static Jedis getJedis(){
return jedisPool.getResource();
}
}
@Test
public void test6(){
//工具类
Jedis jedis = JedisBeanUtils.getJedis();
jedis.set("name","hxx");
jedis.close();
}

redis持久化

  1. redis 是一个内存数据库,当redis服务器重启或者电脑重启后,数据会丢失,我们可以将redis内存中的数据持久化保存到硬盘的文件中

  2. redis持久化机制RDB:默认持久化方式,不需要进行配置。

    • 在一定的时间间隔中,检测key的变化情况,然后持久化数据到dump.rdb文件中

    • redis.windows.conf文件——->

      ​ #after 900 sec (15 min) if at least 1 key changed,15分钟后有一个key发生了变化

      ​ save 900 1

      ​ #after 300 sec (5 min) if at least 10 keys changed,在5分钟至少有十个key发生变化

      ​ save 300 10

      ​ #after 60 sec if at least 10000 keys changed,60秒后有一万个key发生变化
      ​ save 60 10000

    • 用cmd重新启动redis服务器,并指定配置文件名称

      ​ 在redis目录下执行redis-server.exe redis.windows.conf

  3. redis持久化机制AOF:日志记录的方式,可以记录每一条命令的操作。可以每一次命令操作后持久化数据到appendonly.aof

    • 编辑redis.windows.conf文件:appendonly no(关闭AOF) yes(开启AOF)

    ​ #appendfsync always:每一次操作都进行持久化

    ​ appendfsync everysec:每隔一秒操作一次

    ​ #appendfsync no:不进行持久化

redis命令操作

1.redis数据结构

  • redis存储:key-value,其中key都是字符串。

  • 目前为止redis支持的键值数据类型如下:

    字符串类型 String

    哈希类型 hash(map格式)

    列表类型 list

    集合类型 set,不允许重复元素

    有序集合类型 sortedset,不允许重复元素,自动排序

  • https://www.redis.net.cn/tutorial/3501.html,是redis命令教程

2.字符串类型String

存储:set key value

获取:get key

删除:del key

3.hash类型

存储:hset key field value

获取:hget key field

删除:hdel key field

1
2
3
4
hset myhash username hxx
hget myhash username
hdel myhash username
hgetall myhash

4.list列表类型

添加

  • lpush key value:将元素加入元素左边
  • rpush key value:将元素加入元素右边

获取

  • lrange key start end:范围取数

删除

  • lpop key:删除列表最左边的元素,并将元素返回
  • rpop key:删除列表最右边的元素,并将元素返回
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
127.0.0.1:6379> lpush mylist a
(integer) 1
127.0.0.1:6379> lpush mylist b
(integer) 2
127.0.0.1:6379> rpush mylist b
(integer) 3
127.0.0.1:6379> rpush mylist c
(integer) 4
127.0.0.1:6379> lrange mylist 0 -1
1) "b"
2) "a"
3) "b"
4) "c"
127.0.0.1:6379> lpop mylist
"b"
127.0.0.1:6379> rpop mylist
"c"

5.set

存储

  • sadd key value

获取

  • smembers key:获取set集合中所有元素

删除

  • srem key value:删除set集合中的某个元素
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
127.0.0.1:6379> sadd myset hxx
(integer) 1
127.0.0.1:6379> sadd myset hxx
(integer) 0
127.0.0.1:6379> sadd myset qzy
(integer) 1
127.0.0.1:6379> smembers myset
1) "qzy"
2) "hxx"
127.0.0.1:6379> sadd myset wn zyx
(integer) 2
127.0.0.1:6379> smembers myset
1) "zyx"
2) "wn"
3) "qzy"
4) "hxx"

6. sortedset

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

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

存储:zadd key score value

获取:zrange key start end

删除:zrem key value

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
127.0.0.1:6379> zadd mysort 60 hxx
(integer) 1
127.0.0.1:6379> zadd mysort 50 lisi
(integer) 1
127.0.0.1:6379> zadd mysort 80 wangwu
(integer) 1
127.0.0.1:6379> zrange mysort 0 -1
1) "lisi"
2) "hxx"
3) "wangwu"
(2.25s)
127.0.0.1:6379> zrange mysort 0 -1 withscores
1) "lisi"
2) "50"
3) "hxx"
4) "60"
5) "wangwu"
6) "80"
127.0.0.1:6379> zadd mysort 70 lisi
(integer) 0
127.0.0.1:6379> zrange mysort 0 -1 withscores
1) "hxx"
2) "60"
3) "lisi"
4) "70"
5) "wangwu"
6) "80"

7.通用命令

keys *:查看所有键名

type 键名:获取键对应的value的类型

del 键名:删除指定的key value