redis单机版本Java代码实践

news2024/11/22 16:30:14

pom依赖

引入redis的starter以及commons-pool2的依赖,commons-pool2是配置连接池需要使用的,不引入,只有连接池配置是不会创建连接池的

 <!-- redis -->
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-data-redis</artifactId>
    </dependency>
    <!-- spring2.X集成redis所需common-pool2-->
    <dependency>
      <groupId>org.apache.commons</groupId>
      <artifactId>commons-pool2</artifactId>
    </dependency>
    <dependency>
      <groupId>com.alibaba</groupId>
      <artifactId>fastjson</artifactId>
      <version>1.2.83</version>
    </dependency>

redis配置文件

这里使用lettuce作为演示

server.port=8080
# reids配置
spring.redis.client-type=lettuce
spring.redis.host=192.168.61.133
spring.redis.port=6379
spring.redis.password=123456
spring.redis.ssl=false
#超时时间 单位ms
spring.redis.timeout=100000
spring.redis.database=0
# 使用默认lettuce作为连接池,只有引入commons-pool2依赖才会创建连接池,仅有连接池配置不会创建连接池!
# 最大连接数
spring.redis.lettuce.pool.max-active=10
# 连接池中最大空闲连接
spring.redis.lettuce.pool.max-idel=3
# 连接池中最小空闲连接
spring.redis.lettuce.pool.min-idel=2
#最大建立连接等待时间。如果超过此时间将接到异常。设为-1表示无限制。
spring.redis.lettuce.pool.max-wait=60s

代码示例

这里将redis默认的序列化方式JdkSerializationRedisSerializer修改为了Jackson2JsonRedisSerializer,之所以要更换序列化方式,是因为默认的序列化方式,在redis中存储的数据无法直观看到其内容。但是更改了序列化方式后,存放的value只能是json格式,不能是纯字符串,如果是纯字符串,在取到数据后转换时会报错。
如果需要同时支持存储普通字符串,还需要同时创建StringRedisTemplate 的bean对象注入到容器中,这样就可以同时支持普通字符串和json形式的存储了。
个人感觉修改默认序列化方式不如直接使用stringRedisTemplate,把需要存的数据手动转为json字符串后再存入更好。

package com.example.lchtest.redis.tool;

import com.fasterxml.jackson.annotation.JsonAutoDetect;
import com.fasterxml.jackson.annotation.PropertyAccessor;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;

@Configuration
public class RedisConfig {
    @Bean
    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory connectionFactory) {
        // 默认是 RedisTemplate<Object, Object>, 这里修改为key是string类型
        RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
        redisTemplate.setConnectionFactory(connectionFactory);

        Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
        ObjectMapper om = new ObjectMapper();
        om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
        om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
        jackson2JsonRedisSerializer.setObjectMapper(om);
        StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();
        // key采用String的序列化方式
        redisTemplate.setKeySerializer(stringRedisSerializer);
        // hash的key也采用String的序列化方式
        redisTemplate.setHashKeySerializer(stringRedisSerializer);
        // value序列化方式采用jackson
        redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);
        // hash的value序列化方式采用jackson
        redisTemplate.setHashValueSerializer(jackson2JsonRedisSerializer);
        redisTemplate.afterPropertiesSet();
        return redisTemplate;
    }

    /**
     * value为字符串的redisTemplate
     *
     * @param connectionFactory
     * @return stringRedisTemplate bean对象
     */
    @Bean
    public StringRedisTemplate stringRedisTemplate(RedisConnectionFactory connectionFactory) {
        return new StringRedisTemplate(connectionFactory);
    }
}

redis工具类:

package com.example.lchtest.redis.tool;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Component;

import java.util.List;
import java.util.Map;
import java.util.concurrent.TimeUnit;

@Component
public class RedisUtil {

    @Autowired
    RedisTemplate<String,Object> redisTemplate;

    @Autowired
    StringRedisTemplate stringRedisTemplate;

    /**
     * setex
     * @param key  key
     * @param value  value
     * @param time 过期时间
     */
    public void setex(String key,Object value,long time){
        redisTemplate.opsForValue().set(key, value, time, TimeUnit.SECONDS);
    }

    /**
     * set
     * String类型的set,无过期时间
     * @param key key
     * @param value value
     */
    public void set(String key, Object value){
        redisTemplate.opsForValue().set(key,value);
    }

    public void setStrValue(String key, String value){
        stringRedisTemplate.opsForValue().set(key,value);
    }

    /**
     * 批量设置key和value
     * @param map key和value的集合
     */
    public void mset(Map<String,Object> map){
        redisTemplate.opsForValue().multiSet(map);
    }

