Redis(5,jedis和spring)

在前面的学习中,只是学习了各种redis的操作,都是在redis命令行客户端操作的,手动执行的,更多的时候就是使用redis的api(),进一步操作redis程序。

在java中实现的redis客户端有很多,接下来我们将使用jedis,在maven仓库下载jedis。

在depency这里引入依赖。并且需要修改外网ip连接到云服务器并且开启6379端口。

不能开放6379端口因为容易被黑客入侵,所以我们需要配置ssh端口转发,把云服务器的redis端口映射到本地主机。

ssh端口转发的配置

相当于通过ssh的22来传递其他端口的数据,比如本身想要访问6379,我们就构造一个ssh的数据报,就要把访问redis请求放在数据报中,通过比较安全的22端口交给云服务器,服务器的程序就能解析该数据报然后交给6379端口。

但是这时候我们会在本地创建一个端口比如8888,映射6379这个端口,类似于在本地设立一个办事处,我们访问8888也就是访问Linux的6379(访问本地就是访问远程窗口)。

话不多说我们进行一个简单的配置,就可以把本地端口当成远程用。

打开属性,点击添加,在redis中进行如下配置,最后点击连接。

最后在cmd中输入netstat -ano | findstr 8888,查看是否连接好了。

接下来通过我们自己的127.0.0.1:8888就能操作redis了。

通过下列代码连接redis。

JedisPool jedisPool=new JedisPool("tcp://127.0.0.1:8888");

接着再从池子中获取连接,连接用完之后要记得关闭(close),此处的释放是把redis的连接放回池子中。

try(Jedis jedis=jedisPool.getResource()){
            //接下来的命令就对应到redis的客户端操作了
            System.out.println(jedis.ping());

        }

在这里我们之前配置好了redis.conf的配置项。

get和set方法:

import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.params.SetParams;

public class RedisDemo {
    public static void test(Jedis jedis){
        jedis.flushAll();
        jedis.set("key","111");
        jedis.set("key1","222");
        SetParams setParams=new SetParams();
        setParams.ex(10);
        setParams.nx();
        jedis.set("key3","333",setParams);
        String key3 = jedis.get("key3");
        System.out.println(key3);


    }
    public static void main(String[] args) {
        //连接redis服务器上面,redis连接池。
        JedisPool jedisPool=new JedisPool("tcp://127.0.0.1:8888");
        try(Jedis jedis=jedisPool.getResource()){
            //接下来的命令就对应到redis的客户端操作了
            /*System.out.println(jedis.ping());*/
            test(jedis);

        }
    }
}

在这个test()方法中,通过set和get方法,创建和使用key,并且我们还可以给key设定setParams,可以设置其超时时间等。

exist和del:

public static void test2(Jedis jedis){
        jedis.flushAll();
        jedis.set("key","111");
        jedis.set("key2","222");
        boolean result = jedis.exists("key");
        System.out.println("result ="+result);
        long delnum = jedis.del("key2");
        System.out.println(delnum);
        


    }
    public static void main(String[] args) {
        //连接redis服务器上面,redis连接池。
        JedisPool jedisPool=new JedisPool("tcp://127.0.0.1:8888");
        try(Jedis jedis=jedisPool.getResource()){
            //接下来的命令就对应到redis的客户端操作了
            /*System.out.println(jedis.ping());*/
            /*test1(jedis);*/
            test2(jedis);

        }
    }

通过test2调用,来获取key数据书否存在,以及删除元素的操作,来删除以及存在的元素,返回的结果是删除的个数。

keys方法:

public static void test3(Jedis jedis){
        jedis.set("key","111");
        jedis.set("key1","111");
        jedis.set("key2","111");
        jedis.set("key3","111");
        Set<String> keys = jedis.keys("*");
        System.out.println(keys);


    }
    public static void main(String[] args) {
        //连接redis服务器上面,redis连接池。
        JedisPool jedisPool=new JedisPool("tcp://127.0.0.1:8888");
        try(Jedis jedis=jedisPool.getResource()){
            //接下来的命令就对应到redis的客户端操作了
            /*System.out.println(jedis.ping());*/
            /*test1(jedis);*/
            /*test2(jedis);*/
            test3(jedis);

        }
    }

