Redis的安装使用

@Test
    public void testKey() throws Exception {
        //创建客户端指定连接服务器端主机ip和端口,端口不指定时默认使用6379
        Jedis jedis = new Jedis("192.168.192.128", 6379);
        System.out.println("连接redis服务器端成功!");
        //登录验证
        jedis.auth("1234");

        jedis.set("name", "zhangsan");//加入数据
        System.out.println("获取key对应的值:"+jedis.get("name"));
        Set keys = jedis.keys("*");//使用通配符进行模糊查询
        System.out.println("获取所有key的值:"+keys);
        //关闭连接
        jedis.close();
    }

10.5 List测试

@Test
    public void testList() throws Exception {
        //创建客户端指定连接服务器端主机ip和端口,端口不指定时默认使用6379
        Jedis jedis = new Jedis("192.168.192.128", 6379);
        System.out.println("连接redis服务器端成功!");
        //登录验证
        jedis.auth("1234");

        jedis.lpush("list", new String[] {"a","c","b"});//添加数据
        Long len = jedis.llen("list");//获取长度
        System.out.println("list长度:"+len);
        System.out.println("list元素:"+jedis.lrange("list", 0, len));
        System.out.println("指定索引位置的元素:"+jedis.lindex("list", 1));

        //关闭连接
        jedis.close();
    }

10.6 Hash测试

@Test
    public void testHash() throws Exception {
        //创建客户端指定连接服务器端主机ip和端口,端口不指定时默认使用6379
        Jedis jedis = new Jedis("192.168.192.128", 6379);
        System.out.println("连接redis服务器端成功!");
        //登录验证
        jedis.auth("1234");
        //添加数据
        jedis.hset("user", "id", "1");
        jedis.hset("user", "name", "zhangsan");
        jedis.hset("user", "password", "123456");
        //获取所有元素
        Map user = jedis.hgetAll("user");
        System.out.println("获取hash的所有字段值:"+user);

        //关闭连接
        jedis.close();
    }

10.7 Set测试

@Test
    public void testSet() throws Exception {
        //创建客户端指定连接服务器端主机ip和端口,端口不指定时默认使用6379
        Jedis jedis = new Jedis("192.168.192.128", 6379);
        System.out.println("连接redis服务器端成功!");
        //登录验证
        jedis.auth("1234");
        //添加数据
        jedis.sadd("set1",new String[] {"a","s","d","f","g"});
        jedis.sadd("set2", new String[] {"a","s","z","x"});
        //获取所有元素
        Set set1 = jedis.smembers("set1");
        System.out.println("获取set的所有元素:"+set1);

        System.out.println("获取元素数量:"+jedis.scard("set1"));

        //获取交并补集,方法参数是可变的
        Set inter = jedis.sinter("set1","set2");
        System.out.println("获取交集:"+inter);
        Set union = jedis.sunion("set1","set2");
        System.out.println("获取并集:"+union);
        Set diff = jedis.sdiff("set1","set2");
        System.out.println("获取差集:"+diff);

        //关闭连接
        jedis.close();
    }

10.8 SortedSet测试

@Test
    public void testSortedSet() throws Exception {
        //创建客户端指定连接服务器端主机ip和端口,端口不指定时默认使用6379
        Jedis jedis = new Jedis("192.168.192.128", 6379);
        System.out.println("连接redis服务器端成功!");
        //登录验证
        jedis.auth("1234");

        //添加数据
        Map scoreMembers = new HashMap<>();
        scoreMembers.put("a", 1d);
        scoreMembers.put("b", 3d);
        scoreMembers.put("c", 2d);
        jedis.zadd("sortSet", scoreMembers);
        //获取数据
        //获取分数值在指定区间的元素并按分数值由小到大排序
        Set zrange = jedis.zrange("sortSet", 0, 3);
        System.out.println(zrange);

        //关闭连接
        jedis.close();
    }

11.Redis持久化

Redis持久化,就是将内存中的数据,永久保存到磁盘上。

Redis持久化有两种方式:RDB(Redis DB)、AOF(AppendOnlyFile)。

11.1 RDB(快照模式)

在默认情况下,Redis 将数据库快照保存在名字为dump.rdb的二进制文件中,可以在redis.conf配置文件中修改持久化信息。

save 900 1 表示在900秒内,至少更新了1条数据。Redis就将数据持久化到硬盘

save 300 10 表示在300内,至少更新了10条数据,Redis就会触发将数据持久化到硬盘