    /**
     * 如果key不存在,则设置
     * @param key  key
     * @param value value
     * @return 返回是否成功
     */
    public Boolean setnx(String key,Object value){
        return redisTemplate.opsForValue().setIfAbsent(key, value);
    }

    /**
     * 批量插入key,如果key不存在的话
     * @param map key和value的集合
     * @return 是否成功
     */
    public Boolean msetnx(Map<String,Object> map){
        return redisTemplate.opsForValue().multiSetIfAbsent(map);
    }

    /**
     * String类型的get
     * @param key key
     * @return 返回value对应的对象
     */
    public Object get(String key){
        return redisTemplate.opsForValue().get(key);
    }

    public Object getStrValue(String key){
        return stringRedisTemplate.opsForValue().get(key);
    }

    /**
     * 删除对应key
     * @param key key
     * @return 返回是否删除成功
     */
    public Boolean del(String key){
        return redisTemplate.delete(key);
    }

    /**
     * 批量删除key
     * @param keys key的集合
     * @return 返回删除成功的个数
     */
    public Long del(List<String> keys){
        return redisTemplate.delete(keys);
    }

    /**
     * 给某个key设置过期时间
     * @param key key
     * @param time 过期时间
     * @return 返回是否设置成功
     */
    public Boolean expire(String key, long time){
        return redisTemplate.expire(key, time, TimeUnit.SECONDS);
    }

    /**
     * 返回某个key的过期时间
     * @param key key
     * @return 返回key剩余的过期时间
     */
    public Long ttl(String key){
        return redisTemplate.getExpire(key);
    }

    /**
     * 返回是否存在该key
     * @param key key
     * @return 是否存在该key
     */
    public Boolean exists(String key){
        return redisTemplate.hasKey(key);
    }

    /**
     * 给key的值加上delta值
     * @param key key
     * @param delta 参数
     * @return 返回key+delta的值
     */
    public Long incrby(String key, long delta){
        return redisTemplate.opsForValue().increment(key, delta);
    }

    /**
     * 给key的值减去delta
     * @param key key
     * @param delta 参数
     * @return 返回key - delta的值
     */
    public Long decrby(String key, long delta){
        return redisTemplate.opsForValue().decrement(key, delta);
    }

    //hash类型

    /**
     * set hash类型
     * @param key key
     * @param hashKey  hashKey
     * @param value value
     */
    public void hset(String key,String hashKey, Object value){
        redisTemplate.opsForHash().put(key, hashKey, value);
    }

    /**
     * set hash类型,并设置过期时间
     * @param key  key
     * @param hashKey hashKey
     * @param value value
     * @param time 过期时间
     * @return 返回是否成功
     */
    public Boolean hset(String key, String hashKey,Object value, long time){
        hset(key, hashKey, value);
        return expire(key, time);
    }

    /**
     * 批量设置hash
     * @param key key
     * @param map hashKey和value的集合
     * @param time 过期时间
     * @return 是否成功
     */
    public Boolean hmset(String key, Map<String,Object> map, long time){
        redisTemplate.opsForHash().putAll(key, map);
        return expire(key, time);
    }

    /**
     * 获取hash类型的值
     * @param key key
     * @param hashKey hashKey
     * @return 返回对应的value
     */
    public Object hget(String key, String hashKey){
        return redisTemplate.opsForHash().get(key, hashKey);
    }

    /**
     * 获取key下所有的hash值以及hashKey
     * @param key key
     * @return 返回数据
     */
    public Map<Object,Object> hgetall(String key){
        return redisTemplate.opsForHash().entries(key);
    }

    /**
     * 批量删除
     * @param key  key
     * @param hashKey hashKey数组集合
     */
    public void hdel(String key, Object... hashKey){
        redisTemplate.opsForHash().delete(key, hashKey);
    }

    /**
     * 判断是否存在hashKey
     * @param key  key
     * @param hashKey hashKey
     * @return 是否存在
     */
    public Boolean hexists(String key, String hashKey){
        return redisTemplate.opsForHash().hasKey(key, hashKey);
    }
}

测试类:

package com.example.lchtest.redis.test;

import com.alibaba.fastjson.JSON;
import com.example.lchtest.redis.tool.RedisUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.Arrays;
import java.util.List;
import java.util.Objects;

@RestController
public class RedisTestController {

    @Autowired
    RedisUtil redisUtil;

    @GetMapping("/save")
    public String save(String key, String value){
        redisUtil.setStrValue(key, value);
        return "OK";
    }


