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相关推荐

  1. redistemplate分布式锁实现_基于 Redis SETNX 实现分布式锁

    环境与配置 Redis 任意版本即可 SpringBoot 任意版本即可,但是需要依赖 spring-boot-starter-data-redis <dependency><gro ...

  2. 在Java中使用redisTemplate操作缓存

    背景 在最近的项目中,有一个需求是对一个很大的数据库进行查询,数据量大概在几千万条.但同时对查询速度的要求也比较高. 这个数据库之前在没有使用Presto的情况下,使用的是Hive,使用Hive进行一 ...

  3. RedisTemplate常用方法总结

    很多公司都将redisTemplate进行了封装,封装成业务所需要的RedisUtil工具类方便进行调用,本篇文章总结了redisTemplate常用的一些方法. Redis常用的数据类型: Stri ...

  4. redistemplate文档用法_Jedis 使用及 StringRedisTemplate 常用方法

    Java官方推荐使用Jedis作为Redis的连接开发工具 1.Jedis 使用 1.1.添加依赖 org.springframework.boot spring-boot-starter-data- ...

  5. Redis 配置连接池,redisTemplate 操作多个db数据库,切换多个db,解决JedisConnectionFactory的设置连接方法过时问题。(转)

    Redis 配置连接池,redisTemplate 操作多个db数据库,切换多个db,解决JedisConnectionFactory的设置连接方法过时问题.(转) 参考文章: (1)Redis 配置 ...

  6. redis RedisTemplate实现分布式锁

    2019独角兽企业重金招聘Python工程师标准>>> 话不多说,上代码: import org.springframework.beans.factory.annotation.A ...

  7. Spring中使用RedisTemplate操作Redis(spring-data-redis)

    Redis 数据结构简介 Redis可以存储键与5种不同数据结构类型之间的映射,这5种数据结构类型分别为String(字符串).List(列表).Set(集合).Hash(散列)和 Zset(有序集合 ...

  8. RedisTemplate中opsForValue和opsForList方法使用

    一.opsForValue用法 key:字符串,value:可以是任意对象Object(例如String.具体对象如自定义类Student等),一个key只能对应一个value. 1)value为St ...

  9. Redis - RedisTemplate及4种序列化方式深入解读

    文章目录 概述 RedisTemplate StringRedisTemplate RedisSerializer 序列化 接口 JDK 序列化方式 (默认) String 序列化方式 JSON 序列 ...

最新文章

  1. jQuery 的选择器
  2. 用Reflector和FileDisassembler配合反编译.net Windows程序
  3. 访问控制管理的积极意义案例
  4. 查询sql打印日志配置
  5. 转:iOS应用程序生命周期(前后台切换,应用的各种状态)详解
  6. 你常吃的便利食品,正在加速你的衰老……研究发现饮食与DNA损伤有关
  7. 炮姐ed计算机谱子,炮姐来了!《科学超电磁炮T》正式PV公开 1月开播_游侠网 Ali213.net...
  8. 工具的使用 —— 搜狗输入法(二)
  9. jQuery 插件设置cookie
  10. 验证码识别——基于CNN+BLSTM+CTC秒杀不定长复杂验证码
  11. 对软件开发感到惊讶的共识
  12. 特种作业操作电工作业2021年电力电缆考试题库
  13. 关于淘宝自动登陆的尝试——神烦笔记
  14. 中国单体酒店联盟沃家商务酒店(长沙)简介
  15. python分词基础
  16. oracle怎么给表建同义词_oracle同义词创建(synonym)
  17. 简明python指南(预览版)
  18. 诗与远方:无题(九十六)- 空人空心
  19. 将Clound compare以及一些mathLab 等源码,集成到我们vs上来并编译
  20. kubectl认证 授权 准入控制

热门文章

  1. 如何用openvr api打开vive前置摄像头
  2. 号称用GPT-3开发的游戏,却活生生玩出了人性黑暗面
  3. Nature首次「博士后」前景调查:计算机、数学学者最乐观,63%的人想继续留在学界...
  4. 花式云毕业:《我的世界》建大学,日本机器人替身领证 | 网友:搞点阳间的东西...
  5. 马斯克发布脑机接口系统!芯片直连大脑,激光开颅放置,可用iPhone操控,网友炸了:这就是黑客帝国...
  6. 从网络世界有意识的脱离(翻译)——来自德国时代周刊
  7. 推进五通一平:手淘技术核心三大容器 五大方案首次整体亮相 百川开放全面升级...
  8. 修改wordpress地址(URL)导致不能登录后台
  9. intellij idea maven dependency自动补全
  10. Kafka Architecture