Redis使用笔记

1. Redis简介

​ Redis(Remote Dictionary Server - 远程字典服务)是一个由Salvatore Sanfilippo写的key - value存储系统。Redis是一个开源的使用ANSI C语言编写、遵守BSD协议、支持网络、可基于内存亦可持久化的日志型、key - value数据库,并提供多种语言的API。它通常被称为数据结构服务器,因为值可以是 字符串、哈希、 列表、集合和有序集合等类型。

在这里插入图片描述

1.1 特点

  • Redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用。
  • Redis不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据结构的存储。
  • Redis支持数据的备份,即master-slave模式的数据备份。

1.2 优势

  • 性能极高 – Redis能读的速度是110000次/s,写的速度是81000次/s 。
  • 丰富的数据类型 – Redis支持二进制案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets 数据类型操作。
  • 原子 – Redis的所有操作都是原子性的,意思就是要么成功执行要么失败完全不执行。单个操作是原子性的。多个操作也支持事务,即原子性,通过MULTI和EXEC指令包起来。
  • 丰富的特性 – Redis还支持 publish/subscribe, 通知, key 过期等等特性。

2. Redis安装

  • 下载地址:http://redis.io/download
  • 安装过程:解压缩即可

在这里插入图片描述

2.1 Redis服务端的启动

在这里插入图片描述

  • 出现Redis信息

在这里插入图片描述

2.2 Redis客户端的启动

在这里插入图片描述

  • 出现Redis端口信息

在这里插入图片描述

3. Redis命令

3.1 字符串类型

3.1.1 添加字符串

set key value
set key1 value1 key2 value2......

在这里插入图片描述

在这里插入图片描述

3.1.2 删除字符串

del key
del key1 del key2......

在这里插入图片描述

在这里插入图片描述

3.1.3 获取字符串

get key

在这里插入图片描述

3.2 哈希类型

3.2.1 添加哈希

hset key field value
hset key field1 value1 field2 value2......

在这里插入图片描述

在这里插入图片描述

3.2.2 删除哈希

hdel key field
hdel key field1 field2......

在这里插入图片描述

在这里插入图片描述

3.2.3 获取哈希

hget key field
hgetall key

在这里插入图片描述

在这里插入图片描述

3.3 列表类型

3.3.1 添加列表

# 将元素加入列表左边
lpush key value
lpush key value1 value2......

# 将元素加入列表右边
rpush key value
rpush key value1 value2......

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

3.3.2 删除列表

# 删除列表最左边元素并返回
lpop key

# 删除列表最右边元素并返回
rpop key

在这里插入图片描述

在这里插入图片描述

3.3.3 获取列表

# 获取列表所有元素
lrange key 0 -1

# 获取列表指定区域
lrange key start stop

在这里插入图片描述

在这里插入图片描述

3.4 集合类型

3.4.1 添加集合

sadd key value
sadd key value1 value2......

在这里插入图片描述

在这里插入图片描述

3.4.2 删除集合

srem key value
srem key value1 value2......

在这里插入图片描述

在这里插入图片描述

3.4.3 获取集合

smembers key

在这里插入图片描述

3.5 有序集合

3.5.1 添加有序集合

zadd key score value
zadd key score1 value1 score2 value2......

在这里插入图片描述

在这里插入图片描述

3.5.2 删除有序集合

zrem key value
zrem key value1 value2......

在这里插入图片描述

在这里插入图片描述

3.5.3 获取有序集合

# 获取有序集合的值
zrange key start end

# 获取有序集合的值和索引
zrange key start end withscores

在这里插入图片描述

在这里插入图片描述

4. Java连接

  • 依赖坐标
<dependency>
    <groupId>redis.clients</groupId>
    <artifactId>jedis</artifactId>
    <version>3.3.0</version>
</dependency>

4.1 Jedis连接

@Test
public void test01()
{
    // 根据IP和端口连接Redis
    Jedis jedis = new Jedis("127.0.0.1", 6379);
    // 打印对象地址
    System.out.println("jedis = " + jedis);
    // 关闭连接
    jedis.close();
}

