java(SpringBoot)中操作Redis的两种方式

news2024/11/8 13:47:14

前言

之前我们介绍过了redis的五中基本类型以及在可视化界面进行操作,那么在开发中(在代码中)我们通常使用,jedis进行操作redis,要是springboot 项目,我们通常使用redisTemplte进行操作

首先将redis启动

在这里插入图片描述

方式一 Jredis

引入依赖,我们使用Jedis 来操作redis

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

1. 测试连接

@Test
    public void test11() {
         //测试连接
        Jedis jedis = new Jedis("localhost", 6379);
        String ping = jedis.ping();
        System.out.println(ping);
    }

执行结果:pong 表示连接成功

在这里插入图片描述
测试连接失败情况,这边随便改了个不存在的端口,结果报错

在这里插入图片描述

2. 基本操作

String

  • 设置值
 jedis.set("name","张三");
  • 获取值

jedis.get("name")
@Test
    public void test11()
 {
         //连接
        Jedis jedis = new Jedis("localhost", 6379);
        //设置值
        jedis.set("name","张三");
        //获取
        String name = jedis.get("name");
        System.out.println(name);
    }

在这里插入图片描述

  • 根据key 删除值
jedis.del("name");

```java
 @Test
    public void test11() {
        //测试连接
        Jedis jedis = new Jedis("localhost", 6379);
        jedis.del("name");
        System.out.println(jedis.get("name"));
    }

在这里插入图片描述

List

  • 从右边添加值 rpush

 jedis.rpush("redisList","a","b","aa");
  • 从左边添加值

  jedis.lpush("redisList","la","lb","laa");

获取值就不是get(key) 了,,而是


   List<String> list = jedis.lrange("redisList", 0, -1);

返回value集合,从0开始 到最后一个(-1)【包含最后一个】

 @Test
    public void test11() {
        //测试连接
        Jedis jedis = new Jedis("localhost", 6379);
        jedis.rpush("redisList","a","b","aa");
        List<String> list = jedis.lrange("redisList", 0, -1);
        list.forEach(System.out::println);
    }

在这里插入图片描述

  • 删除

    jedis.del("redisList");
 //测试连接
        Jedis jedis = new Jedis("localhost", 6379);
        jedis.del("redisList");
        //判断key是否存在
        Boolean redisList = jedis.exists("redisList");
        System.out.println(redisList);

在这里插入图片描述

  • 删除指定元素
jedis.lrem("redisList",1,"a");

jedis.lrem(“key”,删除几个,要删除的元素);

在这里插入图片描述
删除key 为 redisList 中的 1个 元素 a

在这里插入图片描述

set

  • 添加元素

jedis.sadd("redisSet","a","bb","ccc");

获取set 元素也与之前不同

 Set<String> redisSet = jedis.smembers("redisSet");

返回set集合,不可重复

Jedis jedis = new Jedis("localhost", 6379);
        jedis.sadd("redisSet","a","a","bb","ccc");
        Set<String> redisSet = jedis.smembers("redisSet");
        System.out.println(redisSet);

在这里插入图片描述
删除key同理

    //测试连接
        Jedis jedis = new Jedis("localhost", 6379);
        jedis.del("redisSet");

        System.out.println(jedis.exists("redisSet"));

在这里插入图片描述
删除指定元素

在这里插入图片描述
删除元素 “bb”

在这里插入图片描述

zset

  • 添加元素

  jedis.zadd("redisZSet",10,"aa");

jedis.zadd(“key”,score排序序号,“值”);

不太理解,可以回看 redis——基本介绍以及 五种 数据类型 (重要)

  • 获取元素

    Set<String> zSet = jedis.zrange("redisZSet",0,-1);

在这里插入图片描述

Hash

  • 设置值,

因为存储的是hsah首先需要new 一个hashMap ,往我们new 出来的hash 存储数据,再将整个数据存储进redis hash 中

   Jedis jedis = new Jedis("localhost", 6379);
        Map<String,String> hashMap = new HashMap<String,String>();
        hashMap.put("name","zhangsan");
        hashMap.put("age","18");
        jedis.hmset("redisHash", hashMap);
  • 获取值
List<String> hmget = jedis.hmget("redisHash", "name", "age");

在这里插入图片描述
这边不太明白的,还是先去理解redis——基本介绍以及 五种 数据类型 ,这边不再过多赘述,都是些api的使用

其他常用api,什么自增自减这些又兴趣可以自己试试

在这里插入图片描述

这边介绍一个判断key是否存在

 jedis.exists("key")

存在返回true,反之false ,开发中判断会用到

方式二 redisTemplate

依赖


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

注入对象

 @Resource
    private RedisTemplate redisTemplate;

使用

在这里插入图片描述
可以看到有很多种方法,这边直接贴出一个通用工具类,仔细看代码中的注释就知道每个方法对应的数据类型使用了


package com.test1.demo;

import org.springframework.data.redis.core.BoundSetOperations;
import org.springframework.data.redis.core.HashOperations;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.ValueOperations;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;
import java.util.*;
import java.util.concurrent.TimeUnit;

/**
 * spring redis 工具类
 **/
@SuppressWarnings(value = { "unchecked", "rawtypes" })
@Component
public class RedisCache
{
    @Resource
    public RedisTemplate redisTemplate;

    /**
     * 缓存基本的对象,Integer、String、实体类等
     *
     * @param key 缓存的键值
     * @param value 缓存的值
     */
    public <T> void setCacheObject(final String key, final T value)
{
        redisTemplate.opsForValue().set(key, value);
    }

    /**
     * 缓存基本的对象,Integer、String、实体类等
     *
     * @param key 缓存的键值
     * @param value 缓存的值
     * @param timeout 时间
     * @param timeUnit 时间颗粒度
     */
    public <T> void setCacheObject(final String key, final T value, final Integer timeout, final TimeUnit timeUnit)
{
        redisTemplate.opsForValue().set(key, value, timeout, timeUnit);
    }

    /**
     * 设置有效时间
     *
     * @param key Redis键
     * @param timeout 超时时间
     * @return true=设置成功;false=设置失败
     */
    public boolean expire(final String key, final long timeout)
{
        return expire(key, timeout, TimeUnit.SECONDS);
    }

    /**
     * 设置有效时间
     *
     * @param key Redis键
     * @param timeout 超时时间
     * @param unit 时间单位
     * @return true=设置成功;false=设置失败
     */
    public boolean expire(final String key, final long timeout, final TimeUnit unit)
{
        return redisTemplate.expire(key, timeout, unit);
    }

    /**
     * 获取有效时间
     *
     * @param key Redis键
     * @return 有效时间
     */
    public long getExpire(final String key)
{
        return redisTemplate.getExpire(key);
    }

    /**
     * 判断 key是否存在
     *
     * @param key 键
     * @return true 存在 false不存在
     */
    public Boolean hasKey(String key)
{
        return redisTemplate.hasKey(key);
    }

    /**
     * 获得缓存的基本对象。
     *
     * @param key 缓存键值
     * @return 缓存键值对应的数据
     */
    public <T> T getCacheObject(final String key)
{
        ValueOperations<String, T> operation = redisTemplate.opsForValue();
        return operation.get(key);
    }

    /**
     * 删除单个对象
     *
     * @param key
     */
    public boolean deleteObject(final String key)
{
        return redisTemplate.delete(key);
    }

    /**
     * 删除集合对象
     *
     * @param collection 多个对象
     * @return
     */
    public boolean deleteObject(final Collection collection)
{
        return redisTemplate.delete(collection) > 0;
    }

    /**
     * 缓存List数据
     *
     * @param key 缓存的键值
     * @param dataList 待缓存的List数据
     * @return 缓存的对象
     */
    public <T> long setCacheList(final String key, final List<T> dataList)
{
        Long count = redisTemplate.opsForList().rightPushAll(key, dataList);
        return count == null ? 0 : count;
    }

    /**
     * 获得缓存的list对象
     *
     * @param key 缓存的键值
     * @return 缓存键值对应的数据
     */
    public <T> List<T> getCacheList(final String key)
{
        return redisTemplate.opsForList().range(key, 0, -1);
    }

    /**
     * 缓存Set
     *
     * @param key 缓存键值
     * @param dataSet 缓存的数据
     * @return 缓存数据的对象
     */
    public <T> BoundSetOperations<String, T> setCacheSet(final String key, final Set<T> dataSet)
{
        BoundSetOperations<String, T> setOperation = redisTemplate.boundSetOps(key);
        Iterator<T> it = dataSet.iterator();
        while (it.hasNext())
        {
            setOperation.add(it.next());
        }
        return setOperation;
    }

    /**
     * 获得缓存的set
     *
     * @param key
     * @return
     */
    public <T> Set<T> getCacheSet(final String key)
{
        return redisTemplate.opsForSet().members(key);
    }

    /**
     * 缓存Map
     *
     * @param key
     * @param dataMap
     */
    public <T> void setCacheMap(final String key, final Map<String, T> dataMap)
{
        if (dataMap != null) {
            redisTemplate.opsForHash().putAll(key, dataMap);
        }
    }

    /**
     * 获得缓存的Map
     *
     * @param key
     * @return
     */
    public <T> Map<String, T> getCacheMap(final String key)
{
        return redisTemplate.opsForHash().entries(key);
    }

    /**
     * 往Hash中存入数据
     *
     * @param key Redis键
     * @param hKey Hash键
     * @param value 值
     */
    public <T> void setCacheMapValue(final String key, final String hKey, final T value)
{
        redisTemplate.opsForHash().put(key, hKey, value);
    }

    /**
     * 获取Hash中的数据
     *
     * @param key Redis键
     * @param hKey Hash键
     * @return Hash中的对象
     */
    public <T> T getCacheMapValue(final String key, final String hKey)
{
        HashOperations<String, String, T> opsForHash = redisTemplate.opsForHash();
        return opsForHash.get(key, hKey);
    }

    /**
     * 获取多个Hash中的数据
     *
     * @param key Redis键
     * @param hKeys Hash键集合
     * @return Hash对象集合
     */
    public <T> List<T> getMultiCacheMapValue(final String key, final Collection<Object> hKeys)
{
        return redisTemplate.opsForHash().multiGet(key, hKeys);
    }

    /**
     * 删除Hash中的某条数据
     *
     * @param key Redis键
     * @param hKey Hash键
     * @return 是否成功
     */
    public boolean deleteCacheMapValue(final String key, final String hKey)
{
        return redisTemplate.opsForHash().delete(key, hKey) > 0;
    }

    /**
     * 获得缓存的基本对象列表
     *
     * @param pattern 字符串前缀
     * @return 对象列表
     */
    public Collection<String> keys(final String pattern)
{
        return redisTemplate.keys(pattern);
    }


    /**
     * 生成唯一编号,没有过期时间
     */
    public  String  getCode() {
        Long serialNum = redisTemplate.opsForValue().increment("JG", 1L);
        return "JG" +String.format("%06d",serialNum);
    }
}

以上就是redis 在开发中的使用了,欢迎讨论指正!!

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

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

相关文章

smart Java——Netty实战(上):select/poll/epoll、NIOReactor模型

文章目录 1.多路复用——select、poll、epoll底层原理2.NIOReactor模型&#xff08;1&#xff09;单Reactor单线程模型&#xff08;2&#xff09;单Reactor多线程模型&#xff08;3&#xff09;主从Reactor多线程模型&#xff08;Netty&#xff09; 3.Netty核心组件&#xff08…

备战金九银十,互联网大厂1000道java高频面试知识点(附答案,赶紧收藏)

Java 面试八股文有必要背吗&#xff1f; 我的回答是&#xff1a;很有必要。你可以讨厌这种模式&#xff0c;但你一定要去背&#xff0c;因为不背你就进不了大厂。现如今&#xff0c;Java 面试的本质就是八股文&#xff0c;把八股文面试题背好&#xff0c;面试才有可能表现好。…

卷积实现—im2col+gemm

普通卷积 看卷积的实现&#xff0c;先看其普通的计算方式&#xff1a;滑窗计算和其计算shape大小的公式&#xff0c;以及各个卷积特性对其计算的影响&#xff0c;比如&#xff1a;stride&#xff0c;group&#xff0c;dilation&#xff0c;pad等。 H o u t ( H i n − k h p …

OpenGL 帧缓冲

1.简介 我们已经使用了很多屏幕缓冲了&#xff1a;用于写入颜色值的颜色缓冲、用于写入深度信息的深度缓冲和允许我们根据一些条件丢弃特定片段的模板缓冲。这些缓冲结合起来叫做帧缓冲(Framebuffer)&#xff0c;它被储存在内存中。OpenGL允许我们定义我们自己的帧缓冲&#x…

Fiddler不仅可以抓包,还可以做接口测试喔

前言 Fiddler最大的优势在于抓包&#xff0c;我们大部分使用的功能也在抓包的功能上&#xff0c;Fiddler做接口测试也是非常方便的。对应没有接口测试文档的时候&#xff0c;可以直接抓完包后&#xff0c;copy请求参数&#xff0c;修改下就可以了。 Composer简介 点开右侧Co…

模拟电路系列分享-晶体管的四种状态

目录 概要 整体架构流程 技术名词解释 1.截止状态 2.放大状态 3.饱和状态 4.倒置状态 技术细节 小结 概要 提示&#xff1a;这里可以添加技术概要 晶体管有4种工作状态&#xff0c;分别是截止、放大、饱和&#xff0c;以及倒置。 整体架构流程 提示&#xff1a;这里可以添加…

黑马程序员前端 Vue3 小兔鲜电商项目——(九)购物车

文章目录 本地购物车添加购物车头部购物车模板代码渲染数据 删除功能实现购物车统计信息列表购物车-基础内容渲染模版代码路由配置渲染列表 列表购物车-单选功能实现列表购物车-全选功能实现列表购物车-统计数据功能实现 接口购物车加入购物车删除购物车 退出登录-清空购物车购…

Matplotlib - 绘制 带有对角线的散点图 (Diagonal Scatter Plots) 函数源码

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://blog.csdn.net/caroline_wendy/article/details/131384440 Matplotlib 是一个用于绘制二维图形的 Python 库&#xff0c;提供了一个 pyplot 模块&#xff0c;用于创建各种类型的图表。其…

实战经验---好用的Midjourney提示词

说明&#xff1a;本文基于Midjourney&#xff08;下称MJ&#xff09;官方说明书整理&#xff0c;分2篇文章发布&#xff0c;这是第1篇。内容主要包括绘画指令&#xff08;Prompt&#xff09;、提示、参数、设置、模型选择等。 由于是整理文本&#xff0c;过程中个别地方为了显…

应对流量损耗:提升APP广告变现效果的关键策略!

​引言&#xff1a; 在APP广告变现的过程中&#xff0c;流量损耗是一个常见的问题&#xff0c;它不可避免地会发生。尽管开发者可以在合理的范围内承受这种损耗&#xff0c;但如果出现大范围的损耗&#xff0c;那就意味着在广告变现过程中出现了一些问题&#xff0c;限制了开发…

ThreadPoolExecutor的有参构造

核心要点 通过查看ThreadPoolExecutor里面的构造方法可以发现都是调用了方法参数最多的那个。 参数最多的构造方法展示 映入眼帘的是一些健壮性校验corePoolSize < 0&#xff1b;可以发现这个判断是核心线程的个数不能小于零。但是也就说明核心线程的个数可以等于零。maxim…

LLM - 搭建 DrugGPT 与药物分子领域结合的 ChatGPT 系统

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://blog.csdn.net/caroline_wendy/article/details/131384199 论文&#xff1a;DrugChat: Towards Enabling ChatGPT-Like Capabilities on Drug Molecule Graphs DrugChat&#xff0c;基…

【简单认识Nginx服务性能与安全优化】

文章目录 Nginx隐藏版本相关信息1.隐藏版本号2.修改版本号及相关信息 二、修改Nginx运行时的属主和属组三、配置Nginx网页缓存时间四、配置Nginx站点日志分割五、设置Nginx长连接及超时时间六、配置Nginx网页压缩七、配置Nginx防盗链1.模拟盗链2.配置防盗链并测试 Nginx隐藏版本…

【算法】数学相关知识总结

文章目录 gcd 和 lcm取模运算 %求一个点和一片矩形区域之间的最短距离 本文用于记录一些关于算法题中偶尔被使用到的数学相关知识。 gcd 和 lcm gcd 和 lcm 分别是 最大公约数&#xff08;Greatest common divisor&#xff09; 和 最小公因数&#xff08;Least Common Multip…

Nginx-redis【会话保持】

什么是会话保持 当用于登录一个网站服务器&#xff0c; 网站服务器会将用户的登录信息存储下来&#xff08;存储session&#xff09;&#xff0c;以保证我们能一直处于登录在线的状态 为什么要做会话保持 由于我们使用的是负载均衡轮询机制&#xff0c;会导致用户请求分散在…

nginx页面优化

文章目录 nginx页面优化一.nginx优化1.版本号1.1查看版本号1.2修改版本号1.2.1修改配置文件1.2.2修改源码文件&#xff0c;重新编译安装 2.nginx的日志分割2.1 写日志分割的脚本2.2给脚本执行权限、执行2.3创建定时任务可以每个月固定分割一次 3.nginx的页面压缩3.1配置3.2验证…

第1讲 Camera Sensor Driver课程简介

更多资源&#xff1a; 资源描述在线课程极客笔记在线课程知识星球星球名称&#xff1a;深入浅出Android Camera 星球ID: 17296815Wechat极客笔记圈 课程内容介绍 目标&#xff1a; 课程主要帮助大家理解camera sensor基本概念及原理知识&#xff0c;理解高通camera sensor驱…

前端开发——常用案例分享

✅作者简介&#xff1a;2022年博客新星 第八。热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏…

美one,不想只做李佳琦背后的MCN

文 | 螳螂观察 作者 | 青月 今年618&#xff0c;处在消费提振的关键时期&#xff0c;又面临着行业竞争日趋激烈&#xff0c;各大电商平台都希望能交出一份让市场满意的“期中答卷”&#xff0c;直播不可避免的成为了“兵家必争之地”。 京东请来了罗永浩与“交个朋友”入驻&a…

抖音seo矩阵系统源码|需求文档编译说明(二)

目录 1.抖音seo矩阵系统文档开发流程 2.各平台源码编译方式说明 3.底层技术功能表达式 1.抖音seo矩阵系统文档开发流程 ①产品原型 ②需求文档 ③产品流程图 ④部署方式说明 ⑤完整源码 ⑥源码编译方式说明 ⑦三方框架和SDK使用情况说明和代码位置 ⑧平台操作文档 ⑨程序架…