redisTemplate 键值序列化策略

RedisSerializer<T> StringRedisSerializer JdkSerializationRedisSerializer

keySerializer valueSerializer hashKeySerializer hashValueSerializer

public class RedisTemplate<K, V> extends RedisAccessor implements RedisOperations<K, V>, BeanClassLoaderAware {

    private boolean enableDefaultSerializer = true;
private RedisSerializer<?> defaultSerializer; private RedisSerializer keySerializer = null;
private RedisSerializer valueSerializer = null;
private RedisSerializer hashKeySerializer = null;
private RedisSerializer hashValueSerializer = null;
private RedisSerializer<String> stringSerializer = new StringRedisSerializer(); /* redisTemplate 默认的序列化策略 */
public void afterPropertiesSet() { super.afterPropertiesSet(); boolean defaultUsed = false; if (defaultSerializer == null) { defaultSerializer = new JdkSerializationRedisSerializer(
classLoader != null ? classLoader : this.getClass().getClassLoader());
} if (enableDefaultSerializer) { if (keySerializer == null) {
keySerializer = defaultSerializer;
defaultUsed = true;
}
if (valueSerializer == null) {
valueSerializer = defaultSerializer;
defaultUsed = true;
}
if (hashKeySerializer == null) {
hashKeySerializer = defaultSerializer;
defaultUsed = true;
}
if (hashValueSerializer == null) {
hashValueSerializer = defaultSerializer;
defaultUsed = true;
}
}
//启用默认序列化器并且默认序列化器被使用,检查默认序列化器为 null ,则序列化器没有全部初始化成功。
if (enableDefaultSerializer && defaultUsed) {
Assert.notNull(defaultSerializer, "default serializer null and not all serializers initialized");
} if (scriptExecutor == null) {
this.scriptExecutor = new DefaultScriptExecutor<K>(this);
} initialized = true;
}
}
keySerializer 字符串 哈希 列表 集合 有序集合的键的序列化策略。
valueSerializer 字符串 列表 集合 有序集合的值的序列化策略。
hashKeySerializer 哈希的小键的序列化策略
hashValueSerializer 哈希的值的序列化策略
StringRedisSerializer  只能是 String 对象
JdkSerializationRedisSerializer 实现了序列化接口的对象。

String 类型

RedisSerializer<T> 将一个对象序列化字节数组,存入 redis 。将 redis 得到的字节数组反序列化成对象。

public interface RedisSerializer<T> {
byte[] serialize(T t) throws SerializationException;
T deserialize(byte[] bytes) throws SerializationException;
}
@Test
public void testStrCR(){
redisTemplate.boundValueOps("用户名").set("刘备");
String username = (String) redisTemplate.boundValueOps("用户名").get();
System.out.println(username);//刘备
} @Test
public void testStrD(){
redisTemplate.delete("用户名");
} 127.0.0.1:6379> keys *
1) "\xe7\x94\xa8\xe6\x88\xb7\xe5\x90\x8d" UTF-8 用户名
2) "\xd3\xc3\xbb\xa7\xc3\xfb" GBK 用户名
127.0.0.1:6379> get "\xd3\xc3\xbb\xa7\xc3\xfb" GBK 用户名
"\xe5\x88\x98\xe5\xa4\x87" UTF-8 刘备
127.0.0.1:6379> get "\xe7\x94\xa8\xe6\x88\xb7\xe5\x90\x8d" UTF-8 用户名
"\xe5\x88\x98\xe5\xa4\x87" UTF-8 刘备 /*
可见 redis 命令行打印就是字节数组的16进制形式。中文字符串 + 编码 = 字节数组。客户端发送给 redis 的是字节数组。
*/
@Test
public void x3() throws UnsupportedEncodingException {
byte[] bytesUTF8 = "用户名".getBytes("UTF-8");
System.out.println(bytesToHexString(bytesUTF8));//e794a8e688b7e5908d
byte[] bytesGBK = "用户名".getBytes("GBK");
System.out.println(bytesToHexString(bytesGBK));//d3c3bba7c3fb
byte[] bytes= "刘备".getBytes("UTF-8");
System.out.println(bytesToHexString(bytes));//e58898e5a487
}

