RedisTemplate
Spring Boot中Jedis几个api返回值的确认
@RequestMapping("/del/{key}")public String del(@PathVariable("key") String key) {try {//键不存在时,也不会抛异常 redisTemplate.delete(key);return "Success";} catch (Exception e) {return e.getMessage();}}
RedisTemplate如果是按以下设置的话,直接对String类型使用get方法获取值时,会报以下的错。原因是存放的数据是经过Serialize的。deserialize就是会报错。网上给一个解决办法是使用get(0,-1).
但是,这种场景下,不能使用increment方法,因为存放的值是经过Serialize的,不是数字了,不能increment
这种场景可以使用StringRedisTemplate ,如上例所示
org.springframework.data.redis.serializer.SerializationException : Cannot deserialize; nested exception is org.springframework.core.serializer.support.SerializationFailedException: Failed to deserialize payload. Is the byte array a result of corresponding serialization for DefaultDeserializer?; nested exception is java.io.EOFException
RedisTemplate<StringRedisSerializer, Serializable> rt = new RedisTemplate<>();rt.setConnectionFactory(jedisConnectionFactory());JdkSerializationRedisSerializer jdkSerializationRedisSerializer = new JdkSerializationRedisSerializer();rt.setKeySerializer(new StringRedisSerializer());rt.setValueSerializer(jdkSerializationRedisSerializer);
package com.rest;import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.connection.DataType; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.data.redis.core.StringRedisTemplate; import org.springframework.util.StringUtils; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController;import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.List;@RestController public class TestRedisTemplateOperation {@Autowiredprivate RedisTemplate redisTemplate;@Autowiredprivate StringRedisTemplate stringRedisTemplate;@RequestMapping("/add")public String set() {String key = "mykey";stringRedisTemplate.boundValueOps(key).increment(1);return key;}@RequestMapping("/get")public String get() {String key = "mykey";//如果key不存在时,Jedis会返回空字符串(key中无值时,redis会删除这个key)return stringRedisTemplate.boundValueOps(key).get();}@RequestMapping("/getList")public String getList() {String key = "myList";//如果key不存在时,Jedis会返回空集合(key中无值时,redis会删除这个key)。这种场景的返回值为"[]"return redisTemplate.boundListOps(key).range(0, -1).toString();}@RequestMapping("/setList/{element}")public void setList(@PathVariable("element") String element) {String key = "myList";redisTemplate.boundListOps(key).leftPush(element);}/*** [null, null, null, null, null]true;true;true;true;true;* hash不存在时的Operation是否为null:false* hash不存在,或hash存在但Key不存在时,删除时也不会抛异常** @return*/@RequestMapping("/getHash")public String getHash() {String key = "myHash";Collection collection = Arrays.asList(1, 2, 3, 4, 5);//如果Hash不存在时,Jedis会给每个field返回一个null;存在的field会返回相关的值//下例中会返回 [null, null, null, null, null]true;true;true;true;true;List list = redisTemplate.boundHashOps(key).multiGet(collection);String result = list.toString();for (Object value : list) {result = result + (value == null) + ";";}redisTemplate.delete(key);result = result + " \n hash不存在时的Operation是否为null:" + (redisTemplate.boundHashOps(key) == null);//删除hash中不存在的key时,是否会抛异常String tmpKey = "myHash2";redisTemplate.boundHashOps(tmpKey).delete("notExistKey");redisTemplate.boundHashOps(tmpKey).put("key2-hash", "value2-hash");redisTemplate.boundHashOps(tmpKey).delete("notExistKey");result = result + " \n hash不存在,或hash存在但Key不存在时,删除时也不会抛异常";return result;}@RequestMapping("/setHash/{field}/{value}")public void setHash(@PathVariable("field") String field, @PathVariable("value") String value) {String key = "myHash";//执行hmset myHash 1 value1后//mget的返回值为[value1, null, null, null, null]false;true;true;true;true; redisTemplate.boundHashOps(key).put(field, value);}/*** 存放在Redis中的返回值:* {"keyWithNullValue":null,"keyEmptyArrayList":[],"key2":"key2"}*/@RequestMapping("/set/hash/null")public void setHasWithNullValue() {String key = "myhashWithNull";redisTemplate.boundHashOps(key).put("keyWithNullValue", null);redisTemplate.boundHashOps(key).put("keyEmptyArrayList", new ArrayList<>());redisTemplate.boundHashOps(key).put("key2", "key2");}@RequestMapping("/redis/{key}")public String getRedisDataForkey(@PathVariable("key") String key) throws JsonProcessingException {if (!StringUtils.isEmpty(key) && redisTemplate.hasKey(key)) {ObjectMapper objectMapper = new ObjectMapper();DataType dataType = redisTemplate.type(key);String type = dataType.code();if ("string".equals(type)) {Object _obj = redisTemplate.opsForValue().get(key);return "string:" + objectMapper.writeValueAsString(_obj);}if ("list".equals(type)) {Object _obj = redisTemplate.boundListOps(key).range(0, -1);return "list:" + objectMapper.writeValueAsString(_obj);}if ("set".equals(type)) {Object _obj = redisTemplate.boundSetOps(key).members();return "set:" + objectMapper.writeValueAsString(_obj);}if ("zset".equals(type)) {Object _obj = redisTemplate.boundZSetOps(key).range(0, -1);return "zset:" + objectMapper.writeValueAsString(_obj);}if ("hash".equals(type)) {Object _obj = redisTemplate.boundHashOps(key).entries();return "Hash:" + objectMapper.writeValueAsString(_obj);}if ("none".equals(type)) {return "none:";}}return "no key";}}
org.springframework.data.redis.core.RedisConnectionUtils
private static void potentiallyRegisterTransactionSynchronisation(RedisConnectionHolder connHolder,final RedisConnectionFactory factory) {if (isActualNonReadonlyTransactionActive()) {if (!connHolder.isTransactionSyncronisationActive()) {connHolder.setTransactionSyncronisationActive(true);RedisConnection conn = connHolder.getConnection();conn.multi();//此处设置mutlTransactionSynchronizationManager.registerSynchronization(new RedisTransactionSynchronizer(connHolder, conn,factory));}}}
org.springframework.data.redis.connection.jedis.JedisConnection
public void multi() {if (isQueueing()) {return;}try {if (isPipelined()) {pipeline.multi();return;}this.transaction = jedis.multi();} catch (Exception ex) {throw convertJedisAccessException(ex);}}
redis.clients.jedis.BinaryJedis
public Transaction multi() { client.multi(); transaction = new Transaction(client);return transaction;}
RedisTemplate相关推荐
- redistemplate分布式锁实现_基于 Redis SETNX 实现分布式锁
环境与配置 Redis 任意版本即可 SpringBoot 任意版本即可,但是需要依赖 spring-boot-starter-data-redis <dependency><gro ...
- 在Java中使用redisTemplate操作缓存
背景 在最近的项目中,有一个需求是对一个很大的数据库进行查询,数据量大概在几千万条.但同时对查询速度的要求也比较高. 这个数据库之前在没有使用Presto的情况下,使用的是Hive,使用Hive进行一 ...
- RedisTemplate常用方法总结
很多公司都将redisTemplate进行了封装,封装成业务所需要的RedisUtil工具类方便进行调用,本篇文章总结了redisTemplate常用的一些方法. Redis常用的数据类型: Stri ...
- redistemplate文档用法_Jedis 使用及 StringRedisTemplate 常用方法
Java官方推荐使用Jedis作为Redis的连接开发工具 1.Jedis 使用 1.1.添加依赖 org.springframework.boot spring-boot-starter-data- ...
- Redis 配置连接池,redisTemplate 操作多个db数据库,切换多个db,解决JedisConnectionFactory的设置连接方法过时问题。(转)
Redis 配置连接池,redisTemplate 操作多个db数据库,切换多个db,解决JedisConnectionFactory的设置连接方法过时问题.(转) 参考文章: (1)Redis 配置 ...
- redis RedisTemplate实现分布式锁
2019独角兽企业重金招聘Python工程师标准>>> 话不多说,上代码: import org.springframework.beans.factory.annotation.A ...
- Spring中使用RedisTemplate操作Redis(spring-data-redis)
Redis 数据结构简介 Redis可以存储键与5种不同数据结构类型之间的映射,这5种数据结构类型分别为String(字符串).List(列表).Set(集合).Hash(散列)和 Zset(有序集合 ...
- RedisTemplate中opsForValue和opsForList方法使用
一.opsForValue用法 key:字符串,value:可以是任意对象Object(例如String.具体对象如自定义类Student等),一个key只能对应一个value. 1)value为St ...
- Redis - RedisTemplate及4种序列化方式深入解读
文章目录 概述 RedisTemplate StringRedisTemplate RedisSerializer 序列化 接口 JDK 序列化方式 (默认) String 序列化方式 JSON 序列 ...
最新文章
- jQuery 的选择器
- 用Reflector和FileDisassembler配合反编译.net Windows程序
- 访问控制管理的积极意义案例
- 查询sql打印日志配置
- 转:iOS应用程序生命周期(前后台切换,应用的各种状态)详解
- 你常吃的便利食品,正在加速你的衰老……研究发现饮食与DNA损伤有关
- 炮姐ed计算机谱子,炮姐来了!《科学超电磁炮T》正式PV公开 1月开播_游侠网 Ali213.net...
- 工具的使用 —— 搜狗输入法(二)
- jQuery 插件设置cookie
- 验证码识别——基于CNN+BLSTM+CTC秒杀不定长复杂验证码
- 对软件开发感到惊讶的共识
- 特种作业操作电工作业2021年电力电缆考试题库
- 关于淘宝自动登陆的尝试——神烦笔记
- 中国单体酒店联盟沃家商务酒店(长沙)简介
- python分词基础
- oracle怎么给表建同义词_oracle同义词创建(synonym)
- 简明python指南(预览版)
- 诗与远方:无题(九十六)- 空人空心
- 将Clound compare以及一些mathLab 等源码,集成到我们vs上来并编译
- kubectl认证 授权 准入控制
热门文章
- 如何用openvr api打开vive前置摄像头
- 号称用GPT-3开发的游戏,却活生生玩出了人性黑暗面
- Nature首次「博士后」前景调查:计算机、数学学者最乐观,63%的人想继续留在学界...
- 花式云毕业:《我的世界》建大学,日本机器人替身领证 | 网友:搞点阳间的东西...
- 马斯克发布脑机接口系统!芯片直连大脑,激光开颅放置,可用iPhone操控,网友炸了:这就是黑客帝国...
- 从网络世界有意识的脱离(翻译)——来自德国时代周刊
- 推进五通一平:手淘技术核心三大容器 五大方案首次整体亮相 百川开放全面升级...
- 修改wordpress地址(URL)导致不能登录后台
- intellij idea maven dependency自动补全
- Kafka Architecture