Redis基础知识学习笔记(最终篇)

Redis命令

Redis HyperLogLog命令

Redis 在 2.8.9 版本添加了 HyperLogLog 结构。

Redis HyperLogLog 是用来做基数统计的算法,HyperLogLog 的优点是,在输入元素的数量或者体积非常非常大时,计算基数所需的空间总是固定 的、并且是很小的。

在 Redis 里面,每个 HyperLogLog 键只需要花费 12 KB 内存,就可以计算接近 2^64 个不同元素的基 数。这和计算基数时,元素越多耗费内存就越多的集合形成鲜明对比。

但是,因为 HyperLogLog 只会根据输入元素来计算基数,而不会储存输入元素本身,所以 HyperLogLog 不能像集合那样,返回输入的各个元素。

什么是基数?

比如数据集 {1, 3, 5, 7, 5, 7, 8}, 那么这个数据集的基数集为 {1, 3, 5 ,7, 8}, 基数(不重复元素)为5。 基数估计就是在误差可接受的范围内,快速计算基数。

命令

序号命令描述
1PFADD key element [element ...]添加指定元素到 HyperLogLog 中。
2PFCOUNT key [key ...]返回给定 HyperLogLog 的基数估算值。
3PFMERGE destkey sourcekey [sourcekey ...]将多个 HyperLogLog 合并为一个 HyperLogLog。

Redis 发布订阅

Redis 发布订阅 (pub/sub) 是一种消息通信模式:发送者 (pub) 发送消息,订阅者 (sub) 接收消息。

Redis 客户端可以订阅任意数量的频道。

下图展示了频道 channel1 , 以及订阅这个频道的三个客户端 —— client2 、 client5 和 client1 之间的关系:
20240903163248

当有新消息通过 PUBLISH 命令发送给频道 channel1 时, 这个消息就会被发送给订阅它的三个客户端:
20240903163331

命令

序号命令描述
1PSUBSCRIBE pattern [pattern ...]订阅一个或多个符合给定模式的频道。
2PUBSUB subcommand [argument [argument ...]]查看订阅与发布系统状态。
3PUBLISH channel message将信息发送到指定的频道。
4PUNSUBSCRIBE [pattern [pattern ...]]退订所有给定模式的频道。
5SUBSCRIBE channel [channel ...]订阅给定的一个或多个频道的信息。
6UNSUBSCRIBE [channel [channel ...]]指退订给定的频道。

Redis 事务

Redis 事务可以一次执行多个命令, 并且带有以下三个重要的保证:

  1. 批量操作在发送 EXEC 命令前被放入队列缓存。
  2. 收到 EXEC 命令后进入事务执行,事务中任意命令执行失败,其余的命令依然被执行。
  3. 在事务执行过程,其他客户端提交的命令请求不会插入到事务执行命令序列中。

一个事务从开始到执行会经历以下三个阶段:

  1. 开始事务。
  2. 命令入队。
  3. 执行事务。

单个 Redis 命令的执行是原子性的,但 Redis 没有在事务上增加任何维持原子性的机制,所以 Redis 事务的执行并不是原子性的。

事务可以理解为一个打包的批量执行脚本,但批量指令并非原子化的操作,中间某条指令的失败不会导致前面已做指令的回滚,也不会造成后续的指令不做。

命令

序号命令描述
1DISCARD取消事务,放弃执行事务块内的所有命令。
2EXEC执行所有事务块内的命令。
3MULTI标记一个事务块的开始。
4UNWATCH取消 WATCH 命令对所有 key 的监视。
5WATCH key [key ...]监视一个(或多个) key,如果在事务执行之前这个(或这些) key 被其他命令所改动,那么事务将被打断。

Redis 连接

Redis 连接命令主要是用于连接 redis 服务。

命令

序号命令描述
1AUTH password验证密码是否正确
2ECHO message打印字符串
3PING查看服务是否运行
4QUIT关闭当前连接
5SELECT index切换到指定的数据库(索引从 0 开始)

Java 使用 Redis

1. 通过配置Jedis操作

在Springboot2.X后,我们的原来使用的Jedis已经被替换成了lettuce

a>在pom.xml文件引入jedis的maven依赖
     <!--redis-->
    <dependency>
        <groupId>redis.clients</groupId>
        <artifactId>jedis</artifactId>
        <version>2.8.0</version>
    </dependency>
b>测试redis连接

使用Jedis操作Redis的步骤:

  1. 获取连接
  2. 执行操作关闭连接
  3. 关闭连接

在测试类中运行:

package com.nianxi.spring_redis;

import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
import redis.clients.jedis.Jedis;

@SpringBootTest
class SpringRedisApplicationTests {

    @Test
    void contextLoads() {

        //1. 获取连接
        Jedis jedis = new Jedis("localhost");
        System.out.println("连接成功");
        //2. 执行操作关闭连接
        //查看服务是否运行
        System.out.println("服务正在运行: "+jedis.ping());
        //3. 关闭连接
        jedis.close();
    }

}

20240903165935

同理,对数据操作也是一样:

@Test
    void contextLoads1() {

        //1. 获取连接
        Jedis jedis = new Jedis("localhost", 6379);
        //2. 执行操作关闭连接
        jedis.set("name", "mannor");//设置
        String name = jedis.get("name");//获取
        System.out.println(name);
        jedis.del("name");//删除

        jedis.hset("myhash","addr","beijing");//设置哈希表值
        String hget = jedis.hget("myhash", "addr");//获取哈希表
        System.out.println(hget);

        Set<String> keys = jedis.keys("*");//获取所有Redis的数据
        for(String key:keys){
            System.out.println(key);
        }
        //3. 关闭连接
        jedis.close();
    }

20240903170121

2. Spring Data Redis

a>引入依赖

在Spring Boot项目中,可以使用Spring Data Redis来简化Redis操作,maven坐标

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>

Spring Data Redis中提供了一个高度封装的类: RedisTemplate,针对jedis客户端中大量api进行了归类封装,将同一类型操作封装为operation接口,具体分类如下:

ValueOperations:简单K-V操作
SetOperations:set类型数据操作
ZSetOperations:zset类型数据操作
HashOperations:针对map类型的数据操作
ListOperations:针对list类型的数据操作

b>使用之前我们需要配置一下redis文件

yml配置文件:

spring:
  application:
    name: spring_redis
    #Redis相关配置
    redis:
      host: localhost
      port: 6379
      #password: 123456
      database: 0 #操作的是0号数据库(redis存在0-15号数据库(默认),在命令中使用select来切换)
      jedis:
        #Redis连接池配置
        pool:
          max-active: 8 #最大连接数
          max-wait: 1ms #连接池最大阻塞等待时间 
          max-idle: 4 #连接池中的最大空闲连接
          min-idle: 0 #连接池中的最小空闲连接
c>测试类
    @Autowired
    private RedisTemplate redisTemplate;

    @Test
    public void test() {
        // 使用ping方法检测是否连接成功
        System.out.println(redisTemplate.getConnectionFactory().getConnection().ping());
        redisTemplate.opsForValue().set("name", "mannor");
        System.out.println(redisTemplate.opsForValue().get("name"));
    }

20240903171448

❤️❤️❤️完结❤️❤️❤️

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

晚睡早起₍˄·͈༝·͈˄*₎◞ ̑̑

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值