save 60 10000 表示60秒内,至少更新了10000条数据,Redis就会触发将数据持久化到硬盘

11.1.1 策略

1.自动:BGSAVE

按照配置文件中的条件满足就执行BGSAVE;非阻塞,Redis服务正常接收处理客户端请求;

Redis会folk()一个新的子进程来创建RDB文件,子进程处理完后会向父进程发送一个信号,通知它处理完毕,父进程用新的dump.rdb替代旧文件。

2.手动:SAVE

由客户端(redis-cli)发起SAVE命令;阻塞Redis服务,无法响应客户端请求;创建新的dump.rdb替代旧文件。

11.1.2 优点

1.执行效率高;

2.恢复大数据集速度较AOF快。

11.1.3 缺点

1.会丢失最近写入、修改的而未能持久化的数据;

2.folk过程非常耗时,会造成毫秒级不能响应客户端请求。

11.2 AOF(追加模式、文本重演)

AOF(Append only file),采用追加的方式保存,默认文件appendonly.aof。记录所有的写操作命令,在服务启动的时候使用这些命令就可以还原数据库。AOF默认关闭,需要在配置文件中手动开启。

11.2.1 写入机制

说明:AOF机制,添加了一个内存缓冲区(buffer)。

1.将内容写入缓冲区

2.当缓冲区被填满、或者用户手动执行fsync、或者系统根据指定的写入磁盘策略自动调用fdatasync命令,才将缓冲区里的内容真正写入磁盘里。

3.在缓冲区里的内容未写入磁盘之前,可能会丢失。

11.2.2 写入磁盘的策略

appendfsync选项,这个选项的值可以是always、everysec或者no

Always:服务器每写入一个命令,就调用一次fdatasync,将缓冲区里面的命令写入到硬盘。这种模式下,服务器出现故障,也不会丢失任何已经成功执行的命令数据

Everysec(默认):服务器每一秒重调用一次fdatasync,将缓冲区里面的命令写入到硬盘。这种模式下,服务器出现故障,最多只丢失一秒钟内的执行的命令数据

No:服务器不主动调用fdatasync,由操作系统决定何时将缓冲区里面的命令写入到硬盘。这种模式下,服务器遭遇意外停机时,丢失命令的数量是不确定的

运行速度:always的速度慢,everysec和no都很快

11.2.3 AOF重写机制

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

重写过程

1.folk一个子进程负责重写AOF文件

2.子进程会创建一个临时文件写入AOF信息

3.父进程会开辟一个内存缓冲区接收新的写命令

4.子进程重写完成后,父进程会获得一个信号,将父进程接收到的新的写操作由子进程写入到临时文件中

5.新文件替代旧文件

重写的本质:就是将操作同一个键的命令,合并。从而减小AOF文件的体积

AOF重写触发机制

1.手动:客户端向服务器发送BGREWRITEAOF命令

2.自动:配置文件中的选项,自动执行BGREWRITEAOF命令

auto-aof-rewrite-min-size ,

触发AOF重写所需的最小体积:只要在AOF文件的体积大于等于size时,才会考虑是否需要进行AOF重写,这个选项用于避免对体积过小的AOF文件进行重写

auto-aof-rewrite-percentage

指定触发重写所需的AOF文件体积百分比:当AOF文件的体积大于auto-aof-rewrite-min-size指定的体积,并且超过上一次重写之后的AOF文件体积的percent %时,就会触发AOF重写。(如果服务器刚刚启动不久,还没有进行过AOF重写,那么使用服务器启动时载入的AOF文件的体积来作为基准值)。将这个值设置为0表示关闭自动AOF重写。

11.2.4 优点

写入机制:默认Everysec每秒执行,性能很好不阻塞服务,最多丢失一秒的数据;

重写机制:优化AOF文件,如果误操作了(FLUSHALL等),只要AOF未被重写,停止服务移除AOF文件尾部FLUSHALL命令,重启Redis,可以将数据集恢复到FLUSHALL 执行之前的状态。

11.2.5 缺点

1.相同数据集,AOF文件体积较RDB大了很多;

2.恢复数据库速度较RDB慢(文本,命令重演)。

原文链接:
https://www.cnblogs.com/gaojinshun/p/15423790.html