    @GetMapping("/saveJsonStr")
    public String save(){
        User user2 = new User();
        user2.setName("tom");
        user2.setAge(23);
        redisUtil.setStrValue("userJson", JSON.toJSONString(user2));
        return "OK";
    }

    @GetMapping("/getvalue")
    public String save(String key){
        Object value = redisUtil.getStrValue(key);
        return Objects.isNull(value) ? "NULL" : (String)value;
    }

    @GetMapping("/saveJson")
    public String saveJson(){
        User user = new User();
        user.setAge(20);
        user.setName("jack");
        User user2 = new User();
        user2.setName("tom");
        user2.setAge(23);
        List<User> userList = Arrays.asList(user, user2);
        redisUtil.set("user", user);
        redisUtil.set("userList", userList);
        return  JSON.toJSONString(redisUtil.get("user"));
    }
}

数据库中存储的数据格式:

使用Jackson2JsonRedisSerializer序列化后存储的对象:
在这里插入图片描述
使用Jackson2JsonRedisSerializer序列化后存储的list:
在这里插入图片描述
对象手动转换为json串后存储:
在这里插入图片描述

代码地址:
https://gitee.com/liuch890228/springboot/tree/master/springbootdemo/springboot-demo8-redis

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

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

相关文章

k8s的一些基本概念

目录 masterNodePod和ContainerControllerService和IngressLabelSecretVolumeReplicationController和ReplicaSetDeploymentDaemonSetJobCronJobStatefulSetNamespace 推荐k8s中文文档&#xff0c;里面有各种概念的具体用法http://docs.kubernetes.org.cn/437.html 一个k8s集群…

Spring Boot 整合MyBatis 和 Spring Boot 整合MyBatis-Plus

目录 Spring Boot 整合MyBatis 代码配置实现 创建数据库和表 使用灵活的方式创建maven 创建resources/application.yml &#xff0c;配置数据源参数, 并完成Spring Boot 项目启动测试 测试DruidDataSourceConfig 创建MonsterMapper接口 创建resources\mapper\MonsterMap…

开发笔记之:文件读取溢出分析(QT C++版)

&#xff08;1&#xff09;引言 以下是QT C读取数据文件&#xff08;QDataStream&#xff09;的代码&#xff1a; /*** 按双字读取* param fis 文件输入流* param isBigEndian 是否大头&#xff08;字节序&#xff09;* return 双字值*/ DWORD FsFileUtil::readAsD…

工欲善其事必先利其器——开发神器(IDEA)

&#x1f525;IDEA 简介&#x1f525;IDEA的特色功能&#x1f525;IDEA的优点&#x1f525;IDEA 的使用&#x1f525;IDEA的常用快捷键 &#x1f525;IDEA 简介 IDEA 全称 IntelliJ IDEA&#xff0c;是 java 编程语言开发的集成环境&#xff0c;被公认为最好的 java 开发工具之…

如何轻松搭建一套行情回放系统

一个量化策略在生产&#xff08;交易&#xff09;环境中运行时&#xff0c;实时数据的处理通常是由事件驱动的。为确保研发和生产使用同一套代码&#xff0c;通常在研发阶段需将历史数据&#xff0c;严格按照事件发生的时间顺序进行回放&#xff0c;以此模拟交易环境。在 Dolph…

ChatGPT 提问,软件杂项部分

堆内存与栈内存一般分别 有多少 ChatGPT 堆内存和栈内存的大小取决于操作系统和编译器的限制以及程序的运行环境。以下是一些常见的默认大小范围&#xff0c;但请注意这些值可以因环境而异&#xff1a; 栈内存大小&#xff1a; Windows平台&#xff1a;默认情况下&#xff…

vue3 大致总结

一、开发、生产、测试环境的文件编写 需要以VITE开头&#xff01;&#xff01;&#xff01; 输出时&#xff1a;console.log(import.meta.env.VITE_ENV,"------***---------"); 二、路由守卫 1、全局路由守卫beforeEach和afterEach ①全局前置守卫beforeEach ②…

六、达梦8数据库适配记录

达梦数据库适配记录 记录关于我的业务微服务,适配国产达梦数据库的过程,以及遇到的一些错误问题和其解决方案。 目前的项目最初基于Mysql开发,现在要适配到达梦,不要以为迁移任务很easy,但实际过程中还是出现了很多问题。 基 由于达梦是的国产数据库,本身与MySQL数据库…

idea配置阿里云翻译

idea配置阿里云翻译 0前言1开通阿里云机器翻译2配置阿里云AccessKeyidea配置Translation 0前言 使用idea的码农们都应该对Translation这款插件不会陌生了&#xff0c;尤其是英语基础比较薄弱的盆友&#xff0c;在看源码的时候更是会经常使用Translation边翻边看源码。 但是由于…