在这里通过接受并且打印set的方式,在控制台打印set,并且这里的key没有顺序。

expire和ttl:

public static void test4(Jedis jedis){
        jedis.flushAll();
        jedis.set("key","111");
        jedis.expire("key",10);
        try {
            Thread.sleep(3000);
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
        long time = jedis.ttl("key");
        System.out.println(time);


    }
    public static void main(String[] args) {
        //连接redis服务器上面,redis连接池。
        JedisPool jedisPool=new JedisPool("tcp://127.0.0.1:8888");
        try(Jedis jedis=jedisPool.getResource()){
            //接下来的命令就对应到redis的客户端操作了
            /*System.out.println(jedis.ping());*/
            /*test1(jedis);*/
            /*test2(jedis);*/
//            test3(jedis);
            test4(jedis);

        }
    }

通过expire设置过期时间,以及通过ttl查看过期时间还剩下多少。

type:

public static void test5(Jedis jedis){
        jedis.flushAll();
        jedis.set("key","111");
        String type = jedis.type("key");
        System.out.println(type);

    }

通过如上方法打印type的类型到控制台,由于没有过多设置这里默认是String类型。

mset和mget方法:

public static void test(Jedis jedis){
        jedis.flushAll();
        jedis.mset("key","000","key1","111","key2","222","key3","333");
        List<String> list = jedis.mget("key", "key1", "key2");
        System.out.println(list);


    }

如果在mgetde过程中查询了一个不存在的key就会出现null的情况。

setrange和getrange方法:

public static void test1(Jedis jedis){
        jedis.flushAll();
        jedis.set("key","asdfghjkl");
        String string = jedis.getrange("key", 2, 5);
        System.out.println(string);
        jedis.setrange("key",2,"asasa");
        String string1 = jedis.get("key");
        System.out.println(string1);
    }

getrange获取指定区间的元素,setrange从指定位置开始修改元素。

append:

对key进行字符串拼接。

public static void test2(Jedis jedis){
        jedis.flushAll();
        jedis.set("key","111");
        jedis.append("key","asdfghjkl");
        String key = jedis.get("key");
        System.out.println(key);

    }

incr和decr:

public static void test3(Jedis jedis){
        jedis.flushAll();
        jedis.set("key","100");
        long key = jedis.incr("key");
        System.out.println(key);
        long key1 = jedis.decr("key");
        System.out.println(key1);


    }

通过incr和decr来对指定的key中的数字加减。

list相关lpush,lrange等操作

public static void test(Jedis jedis){
        jedis.flushAll();
        jedis.lpush("key","111","222","333");
        List<String> list = jedis.lrange("key", 0, -1);
        System.out.println(list);


    }

头插法进行对头部插入。 

集合类型(sadd和smembers):

public static void test(Jedis jedis){
        jedis.flushAll();
        jedis.sadd("key","111","222","333","444","555");
        Set<String> set = jedis.smembers("key");
        System.out.println(set);
        boolean result = jedis.sismember("key", "111");
        System.out.println(result);


    }

哈希类型的使用

public static void test1(Jedis jedis){
        jedis.flushAll();
        Map<String,String> field=new HashMap<>();
        field.put("f1","111");
        field.put("f2","222");
        jedis.hset("key",field);
        String hget = jedis.hget("key", "f1");
        System.out.println(hget);


    }

先构造一个哈希类型的field,并且通过jedis来放置field。

Zset有序集合:

public static void test(Jedis jedis){
        jedis.flushAll();
        jedis.zadd("key",10,"lisi");
        Map<String,Double> map=new HashMap<>();
        map.put("zhangsan",20.0);
        map.put("lisi",15.0);
        jedis.zadd("key",map);
        List<Tuple> key = jedis.zrangeWithScores("key", 0, -1);
        System.out.println(key);
        System.out.println(key.get(0).getScore());
        System.out.println(key.get(0).getElement());


    }

在spring中配置redis

首先要在yml文件中配置以下配置。

spring:
  data:
    redis:
      port: 8888
      host: 127.0.0.1

接着在xml文件中导入操作redis的依赖。

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

在controller中注入 StringRedisTemplate,在java中我们是直接使用jedis来操作redis,但是在spring中使用StringRedisTemplate,是专门处理文本数据的。

    @Autowired
    StringRedisTemplate stringRedisTemplate;

在StringRedisTemplate中做了进一步的封装,可以得到专门操作某个数据结构的对象,比如获得专门操作哈希的对象。

String(Spring版本)

 通过ops的方法来操作相应的对象。

 @Resource
    private StringRedisTemplate stringRedisTemplate;


    @RequestMapping("/test")
    public String test(){
        stringRedisTemplate.getConnectionFactory().getConnection().flushAll();

        stringRedisTemplate.opsForValue().set("key1","111");
        stringRedisTemplate.opsForValue().set("key2","222");
        stringRedisTemplate.opsForValue().set("key3","333");

        String string = stringRedisTemplate.opsForValue().get("key1");
        System.out.println(string);
        return "ok";


    }

执行redis原生命令(excute):

 redis留了一个后手,能让我们随时执行redis原生命令。

stringRedisTemplate.execute((RedisConnection connection)->{
            connection.flushAll();
            return null;
        });

通过execute方法和lambda表达式来构建connection方法来调用flush方法,就能够做到类似于在控制台上面操作程序。

List(Spring版本)

public String testList(){
        stringRedisTemplate.execute((RedisConnection connection)->{
            connection.flushAll();
            return null;
        });
        stringRedisTemplate.opsForList().leftPush("key","111");
        String string = stringRedisTemplate.opsForList().rightPop("key");
        System.out.println(string);
        return "ok";

    }

Set(Spring版本):

public String testSet(){
        stringRedisTemplate.execute((RedisConnection connection)->{
            connection.flushAll();
            return null;
        });

        stringRedisTemplate.opsForSet().add("key","111","222","333");
        Set<String> key = stringRedisTemplate.opsForSet().members("key");
        System.out.println(key);

        Boolean isexist=stringRedisTemplate.opsForSet().isMember("key","111");
        System.out.println(isexist);
        return "ok";



    }

Set操作和前面的List和String操作也很相似。这里我们就快速学习一下。

Hash(Spring版本)

public String testHash(){
        stringRedisTemplate.execute((RedisConnection connection)->{
            connection.flushAll();
            return null;
        });
        stringRedisTemplate.opsForHash().put("key","f1","111");
        stringRedisTemplate.opsForHash().put("key","f2","222");
        stringRedisTemplate.opsForHash().put("key","f3","333");

        String value = (String) stringRedisTemplate.opsForHash().get("key", "f1");
        System.out.println(value);

        Boolean exist = stringRedisTemplate.opsForHash().hasKey("key", "f1");

        Long l = stringRedisTemplate.opsForHash().size("key");
        System.out.println(l);

        return "ok";

    }

public String testZSet(){
        stringRedisTemplate.execute((RedisConnection connection)->{
            connection.flushAll();
            return null;
        });
        stringRedisTemplate.opsForZSet().add("key","zhangsan",10);
        stringRedisTemplate.opsForZSet().add("key","lisi",20);
        stringRedisTemplate.opsForZSet().add("key","wangwu",30);
        Set<String> key = stringRedisTemplate.opsForZSet().range("key", 0, -1);
        System.out.println(key);
        Set<ZSetOperations.TypedTuple<String>> key1 = stringRedisTemplate.opsForZSet().rangeWithScores("key", 0, -1);
        System.out.println(key1);
        return "ok";


    }

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于聚类与相关性分析对马来西亚房价数据进行分析

碎碎念&#xff1a;由于最近太忙了&#xff0c;更新的比较慢&#xff0c;提前祝大家新春快乐&#xff0c;万事如意&#xff01;本数据集的下载地址&#xff0c;读者可以自行下载。 1.项目背景 本项目旨在对马来西亚房地产市场进行初步的数据分析&#xff0c;探索各州的房产市…

(2025 年最新)MacOS Redis Desktop Manager中文版下载,附详细图文

MacOS Redis Desktop Manager中文版下载 大家好&#xff0c;今天给大家带来一款非常实用的 Redis 可视化工具——Redis Desktop Manager&#xff08;简称 RDM&#xff09;。相信很多开发者都用过 Redis 数据库&#xff0c;但如果你想要更高效、更方便地管理 Redis 数据&#x…

智慧园区管理系统为企业提供高效运作与风险控制的智能化解决方案

内容概要 快鲸智慧园区管理系统&#xff0c;作为一款备受欢迎的智能化管理解决方案&#xff0c;致力于为企业提供高效的运作效率与风险控制优化。具体来说&#xff0c;这套系统非常适用于工业园、产业园、物流园、写字楼及公寓等多种园区和商办场所。它通过数字化与智能化的手…

C++中常用的排序方法之——冒泡排序

成长路上不孤单&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a; 【14后&#x1f60a;///计算机爱好者&#x1f60a;///持续分享所学&#x1f60a;///如有需要欢迎收藏转发///&#x1f60a;】 今日分享关于C中常用的排序方法之——冒泡排序的…

基础项目实战——3D赛车(c++)

目录 前言一、渲染引擎二、关闭事件三、梯形绘制四、轨道绘制五、边缘绘制六、草坪绘制七、前后移动八、左右移动​九、曲线轨道​十、课山坡轨道​十一、循环轨道​十二、背景展示​十三、引入速度​十四、物品绘制​十五、课数字路障​十六、分数展示​十七、重新生成​十八、…

深度学习指标可视化案例

TensorBoard 代码案例&#xff1a;from torch.utils.tensorboard import SummaryWriter import torch import torchvision from torchvision import datasets, transforms# 设置TensorBoard日志路径 writer SummaryWriter(runs/mnist)# 加载数据集 transform transforms.Comp…

AI时序预测: iTransformer算法代码深度解析

在之前的文章中&#xff0c;我对iTransformer的Paper进行了详细解析&#xff0c;具体文章如下&#xff1a; 文章链接&#xff1a;深度解析iTransformer&#xff1a;维度倒置与高效注意力机制的结合 今天&#xff0c;我将对iTransformer代码进行解析。回顾Paper&#xff0c;我…

Java内存模型 volatile 线程安全

目录 Java内存模型可见性例子和volatilevolatile如何保证可见性原子性与单例模式i非原子性 线程安全 Java内存模型 参考学习: Java Memory Model外文文档 CPU与内存&#xff0c;可参考&#xff1a;https://blog.csdn.net/qq_26437925/article/details/145303267 Java线程与内…

【FreeRTOS 教程 三】协程状态、优先级、实现及调度

目录 一、协程介绍&#xff1a; &#xff08;1&#xff09;协程的特点&#xff1a; &#xff08;2&#xff09;协程的优势&#xff1a; 二、协程状态&#xff1a; &#xff08;1&#xff09;协程状态说明&#xff1a; &#xff08;2&#xff09;协程状态图示&#xff1a;…

堆的存储(了解)

由于堆是⼀个完全⼆叉树&#xff0c;因此可以⽤⼀个数组来存储。&#xff08;如果不清楚大家可以回顾⼆叉树的存储&#xff08;上&#xff09;c文章里的顺序存储&#xff09; 结点下标为 i &#xff1a; 如果⽗存在&#xff0c;⽗下标为 i/2 &#xff1b; 如果左孩⼦存在&…

谭浩强C语言程序设计(3) 7章

1、递归实现N的阶乘 c复制 #include <cstdio> // 包含标准输入输出库// 计算n的阶乘 int total 0; // 定义全局变量total用于存储阶乘结果// 递归函数计算阶乘 int fac(int a){// 如果输入的数小于0&#xff0c;输出错误信息if (a < 0){printf("%d < 0,err…

WPF基础 | WPF 常用控件实战:Button、TextBox 等的基础应用

WPF基础 | WPF 常用控件实战&#xff1a;Button、TextBox 等的基础应用 一、前言二、Button 控件基础2.1 Button 的基本定义与显示2.2 按钮样式设置2.3 按钮大小与布局 三、Button 的交互功能3.1 点击事件处理3.2 鼠标悬停与离开效果3.3 按钮禁用与启用 四、TextBox 控件基础4.…

MATLAB的数据类型和各类数据类型转化示例

一、MATLAB的数据类型 在MATLAB中 &#xff0c;数据类型是非常重要的概念&#xff0c;因为它们决定了如何存储和操作数据。MATLAB支持数值型、字符型、字符串型、逻辑型、结构体、单元数组、数组和矩阵等多种数据类型。MATLAB 是一种动态类型语言&#xff0c;这意味着变量的数…

模型I/O

文章目录 什么是模型I/O模型I/O功能之输出解析器输出解析器的功能输出解析器的使用Pydantic JSON输出解析器结构化输出解析器 什么是模型I/O 模型I/O在所有LLM应用中&#xff0c;核心元素无疑都是模型本身。与模型进行有效的交互是实现高效、灵活和可扩展应用的关键。LangChain…

docker安装Redis:docker离线安装Redis、docker在线安装Redis、Redis镜像下载、Redis配置、Redis命令

一、镜像下载 1、在线下载 在一台能连外网的linux上执行docker镜像拉取命令 docker pull redis:7.4.0 2、离线包下载 两种方式&#xff1a; 方式一&#xff1a; -&#xff09;在一台能连外网的linux上安装docker执行第一步的命令下载镜像 -&#xff09;导出 # 导出镜像…

QT串口通信,实现单个温湿度传感器数据的采集

1、硬件设备 RS485中继器(一进二出),usb转485模块、电源等等 => 累计115元左右。 2、核心代码 #include "MainWindow.h" #include "ui_MainWindow.h"MainWindow::

android主题设置为..DarkActionBar.Bridge时自定义DatePicker选中日期颜色

安卓自定义DatePicker选中日期颜色 背景&#xff1a;解决方案&#xff1a;方案一&#xff1a;方案二&#xff1a;实践效果&#xff1a; 背景&#xff1a; 最近在尝试用原生安卓实现仿element-ui表单校验功能&#xff0c;其中的的选择日期涉及到安卓DatePicker组件的使用&#…

6.工厂模式(Factory Method)

定义 通过“对象创建” 模式绕开new&#xff0c;来避免对象创建&#xff08;new&#xff09;过程中所导致的紧耦合&#xff08;依赖具体类&#xff09;&#xff0c;从而支持对象创建的稳定。它是接口抽象之后的第一步工作。 动机 在软件系统中&#xff0c;经常面临着创建对象…

Java CAS操作

通过前面的学习认识到了CPU缓存&#xff0c;Java内存模型&#xff0c;以及线程安全的原子、可见、顺序三大特性。本文则重点认识CAS操作&#xff0c;这是Java并发编程常见的一个操作&#xff0c;AbstractQueuedSynchronizer基于此操作提供了丰富的同步器和各种锁。 CAS&#x…

【Numpy核心编程攻略:Python数据处理、分析详解与科学计算】1.25 视觉风暴:NumPy驱动数据可视化

1.25 视觉风暴&#xff1a;NumPy驱动数据可视化 目录 #mermaid-svg-i3nKPm64ZuQ9UcNI {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-i3nKPm64ZuQ9UcNI .error-icon{fill:#552222;}#mermaid-svg-i3nKPm64ZuQ9UcNI …