11.redis的客户端-Jedis

news2025/1/21 9:26:24

1.Jedis

以redis命令作为方法名称,学习成本低,简单使用。但是jedis实例是不安全的,多线程环境下需要基于连接池来使用。

2.Lettuce

lettuce是基于Netty实现的,支持同步,异步和响应式编程方式,并且是线程安全的。支持redis的哨兵模式、集群模式和管道模式。

3.Redisson

redisson是一个基于redis实现分布式、可伸缩的java数据结构集合,包含了诸如Map,Queue,Lock,Semphore,AtomicLong等强大功能。

Spring Data Redis 可以兼容 Jedis和Lettuce两个客户端。

Jedis官方网站:https://github.com/redis/jedis

1.引入依赖

<dependency>
   <groupId>redis.clients</groupId>
   <artifactId>jedis</artifactId>
   <version>3.7.0</version>
</dependency>

单元测试依赖

<dependency>
   <groupId>org.junit.jupiter</groupId>
   <artifactId>junit-jupiter</artifactId>
   <version>5.7.0</version>
   <scope>test</scope>
</dependency>

2.建立连接

3.操作redis

4.释放资源

package com.xkj.org;

import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import redis.clients.jedis.Jedis;

public class JedisTest {

    private Jedis jedis;

    @BeforeEach
    void setUp() {
        //建立连接
        jedis = new Jedis("192.168.171.130", 6379);
        //设置密码
        jedis.auth("123456");
        //选择库
        jedis.select(0);

    }

    @Test
    void testString() {
        String result = jedis.set("name", "虎子");
        System.out.println("result="+result);
        String name = jedis.get("name");
        System.out.println("name="+name);
    }

    @AfterEach
    void tearDown() {
        if(jedis!= null) {
            jedis.close();
        }
    }

}

Hash类型的操作

@Test
    void testHash() {
        //插入hash数据
        Long res = jedis.hset("person", "name", "张三");
        jedis.hset("person", "age", "22");
        System.out.println("res="+res);
        //取出hash数据
        String name = jedis.hget("person", "name");
        System.out.println("name="+name);
        //全部取出hash数据
        Map<String, String> person = jedis.hgetAll("person");
        System.out.println("person="+person);

    }

jedis本身是线程不安全的,并且频繁的创建和销毁连接会有性能损耗,因此推荐使用jedis连接池代替jedis直连方式。

Jedis连接池

package com.xkj.org.utils;

import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;

public class JedisConnectionFactory {

    public static final JedisPool jedisPool;

    static {
        //配置连接池
        JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
        jedisPoolConfig.setMaxTotal(8);
        jedisPoolConfig.setMaxIdle(8);
        jedisPoolConfig.setMaxWaitMillis(1000);
        //创建连接池对象
        jedisPool = new JedisPool(jedisPoolConfig, "192.168.171.130", 6379, 1000, "123456");
    }

    public static Jedis getJedis() {
        return jedisPool.getResource();
    }

}
package com.xkj.org;

import com.xkj.org.utils.JedisConnectionFactory;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisFactory;

import java.util.Map;

public class JedisTest {

    private Jedis jedis;

    @BeforeEach
    void setUp() {
        //建立连接
//        jedis = new Jedis("192.168.171.130", 6379);
        jedis = JedisConnectionFactory.getJedis();
        //设置密码
        jedis.auth("123456");
        //选择库
        jedis.select(0);

    }

    @Test
    void testString() {
        String result = jedis.set("name", "虎子");
        System.out.println("result="+result);
        String name = jedis.get("name");
        System.out.println("name="+name);
    }

    @Test
    void testHash() {
        //插入hash数据
        Long res = jedis.hset("person", "name", "张三");
        jedis.hset("person", "age", "22");
        System.out.println("res="+res);
        //取出hash数据
        String name = jedis.hget("person", "name");
        System.out.println("name="+name);
        //全部取出hash数据
        Map<String, String> person = jedis.hgetAll("person");
        System.out.println("person="+person);

    }