在这里插入图片描述

4.2 Jedis连接池

@Test
public void test02()
{
    // 创建连接池配置对象
    JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
    // 设置连接池参数
    jedisPoolConfig.setMaxTotal(50);
    jedisPoolConfig.setMaxIdle(20);
    jedisPoolConfig.setMinIdle(5);
    // 创建连接池
    JedisPool jedisPool = new JedisPool(jedisPoolConfig, "127.0.0.1", 6379);
    // 通过连接池获取连接
    Jedis jedis = jedisPool.getResource();
    // 打印连接对象地址
    System.out.println("jedis = " + jedis);
    // 归还连接
    jedis.close();
    // 关闭连接池
    jedisPool.close();
}

在这里插入图片描述

4.3 字符串类型

@Test
public void test03()
{
    Jedis jedis = new Jedis("127.0.0.1", 6379);

    // 添加字符串
    String result1 = jedis.set("username", "root");
    System.out.println("result1 = " + result1);

    // 获取字符串
    String username = jedis.get("username");
    System.out.println("username = " + username);

    // 删除字符串
    Long result2 = jedis.del("username");
    System.out.println("result2 = " + result2);

    jedis.close();
}

在这里插入图片描述

4.4 哈希类型

@Test
public void test04()
{
    Jedis jedis = new Jedis("127.0.0.1", 6379);

    // 添加哈希
    Map<String, String> map = new HashMap<>();
    map.put("id", "2020092101");
    map.put("name", "zhouwei");
    map.put("age", "24");
    Long result1 = jedis.hset("map", map);
    System.out.println("result1 = " + result1);

    // 获取哈希
    String name = jedis.hget("map", "name");
    System.out.println("name = " + name);

    Map<String, String> mapResult = jedis.hgetAll("map");
    System.out.println("mapResult = " + mapResult);

    // 删除哈希
    Long reult2 = jedis.hdel("map", "id");
    System.out.println("reult2 = " + reult2);
    Long result3 = jedis.hdel("map", "name", "age");
    System.out.println("result3 = " + result3);
    
    jedis.close();
}

在这里插入图片描述

4.5 列表类型

@Test
public void test05()
{
    Jedis jedis = new Jedis("127.0.0.1", 6379);

    // 添加列表
    Long result1 = jedis.lpush("list", "java", "mysql", "android");
    System.out.println("result1 = " + result1);
    Long result2 = jedis.rpush("list", "java", "mysql", "android");
    System.out.println("result2 = " + result2);

    // 获取列表
    List<String> list = jedis.lrange("list", 0, -1);
    System.out.println("list = " + list);

    // 删除列表
    String result3 = jedis.lpop("list");
    System.out.println("result3 = " + result3);
    String result4 = jedis.rpop("list");
    System.out.println("result4 = " + result4);

    jedis.close();
}

在这里插入图片描述

4.6 集合类型

@Test
public void test06()
{
    Jedis jedis = new Jedis("127.0.0.1", 6379);

    // 添加集合
    Long result1 = jedis.sadd("set", "java", "mysql", "android");
    System.out.println("result1 = " + result1);

    // 获取集合
    Set<String> set = jedis.smembers("set");
    System.out.println("set = " + set);

    // 删除集合
    Long result2 = jedis.srem("set", "java", "mysql", "android");
    System.out.println("result2 = " + result2);

    jedis.close();
}

在这里插入图片描述

4.7 有序集合

@Test
public void test07()
{
    Jedis jedis = new Jedis("127.0.0.1", 6379);

    // 添加有序集合
    Long result1 = jedis.zadd("array", 0, "A");
    System.out.println("result1 = " + result1);
    Long result2 = jedis.zadd("array", 1, "B");
    System.out.println("result2 = " + result2);
    Long result3 = jedis.zadd("array", 2, "C");
    System.out.println("result3 = " + result3);

    // 获取有序集合
    Set<String> array = jedis.zrange("array", 0, -1);
    System.out.println("array = " + array);

    // 删除有序集合
    Long result4 = jedis.zrem("array", "A", "B", "C");
    System.out.println("result4 = " + result4);

    jedis.close();
}