Original: https://www.cnblogs.com/gaojinshun/p/15423790.html
Author: ki16
Title: Redis的安装使用

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/581032/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 老徐和阿珍的故事:ArrayList和LinkedList的效率到底哪个高?

    人物背景:老徐,男,本名徐福贵,从事Java相关研发工作多年,职场老油条,摸鱼小能手,虽然岁数不大但长的比较着急,人称老徐。据说之前炒某币败光了所有家产,甚至现在还有欠债。阿珍,女…

    Java 2023年6月7日
    070
  • Ubuntu 20.04 查看内存信息

    输入命令 dmidecode -t memory 输出如下: dmidecode 3.2 Getting SMBIOS data from sysfs. SMBIOS 2.8 pr…

    Java 2023年6月7日
    093
  • 太空射击python

    import random import pygame from os import path img_dir = path.join(path.dirname(__file__)…

    Java 2023年6月14日
    082
  • 自定义映射resultMap

    resultMap处理字段和属性的映射关系 如果字段名与实体类中的属性名不一致,该如何处理映射关系? 第一种方法: 为查询的字段设置别名,和属性名保持一致 下面是实体类中的属性名:…

    Java 2023年6月15日
    074
  • 【Java全栈进阶】-接口

    学习类的时候,知道类与类之间可以通过继承产生关系,接口和类之间可以通过实现产生关系,那么接口与接口之间会有什么关系呢? 多个接口之间可以使用 extends进行继承。 interf…

    Java 2023年6月7日
    080
  • Hello World

    写Hello World的步骤 新建文件夹存放代码 新建一个java文件 文件后缀名为.java Hello.java 【注意】系统可能没有显示后缀名,需要手动打开(如果没有Win…

    Java 2023年6月9日
    071
  • CSharp: Builder Pattern in donet core 3

    调用:、 输出: Original: https://www.cnblogs.com/geovindu/p/16751510.htmlAuthor: ®Geovin Du Drea…

    Java 2023年6月16日
    084
  • 程序里随处可见的interface,真的有用吗?真的用对了吗?

    这两天在和一小伙伴研究解决RabbitMQ集群重启慢导致Consumer自动重连超时的问题,已经有了解决方案。接下来需要做个整理。由于同时涉及到springboot自动配置、spr…

    Java 2023年6月15日
    077
  • JDK内置锁深入探究

    本文讲述仅针对 JVM 层次的内置锁,不涉及分布式锁。 锁有多种分类形式,比如公平锁与非公平锁、可重入锁与非重入锁、独享锁与共享锁、乐观锁与悲观锁、互斥锁与读写锁、自旋锁、分段锁和…

    Java 2023年6月6日
    086
  • JDBC

    接口 接口:API。 规范。 定义方法签名。 接口和抽象了的意义上的区别。 抽象类是类,抽象类的目的就是让其他类来继承的。 只要继承从意义上来说就要说通 is a。 接口更趋向于功…

    Java 2023年6月7日
    0104
  • SQLServer触发器调用JavaWeb接口

    这几天接到一个需求需要吧不同系统的数据库进行同步,需要我做一个中间平台进行连接,瞬间就想到了触发器调用接口然后通过API进行传递再写入另一个数据库。sqlServer触发器调用Ja…

    Java 2023年6月5日
    077
  • SpringBoot整合Redis和SpringBoot(SpringCache)整合Redis

    参考博客: https://blog.csdn.net/lingerlan510/article/details/121906813 https://blog.csdn.net/u…

    Java 2023年6月6日
    067
  • ReadWriteLock 接口详解

    ReadWriteLock 接口详解 这是本人阅读ReadWriteLock接口源码的注释后,写出的一篇知识分享博客 读写锁的成分是什么? 读锁 Lock readLock(); …

    Java 2023年6月5日
    090
  • SpringBoot工程通过jdbc连接Hive

    首先确定当前hive的版本 例如:我目前的版本就是hive-common-1.1.0-cdh5.16.2.jar 注意:引入的Hive-jdbc依赖需与Hive版本保持一致。 依次…

    Java 2023年6月5日
    0126
  • vmware安装或卸载时,显示无法打开注册表项

    vmware卸载是出了名的臭名昭著,因为太难删干净了,删不干净又会有各种各样的问题。比如下文这个”无法打开注册表项” 这个我相信有很多人在重装vmware的…

    Java 2023年6月13日
    074
  • 谈谈数据库,缓存一致性

    几年前,我在看博客的时候,看到有一篇博客的标题就是关于数据库,缓存一致性的,不以为然,直接跳过去了,心想,这么简单的问题还讨论个鬼啊。这种想法持续了很久,直到某天,我看到越来越多的…

    Java 2023年6月5日
    089
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球