    @AfterEach
    void tearDown() {
        if(jedis!= null) {
            //如果是连接池,会将连接还回池子
            jedis.close();
        }
    }

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1978539.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

EmEditor 打开文档后光标如何默认定位到文档最后一行?

1、录制宏 &#xff08;1&#xff09;、点击工具栏上的红色录制宏按钮&#xff0c;开始录制宏。如图&#xff1a; &#xff08;2&#xff09;、按住快捷键Ctrl End快捷键&#xff0c;使光标跳转到文档末尾 &#xff08;3&#xff09;、完成录制后&#xff0c;再次点击录制按钮…

Hive SQL ——窗口函数源码阅读

前言 使用Starrocks引擎中的窗口函数 row_number() over( )对10亿的数据集进行去重操作&#xff0c;BE内存溢出问题频发&#xff08;忘记当时指定的BE内存上限是多少了.....&#xff09;&#xff0c;此时才意识到&#xff0c;开窗操作&#xff0c;如果使用 不当&#xff0c;反而…

stm32工程配置

目录 STM32F103 start&#xff1a;启动文件、内核寄存器文件、外设寄存器文件、时钟配置文件 library&#xff1a;标准库函数&#xff08;内核及外设驱动&#xff09; user&#xff1a;用户文件、库函数配置文件、中断程序文件 添加宏定义 STM32F407 start目录 启动文件…

实战:使用Certbot签发免费ssl泛域名证书(主域名及其它子域名共用同一套证书)-2024.8.4(成功测试)

1、使用Certbot签发免费ssl泛域名证书 | One实战&#xff1a;使用Certbot签发免费ssl泛域名证书(主域名及其它子域名共用同一套证书)-2024.8.4(成功测试)https://wiki.onedayxyy.cn/docs/docs/Certbot-install/

Transformer相关介绍

1 Transformer 介绍 Transformer的本质上是一个Encoder-Decoder的结构。 1.1 编码器 在Transformer模型中&#xff0c;编码器&#xff08;Encoder&#xff09; 的主要作用是将输入序列&#xff08;例如文本、语音等&#xff09;转换为隐藏表示&#xff08;或者称为特征表示…

24军dui文职联勤保障部报名照规格要求

24军dui文职联勤保障部报名照规格要求 #军队文职 #文职 #文职备考 #联勤保障部队 #文职考试 #文职上岸 #2024军队文职

python-查找元素3(赛氪OJ)

[题目描述] 有n个不同的数&#xff0c;从小到大排成一列。现在告诉你其中的一个数x&#xff0c;x不一定是原先数列中的数。你需要输出最后一个<x的数在此数组中的下标。输入&#xff1a; 输入共两行第一行为两个整数n、x。第二行为n个整数&#xff0c;代表a[i]。输出&#x…

练习2.30

2.29题目没有理解,暂时没有做出来,先把2.30做了 上代码 (defn square [x](* x x)) ;第一版,直接定义 (defn square-tree[tree](cond (not (seq? tree)) (square tree)(empty? tree) nil:else (cons (square-tree (first tree)) (square-tree (rest tree)))) ) ;使用map …

LeetCode刷题笔记 | 283 | 移动零 | 双指针 |Java | 详细注释

&#x1f64b;大家好&#xff01;我是毛毛张! &#x1f308;个人首页&#xff1a; 神马都会亿点点的毛毛张 原地移除元素2 LeetCode链接&#xff1a;283. 移动零 1.题目描述 给定一个数组 nums&#xff0c;编写一个函数将所有 0 移动到数组的末尾&#xff0c;同时保持非零元…

Nextjs——国际化那些事儿

背景&#xff1a; 某一天&#xff0c;产品经理跟我说&#xff0c;我们的产品需要搞国际化 国际化的需求说白了就是把项目中的文案翻译成不同的语言&#xff0c;用户想用啥语言来浏览网页就用啥语言&#xff0c;虽然说英语是通用语言&#xff0c;但国际化了嘛&#xff0c;产品才…

学习编程的第二十天,加油!

3&#xff1a;递归与迭送&#xff08;循环是一种迭代&#xff09; &#xff01;&#xff01;&#xff01;递归算有些东西时计算量会很大导致运行时间过久&#xff0c;而使用循环会大大节省时间&#xff0c;但需要注意溢出的情况。 递归的练习&#xff0c;第一张呢不符合我们的…

刷题——不同路径的数目

不同路径的数目(一)_牛客题霸_牛客网 我第一眼&#xff0c;觉得是没有思路的&#xff0c;我也是看别人代码反应过来&#xff0c; 画图可以看出来 外边沿的只有一种到达方式&#xff0c;全部赋值1&#xff0c; 如果有两个方块相接&#xff0c;那就让此方块的左邻和右邻相加&…

线程池ThreadPoolExecutor使用

文章目录 一、基础-Java中线程创建的方式1.1、继承Thread类创建线程1.2、实现Runnable接口创建线程1.3、实现Calable接口创建线程1.4、使用线程池创建线程二、概念-线程池基本概念2.1、并发和井行的主要区别2.1.1、处理任务不同2.1.2、存在不同2.1.3、CPU资源不同2.2、什么是线…

网页保护用户 小tips

在使用创建web开发的过程中&#xff0c;直接使用用户名url&#xff0c;容易造成用户信息的被攻击&#xff0c;例如对方直接访问 ../../.../username 的网页&#xff0c;可以窃取用户信息&#xff0c;然而把usename变成一堆乱码就安全的多 效果&#xff1a; 代码&#xff1a;…

一个 .NET 开源的地图组件库 - Mapsui

前言 今天大姚给大家分享一个.NET开源&#xff08;MIT License&#xff09;、免费、同时支持多平台框架&#xff08;MAUI、WPF、Avalonia、Uno、Blazor、WinUI、Eto、.NET Android 和 .NET iOS&#xff09;地图组件库&#xff1a;Mapsui。 项目源代码 支持的UI框架的NuGet包 …

JavaFX布局-TabPane

JavaFX布局-TabPane 常用属性paddingsidetabClosingPolicytabDragPolicy 实现方式Java实现fxml实现 组织一组tab的容器&#xff0c;可以设置关闭&#xff0c;拖拽等每个tab内容可以设置不同容器数据 常用属性 padding 内边距&#xff0c;可以单独设置上、下、左、右的内边距 …

webfunny埋点系统如何进行部署?

hello 大家webfunny埋点系统做了不少功能更新&#xff0c;平常给大家分享比较多的是**webfunny前端监控系统**&#xff0c;最近有不少技术同学来了解webfunny埋点系统&#xff0c;今天主要给大家分享下webfunny埋点系统部署&#xff0c;分为本地部署和线上部署。 还没有试用和…

翻译: 可视化深度学习反向传播原理一

本期我们来讲反向传播 也就是神经网络学习的核心算法 稍微回顾一下我们之前讲到哪里之后 首先我要撇开公式不提 直观地过一遍 这个算法到底在做什么 然后如果你们有人想认真看里头的数学 下一期影片我会解释这一切背后的微积分 如果你看了前两期影片 或者你已经有足够背景知…

【文件系统】磁盘的物理结构 | 存储结构

目录 0.前言 1.磁盘的物理结构 1.1什么是二进制&#xff08;0/1&#xff09; 1.2磁盘的存放位置 1.3磁盘的结构 2.磁盘的存储结构 2.1❓数据是怎样在磁盘上存储 2.2❓读写的基本单位是什么 2.3❓如何找到一个指定位置的扇区 2.4❓为什么磁盘的机械结构是这样的 0.前…

Audio Spectrogram Transformer (AST)工作介绍

Audio Spectrogram Transformer (AST)&#xff0c;是一种基于 Transformer 模型的音频分类方法。AST 利用了 Transformer 模型在捕获全局特征方面的优势&#xff0c;将音频信号转换为频谱图进行处理。下面是对 AST 及其相关研究工作的详细介绍&#xff1a; 1.研究背景 传统的音…