常用字节转换(字符串转16进制,16进制转字符串)https://blog.csdn.net/yyz_1987/article/details/80634224

public static String bytesToHexString(byte[] src){
StringBuilder stringBuilder = new StringBuilder("");
if (src == null || src.length <= 0) {
return null;
}
for (int i = 0; i < src.length; i++) {
int v = src[i] & 0xFF;
String hv = Integer.toHexString(v);
if (hv.length() < 2) {
stringBuilder.append(0);
}
stringBuilder.append(hv);
}
return stringBuilder.toString();
}
//原文:https://blog.csdn.net/yyz_1987/article/details/80634224
package org.springframework.data.redis.serializer;

public class StringRedisSerializer implements RedisSerializer<String> {

	private final Charset charset;

	public StringRedisSerializer() {
this(Charset.forName("UTF8"));
} public StringRedisSerializer(Charset charset) {
Assert.notNull(charset);
this.charset = charset;
} public String deserialize(byte[] bytes) {
return (bytes == null ? null : new String(bytes, charset));
} public byte[] serialize(String string) {
return (string == null ? null : string.getBytes(charset));
}
}

修改 redisTemplate 键值的序列化策略

<!-- 配置RedisTemplate -->
<bean id="redisTemplate" class="org.springframework.data.redis.core.RedisTemplate">
<property name="connectionFactory" ref="jedisConnectionFactory"/> <!-- 序列化策略 推荐使用StringRedisSerializer ,可以通过构造参数指定字符集,默认为 UTF-8 -->
<property name="keySerializer">
<bean class="org.springframework.data.redis.serializer.StringRedisSerializer">
<constructor-arg ref="gbkCharSet" />
</bean>
</property>
<property name="valueSerializer">
<bean class="org.springframework.data.redis.serializer.StringRedisSerializer"/>
</property> <property name="hashKeySerializer">
<bean class="org.springframework.data.redis.serializer.JdkSerializationRedisSerializer"/>
</property>
<property name="hashValueSerializer">
<bean class="org.springframework.data.redis.serializer.JdkSerializationRedisSerializer"/>
</property>
</bean>
package com.mozq.charset;

import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Component; import java.nio.charset.Charset; //@Component
@Configuration
public class CharSetUtil { @Bean("gbkCharSet")
public Charset gbkCharSet(){
return Charset.forName("GBK");
} }