在这里插入图片描述

5. Redis持久化

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

  • 持久化流程:

    1. 客户端向服务器发送写操作。(数据在客户端的内存中)
    2. 数据库服务端接收到请求的数据。(数据在服务端的内存中)
    3. 服务端调用write系统,将数据写入磁盘。(数据在系统内存缓冲区中)
    4. 操作系统将缓冲区中的数据转移到磁盘控制器上。(数据在磁盘缓存中)
    5. 磁盘控制器将数据写到磁盘的物理介质中。(数据持久化到磁盘)
  • redis为数据的持久化提供了两种机制,RDB和AOF策略。

  • RDB和AOF两种持久化策略的各种配置都保存在redis安装目录下的redis.windows.conf文件中。

5.1 RDB策略

​ RDB持久化策略是指在指定的时间间隔内将内存中的数据集快照写入磁盘,也是默认的持久化策略。它将内存中的数据以快照的方式写入二进制文件,默认的文件名为dump.rdb。对于RDB策略来说,它提供三种触发机制,save、bgsave和自动化。

  • 优点

(1)RDB文件紧凑,全量备份,非常适合用于进行备份和灾难恢复。

(2)生成RDB文件的时候,redis主进程会fork()一个子进程来处理所有保存工作,主进程不需要进行任何磁盘IO操作。

(3)RDB 在恢复大数据集时的速度比 AOF 的恢复速度要快。

  • 缺点

RDB快照是一次全量备份,存储的是内存数据的二进制序列化形式,存储上非常紧凑。当进行快照持久化时,会开启一个子进程专门负责快照持久化,子进程会拥有父进程的内存数据,父进程修改内存子进程不会反应出来,所以在快照持久化期间修改的数据不会被保存,可能丢失数据。

5.1.1 save触发机制

在这里插入图片描述

在这里插入图片描述

  • save命令会阻塞当前redis服务,执行save命令期间redis服务不能处理其他命令,直到RDB过程结束。
  • 执行完成的时候,如果存在RDB文件,就会用新的RDB文件进行替换。
  • 这种阻塞式的持久化方式不适合高并发访问。

5.1.2 bgsave触发机制

在这里插入图片描述

在这里插入图片描述

  • redis进程执行fork操作创建子进程,RDB持久化过程由子进程负责,完成后自动结束。
  • 阻塞只发生在fork阶段,一般时间很短,基本上redis内部所有的RDB操作都是采用bgsave命令。
  • 执行该命令时redis在后台进行异步操作,同时还可以响应客户端请求。

5.1.3 自动触发机制

​ 自动触发机制是由我们的配置文件来进行配置的,在redis安装目录下的redis.windows.conf文件进行描述,基本配置如下:

  • save:配置RDB触发条件,如save 900 1描述为900秒内有一个键的值发生改变就进行持久化。
  • stop-writes-on-bgsave-error:默认值为yes,当启用了RDB且最后一次后台保存数据失败,redis是否停止接收数据。
  • rdbcompression:默认值为yes,对存储到磁盘中的快照是否进行压缩存储。
  • rdbchecksum:默认值为yes,是否让redis使用CRC64算法来进行数据校验,但是这样做会增加大约10%的性能消耗,如果希望获取到最大的性能提升,可以关闭此功能。
  • dbfilename:默认值为dump.rdb,指定快照文件的名称。
  • dir:默认值为 ./,表示当前目录,用于指定快照文件存储位置。

在这里插入图片描述

5.2 AOF策略

​ 全量备份总是耗时的,有时候我们需要提供一种更加高效的方式。AOF工作机制很简单,redis会将每一个收到的写命令都通过write函数追加到文件中。通俗的理解就是日志记录。

在这里插入图片描述

  • 优点

(1)AOF可以更好的保护数据不丢失,通过一个后台线程执行一次fsync操作,最多丢失1秒钟的数据。