EW代理工具的使用说明

一、EW介绍 Earthworm&#xff08;EW&#xff09; 是一套便携式的网络穿透工具&#xff0c;具有 SOCKS v5服务架设和端口转发两大核心功能&#xff0c;可在复杂网络环境下完成网络穿透。 该工具能够以“正向”、“反向”、“多级级联”等方式打通一条网络隧道&#xff0c;直达…

基于REST风格的SpringMVC请求路径设置与参数传递

文章目录 1 REST简介2 RESTful入门案例2.1 环境准备2.2 思路分析2.3 修改RESTful风格新增删除传递路径参数 修改根据ID查询查询所有 知识点1&#xff1a;PathVariable 3 RESTful快速开发知识点1&#xff1a;RestController知识点2&#xff1a;GetMapping PostMapping PutMappin…

【STL】

目录 什么是STLSTL定义两大特点两个层次 STL主要构成容器容器概念容器分类vectordequestackqueuelistset/multiset容器map/multimap容器 算法迭代器仿函数适配器空间配置器新的改变功能快捷键合理的创建标题&#xff0c;有助于目录的生成如何改变文本的样式插入链接与图片如何插…

选Ubuntu 还是 Fedora ?

提起开发&#xff0c;程序员们更青睐于不同版本的Linux操作系统而不是Windows。 为什么&#xff1f;因为Linux操作起来更安全、快捷&#xff0c;最重要的是&#xff0c;它的发行版本众多。你可以根据需要挑选最适合的那一款。那么&#xff0c;问题来了&#xff0c;到底哪个版本…

开源地质建模GemPy实战

推荐&#xff1a;用 NSDT设计器 快速搭建可编程3D场景。 在设计任何类型的工程结构时&#xff0c;确定地面以下的东西并有效地将其映射出来是首要也是最重要的部分之一。 地下建模带有很大的误差范围&#xff0c;因为即使是我们今天使用的最先进的地下调查方法也无法完全绘制出…

【Linux】信号概述

目录 1、信号概念2、Linux常用信号表3、信号的5种默认处理动作 橙色 1、信号概念 信号是 Linux进程间通信的最古老的方式之一&#xff0c;是事件发生时对进程的通知机制&#xff0c;有时也称之为软件中断&#xff0c;它是在软件层次上对中断机制的一种模拟&#xff0c;是一种…

Vue3(6) Transition

目录 组件 基于CSS的过渡效果 JavaScript钩子 Vue 提供了两个内置组件&#xff0c;可以帮助你制作基于状态变化的过渡和动画&#xff1a; <Transition> 会在一个元素或组件进入和离开 DOM 时应用动画。 <TransitionGroup> 会在一个 v-for 列表中的元素或组件被…

C++模板template

我们现在有几个变量&#xff0c;我们向要实现他们的交换&#xff0c;所以我们现在写了一个swap函数 我们现在可以实现对这两个变量之间的交换&#xff0c; 那么我们有有两个变量需要交换呢&#xff1f;&#xff1f; 我们刚才的Swap函数的参数是int类型的&#xff0c;我们现在的…

ChatGPT 和对话式 AI 的未来:2023 年的进展和应用

人工智能(Artificial Intelligence)在过去一段时间以来以前所未有的速度快速发展。从自动化日常任务到重要提醒的设定,AI以各种方式渗透到我们的生活中。然而,在这个领域中迈出的最重要一步是ChatGPT。 ChatGPT被瑞银(UBS)评为“有史以来增长最快的消费者应用程序”,于…

Cy5.5-PEG-SH近红外荧光PEG试剂 Cyanine5.5-PEG-SH,Thiol-PEG-Cy5.5可用于活体成像

Cy5.5-PEG-SH &#xff0c;Cy5.5聚乙二醇巯基 英文名称&#xff1a;Cy5.5-PEG-SH 中文名称&#xff1a;Cy5.5聚乙二醇巯基 性状: 深蓝色固体或粘性液体&#xff0c;取决于分子量 溶剂&#xff1a;溶于水、 DMSO等常规性有机溶剂 激发/发射波长&#xff1a;684 nm/710 nm …

Windows操作系统重要内容

windows 常用用户&#xff1a; SYSTEM&#xff1a;本地机器上拥有最高权限的用户。&#xff08;为系统核心组件访问文件资源提供权限&#xff09;Administrator&#xff1a;默认系统管理员用户。Guest&#xff1a;只拥有相对较少的权限&#xff0c;默认被禁用。 Windows 常见…