redis单机版本Java代码实践

news/2024/4/28 19:14:37/文章来源:https://blog.csdn.net/weixin_41300437/article/details/130751336

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 {@Beanpublic 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序列化方式采用jacksonredisTemplate.setValueSerializer(jackson2JsonRedisSerializer);// hash的value序列化方式采用jacksonredisTemplate.setHashValueSerializer(jackson2JsonRedisSerializer);redisTemplate.afterPropertiesSet();return redisTemplate;}/*** value为字符串的redisTemplate** @param connectionFactory* @return stringRedisTemplate bean对象*/@Beanpublic 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 {@AutowiredRedisTemplate<String,Object> redisTemplate;@AutowiredStringRedisTemplate 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 {@AutowiredRedisUtil 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.luyixian.cn/news_show_303080.aspx

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

相关文章

基于协同过滤的推荐算法

基于协同过滤的推荐算法 基于协同过滤&#xff08;CF&#xff09;的推荐基于近邻的协同过滤基于用户的协同过滤&#xff08;User-CF&#xff09;基于物品的协同过滤&#xff08;Item-CF&#xff09;User-CF 和 Item-CF 的比较基于协同过滤的推荐优缺点基于模型的协同过滤隐语义…

python类的高级函数

类的高级函数 __str__ 如果定义了该函数&#xff0c;当print当前实例化对象的时候&#xff0c;会返回该函数的return信息 用法&#xff1a; def __str__(self): return str_type 参数&#xff1a;无 返回值&#xff1a;一般返回对于该类的描述信息 __getattr__ 当调用的…

JavaWeb-RequestResponse的使用

Request&Response 今日目标 掌握Request对象的概念与使用掌握Response对象的概念与使用能够完成用户登录注册案例的实现能够完成SqlSessionFactory工具类的抽取 1&#xff0c;Request和Response的概述 Request是请求对象&#xff0c;Response是响应对象。这两个对象在我们…

深入理解Java虚拟机:JVM高级特性与最佳实践-总结-7

深入理解Java虚拟机&#xff1a;JVM高级特性与最佳实践-总结-7 类文件结构概述无关性的基石 虚拟机类加载机制概述类加载的时机 类文件结构 代码编译的结果从本地机器码转变为字节码&#xff0c;是存储格式发展的一小步&#xff0c;却是编程语言发展的一大步 概述 我们写的程…

在阿里做了6年软件测试,4月无情被辞,想给划水的兄弟提个醒

先简单交代一下背景吧&#xff0c;某不知名 985 的本硕&#xff0c;17 年毕业加入阿里&#xff0c;以“人员优化”的名义无情被裁员&#xff0c;之后跳槽到了有赞&#xff0c;一直从事软件测试的工作。之前没有实习经历&#xff0c;算是6年的工作经验吧。 这6年之间完成了一次…

060:cesium设置网格Grid材质

第060个 点击查看专栏目录 本示例的目的是介绍如何在vue+cesium中设置网格材质,请参考源代码,了解GridMaterialProperty的应用。 直接复制下面的 vue+cesium源代码,操作2分钟即可运行实现效果. 文章目录 示例效果配置方式示例源代码(共93行)相关API参考:专栏目标示例效…

chatgpt赋能Python-python3_9_6怎么用

Python 3.9.6简介 Python 3.9.6是2021年6月28日发布的Python编程语言的最新版本&#xff0c;它提供了一些有用的新功能和改进&#xff0c;包括优化的解释器性能和可变构造体。它是一种功能强大的编程语言&#xff0c;既易于学习又易于使用&#xff0c;非常适用于开发Web应用程…

SaaS 产品如何选择设计协作工具?

文章内容转载腾讯 CoDesign 随着互联网及其衍生技术的发展&#xff0c;企业比以往更依赖内容去吸引、去培养自己的用户&#xff0c;寻求转化。小鹅通就是在微信生态中帮助企业通过知识服务去实现内容分发和流量聚合&#xff0c;帮助企业沉淀用户&#xff0c;提供深度私域运营服…

自定义颜色编辑选取对话框

一、简介 Qt中已经有一些封装好的对话框&#xff0c;比如QMessageBox、QColorDialog等&#xff0c;使用起来快捷方便&#xff0c;但缺点是我们无法为它们自定义样式&#xff0c;所以可能难以“融入”我们的项目。既然如此&#xff0c;那就自己做一个把。抱着这样的想法&#x…

如何成功申请计算机软件著作权【申请流程完整记录】

致谢 &#xff1a;此博文的编写包括软著的申请&#xff0c;均借鉴了大佬【万里守约】的博客 — 提示&#xff1a;此博文仅适合个人申请&#xff0c;因为我是自己一个人的项目&#xff0c;自己一个人申请软著 文章目录 前言&#xff1a;一、网站注册与实名认证二、材料准备软著申…

ChatGPT工作提效之初探路径独孤九剑遇强则强

ChatGPT工作提效之遇强则强 前言一、如何使用ChatGPT二、ChatGPT实战应用三、ChatGPT会叫的小孩有奶吃工具类的交互问答类的交互开发类的交互 前言 读《笑傲江湖》西湖比剑时&#xff0c;对于独孤九剑1的解读印象颇为深刻。令狐冲被任我行这个高手激发出许多精妙的剑招。这独孤…

nvm-windows安装和配置

1.下载nvm-windows https://github.com/coreybutler/nvm-windows/releases 进入后如下图 选择nvm-setup.exe下载 2.安装 2.1 运行安装包&#xff0c;同意协议&#xff0c;下一步 2.2 选择nvm的安装目录&#xff0c;安装路径名最好不要有空格 2.3 点击Next&#xff0c;设…

linux 串口改为固定

在/etc/udev/rules.d 目录下新建定义规则的文件 1. 文件名要按规范写否则改动无效2. 规则文件必须以.rules 结尾3. 规则文件名称必须遵循 xx-name.rules 格式&#xff08;xx 为数字或字母&#xff0c;name 为规则名称&#xff09;&#xff0c;例如 99-serial-ports.rules。4. 规…

chatgpt赋能Python-python3_8_5怎么保存

Python 3.8.5&#xff1a;什么是它&#xff0c;为什么它重要&#xff0c;以及如何安装和保存&#xff1f; Python是当今世界上最受欢迎的编程语言之一。Python 3.8.5是该语言的最新版本&#xff0c;它引入了一些重要的改进和新特性。这篇文章将介绍Python 3.8.5并向您展示如何…

windows搭建pyspark环境详细教程

一.安装jdk及配置环境变量: 下载地址&#xff1a; https://www.oracle.com/java/technologies/downloads/#java8-windows 安装步骤&#xff1a; 下载后点击安装&#xff0c;中途可以自定义安装路径&#xff0c;最后查看安装路径&#xff1a; 开始配置系统环境变量&#xff1a…

AJax和Axios的讲解

目录 Ajax Ajax基本介绍 同步异步 原生Ajax 原生的Ajax使用方式 Axios 基本介绍 Axios的基本使用 发送 get 请求 发送 post 请求 Axios快速入门 请求方法的别名 练习 Ajax Ajax基本介绍 Ajax: 全称Asynchronous JavaScript And XML&#xff0c;异步的JavaScript和XML…

Thematica: 炫彩主题与黑暗奇观的Vue3之旅

✅创作者:陈书予 🎉个人主页:陈书予的个人主页 🍁陈书予的个人社区,欢迎你的加入: 陈书予的社区 🌟专栏地址: 三十天精通 Vue 3 文章目录 一、介绍1.1 博客主题和目的1.2 Vue 3简介二、炫彩主题2.1 准备工作2.2 安装必要依赖2.3 创建Vue项目2.4 设置全局样式

计算机中存储器详解

文章目录 一、存储器的分类1. 按存储介质分类2. 按存取方式分类 二、存储器的层次结构三、CPU、缓存、主存、辅存之间的通信关系1. 缓存-主存层次2. 局部性原理3. 主存-辅存层次 一、存储器的分类 1. 按存储介质分类 2. 按存取方式分类 二、存储器的层次结构 在讲存储器的层次…

实验 2:树形数据结构的实现与应用

东莞理工学院的同学可以借鉴&#xff0c;请勿抄袭 1.实验目的 通过实验达到&#xff1a; 理解和掌握树及二叉树的基本概念&#xff1b; 理解和掌握二叉树的顺序存储结构、链式存储结构&#xff1b; 理解和掌握采用二叉链式存储结构下二叉树的各种遍历操作的思想及 其应用&a…

PMP课堂模拟题目及解析(第11期)

101. 一家咨询公司的负责人启动一个项目来扩大公司提供的服务数量&#xff0c;这公司具有竞争优势、出色的企业知识以及卓越的声誉&#xff0c;高管团队担心与增加新服务相关的负面业务结果的可能性。若要评估负面业务结果的可能性和影响&#xff0c;项目经理应该使用什么&…