(2)AOF日志文件没有任何磁盘寻址的开销,写入性能非常高,文件不容易破损。

(3)AOF日志文件即使过大的时候,出现后台重写操作,也不会影响客户端的读写。

(4)AOF日志文件的命令通过非常可读的方式进行记录,这个特性非常适合做灾难性的误删除的紧急恢复。

  • 缺点

(1)对于同一份数据来说,AOF日志文件通常比RDB数据快照文件更大。

(2)AOF开启后,支持的写QPS会比RDB支持的写QPS低,因为AOF一般会配置成每秒fsync一次日志文件。

5.2.1 重写机制

​ AOF策略同时带来了一个问题,持久化文件会变得越来越大。为了压缩AOF的持久化文件,redis提供了bgrewriteaof命令。将内存中的数据以命令的方式保存到临时文件中,同时会fork出一个新的进程将文件重写。

在这里插入图片描述

5.2.2 触发机制

​ 通过编辑redis安装目录下的redis.windows.conf配置文件来进行AOF策略的配置,AOF提供三种触发机制,修改同步触发、每秒同步触发和从不触发,相关配置如下:

  • appendonly:默认值为 no,指定是否开启AOF持久化策略。
  • appendfsync:指定AOF持久化策略的触发机制,包括:always修改同步触发、everysec每秒同步触发和no从不触发三种机制。

5.3 策略选择

​ 选择的话,两者加一起才更好,根据两个持久化策略的特点看自己的需求,需求不同选择也不同,但是通常都是结合使用。具体参考下图:

在这里插入图片描述

6. 可视化工具

6.1 软件安装

下载地址:https://redisdesktop.com/

安装文件:redis-desktop-manager-0.8.8.384.exe

  • 打开安装文件

在这里插入图片描述

  • 同意使用协议

在这里插入图片描述

  • 选择安装目录

在这里插入图片描述

  • 等待安装

在这里插入图片描述

  • 安装过程结束

在这里插入图片描述

  • 程序安装完毕

在这里插入图片描述

6.2 连接服务

  • 开启软件界面

在这里插入图片描述

  • 填写连接信息进行测试

在这里插入图片描述

  • 显示连接成功

在这里插入图片描述

  • 连接建立成功

在这里插入图片描述

6.3 操作数据

6.3.1 添加数据

  • 打开添加数据界面

在这里插入图片描述

  • 填写数据信息

在这里插入图片描述

  • 添加成功

在这里插入图片描述

6.3.2 删除数据

在这里插入图片描述

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
本周我们使用 Redis 进行了一些实例操作,并进行了相关笔记记录。 首先,我们了解了 Redis 的基本概念和特点。Redis 是一种高性能的键值存储系统,它以内存为主存储方式,可以实现快速的读写操作,同时还提供了多种数据结构的支持,如字符串、哈希、列表、集合等,能够满足不同场景下的存储需求。 在实践中,我们首先进行了 Redis 的安装和配置。我们按照官方文档的指引,下载并安装了 Redis,然后对其进行了简单的配置,包括设置监听端口、配置密码等。同时,我们还学习了一些常用的命令,如 SET、GET、DEL 等,以及相关的配置文件参数的含义。 接着,我们进行了一些基本操作的练习。比如,我们通过命令向 Redis 中新增了一些键值对,并进行了查询和删除操作。我们还尝试了一些 Redis 的高级特性,如使用哈希结构存储和获取数据,并使用列表结构实现了简单的消息队列。 此外,我们还了解了 Redis 的持久化机制。Redis 提供了两种持久化方式,分别是 RDB(快照)和 AOF(追加式文件),可以将内存中的数据定期或根据日志保存到硬盘中,以防止数据丢失。 总结而言,本周我们对 Redis 进行了初步的学习和实践。我们了解了 Redis 的基本概念、安装配置以及常用操作命令,并进行了简单的实例操作。通过这些学习,我们对 Redis使用有了一定的了解,并在后续的工作中可以更好地应用它来解决实际问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值