redisTemplate 键值序列化策略的更多相关文章

  1. Redis 内存大小限制+键值淘汰策略配置

    限制最大内存 windows 的 maxmemory-policy 策略可能会少一些 # 指定 Redis 最大内存限制,Redis 在启动时会把数据加载到内存中,达到最大内存后,Redis 会先尝试 ...

  2. Azure KeyVault设置策略和自动化添加secrets键值对

    一. 关于Azure Key Vault Azure 密钥保管库可帮助保护云应用程序和服务使用的加密密钥和机密. 借助 Key Vault,可使用密钥来加密密钥和机密(例如身份验证密钥.存储帐户密钥. ...

  3. 将任意一个jQuery对象进行表单序列化,免除了提交请求时大量拼写表单数据的烦恼,支持键值对<name&value>格式和JSON格式。

    http://zhengxinlong.iteye.com/blog/848712 将任意一个jQuery对象进行表单序列化,免除了提交请求时大量拼写表单数据的烦恼,支持键值对<name& ...

  4. ASP.NET MVC WebApi 返回数据类型序列化控制(json,xml) 用javascript在客户端删除某一个cookie键值对 input点击链接另一个页面,各种操作。 C# 往线程里传参数的方法总结 TCP/IP 协议 用C#+Selenium+ChromeDriver 生成我的咕咚跑步路线地图 (转)值得学习百度开源70+项目

    ASP.NET MVC WebApi 返回数据类型序列化控制(json,xml)   我们都知道在使用WebApi的时候Controller会自动将Action的返回值自动进行各种序列化处理(序列化为 ...

  5. RedisTemplate通过scan方法进行自定义操作:1、根据hashKey的名称匹配相关hash键值对

    需求:有一个hash如下,现在想查询出stream前缀的键值对 操作方法如下: package com.example; import org.junit.Before; import org.jun ...

  6. JAVA整合Redis使用redisTemplate清除库中的所有键值对数据

    JAVA整合Redis使用redisTemplate清除库中的所有键值对数据,清除所有缓存数据 Set<String> keys = redisTemplate.keys("*& ...

  7. 7.Redis键值对数据库

    1.Redis的安装以及客户端连接 安装:apt-get install redis-server 卸载:apt-get purge --auto-remove redis-server 启动:red ...

  8. 【原】Learning Spark (Python版) 学习笔记(二)----键值对、数据读取与保存、共享特性

    本来应该上周更新的,结果碰上五一,懒癌发作,就推迟了 = =.以后还是要按时完成任务.废话不多说,第四章-第六章主要讲了三个内容:键值对.数据读取与保存与Spark的两个共享特性(累加器和广播变量). ...

  9. YbSoftwareFactory 代码生成插件【十五】:Show 一下最新的动态属性扩展功能与键值生成器功能

    YbSoftwareFactory 各种插件的基础类库中又新增了两个方便易用的功能:动态属性扩展与键值生成器,本章将分别介绍这两个非常方便的组件. 一.动态属性扩展 在实际的开发过程中,你肯定会遇到数 ...

随机推荐

  1. idea插件篇之java内存分析工具(JProfiler)

    前言在运行java的时候有时候想测试云运行时占用内存情况,这时候就需要使用测试工具查看了.在eclipse里面有 Eclipse Memory Analyzer tool(MAT)插件可以测试,而在i ...

  2. Debian/Ubuntu下安装Apache的Mod_Rewrite模块的步骤

    启用 Mod_rewrite 模块:sudo a2enmod rewrite 另外,也可以通过将 /etc/apache2/mods-available/rewrite.load 连接到 /etc/a ...

  3. oracle--查询速度慢

    查询速度慢的原因很多,常见如下几种: 1,  没有索引或者没有用到索引(这是查询慢最常见的问题,是程序设计的缺陷) 2, I/O吞吐量小,形成了瓶颈效应. 3, 没有创建计算列导致查询不优化. 4, ...

  4. 15 张 Vim 速查表奉上,帮你提高N倍效率!

    阅读本文大概需要 2.8 分钟. 去年上半年开始全面使用linux进行开发和娱乐了,现在已经回不去windows了. 话归正传,在linux上一直使用vim,慢慢熟悉了它的命令,才终于领悟了什么是编辑 ...

  5. 【ASP.NET Core分布式项目实战】(五)Docker制作dotnet core控制台程序镜像

    Docker制作dotnet core控制台程序镜像 基于dotnet SDK 新建控制台程序 mkdir /home/console cd /home/console dotnet new cons ...

  6. 微信企业号消息接口PHP SDK

    微信企业号消息接口PHP SDK及Demo <?php /* 方倍工作室 http://www.fangbei.org/ CopyRight 2015 All Rights Reserved * ...

  7. 用欧拉计划学Rust语言(第17~21题)

    最近想学习Libra数字货币的MOVE语言,发现它是用Rust编写的,所以先补一下Rust的基础知识.学习了一段时间,发现Rust的学习曲线非常陡峭,不过仍有快速入门的办法. 学习任何一项技能最怕没有 ...

  8. SQL -------- 简单的增删改查

    sql  结构化查询语言,一种ansi 的标准计算机语言,为了访问数据库 可以做什么:可以对数据库 和表进行创建于删除, 对表里面的数据进行增删改查. 也可以创建存储过程和视图,对表设置权限 RDBM ...

  9. 『Norma 分治』

    Norma Description Input Format 第1行,一个整数N: 第2~n+1行,每行一个整数表示序列a. Output Format 输出答案对10^9取模后的结果. Sample ...

  10. ioc与bean管理

    IOC称之为控制反转,简单来说就是将对象的创建的权利和对象的声明周期的管理过程交给Spring框架来处理,在这个开发过程中不再需要关注对象的创建和生命周期的管理,而是在需要的时由Spring框架提供, ...