redis 解决key的乱码问题,并清理详解_Redis

来源:脚本之家  责任编辑:小易  

将乱码后的中文放入redis-key中,该怎么取值throws UnsupportedEncodingExceptionprivate static void method1()throws UnsupportedEncodingException {addKeyToHash();根据key取出转为乱码格式的字符串String s="天津;byte[]n2=s.getBytes("gb2312");String gn2=new String(n2,"utf-8");应该用对应的乱码去取Set<Tuple>res=jedis.zrangeWithScores("hot_projects_"+gn2,0,-1);Iterator<Tuple>it=res.iterator();while(it.hasNext()){Tuple t=it.next();System.out.println("element:"+t.getElement().toString()+",score:"+t.getScore());}}www.zgxue.com防采集请勿采集本网。

key乱码问题

不知道你是怎么搞的。正常情况下: 127.0.0.1:6379>hset aa i 123 (integer)1 127.0.0.1:6379>hset aa j 234 (integer)1 127.0.0.1:6379>hgetall aa 1)\"i 2)\"123 3)\"j 4)\"234 127.0.0.1:6379>del

因redis默认使用JdkSerializationRedisSerializer来进行序列化,造成key是乱码,如下:

Redis是一个非常NB的内存级的数据库,我们可以把很多”热数据“(即读写非常多的数据)放入其中来操作,这样就减少了和关系型数据库(如SqlServer/My Sql等)之间的交互,程序的响应速度也大大提升

keys '*!report:flag:phon*'

Plain Text code Array [id]=>1170202 [pid]=>0 [user]=>13520966111 [password]=>04cb57ee0653c0f49b5ec72afcf9a15d [image]=> [email]=> [sharenum]=>0 [invitenum]=>0 [clicknum]=>0 [money]=>1.000

1) "\xac\xed\x00\x05t\x00!report:flag:phone_156464"

我的做法是,程序端控制资源访问,设置读写锁,更新就请求写锁,读锁是共享的,但是读锁与写锁是互斥的。更新必须按顺序更新,读取可以并发。这样肯定对。因为确认不了redis的线程安全性,自己

2) "\xac\xed\x00\x05t\x00!report:flag:phone_198946"

redis的值有5种类型,不同的类型有不同的命令来获取:字符直接 get key 队列 左端弹出一个元素 LPOP key 哈希 HGET key field 集合 SMEMBERS key 返回集合中的所有元素 有序集合ZRANGE key start

3) "\xac\xed\x00\x05t\x00!report:flag:phone_183302"

解决key乱码

private RedisTemplate redisTemplate; @Autowired(required = false) public void setRedisTemplate(RedisTemplate redisTemplate) { RedisSerializer stringSerializer = new StringRedisSerializer(); redisTemplate.setKeySerializer(stringSerializer); redisTemplate.setValueSerializer(stringSerializer); redisTemplate.setHashKeySerializer(stringSerializer); redisTemplate.setHashValueSerializer(stringSerializer); this.redisTemplate = redisTemplate; }

清理乱码key

官方不支持 del '*keys'方式模糊/批量删除key。但是keys命令支持模糊匹配,所以采取以下方式:

方式1:可删除正常key,无法删除乱码key

redis-cli -h 192.168.1.21 -a password -n 2 --scan --pattern '*!report:flag:phon*' | xargs redis-cli -h 192.168.1.21 -a password -n 2 DEL

方式2:成功删除

del "\xac\xed\x00\x05t\x00!report:flag:phone_183302" "\xac\xed\x00\x05t\x00!report:flag:phone_198946"

补充知识:redis key和value的乱码问题解决,含日期转化格式问题

在项目中,遇到的问题是redis的key和value出现的乱码问题:在这里插入图片描述

而原本的内容为下:

{ "status":"success", "data":{ "id":3, "title":"花林", "price":99, "stock":81, "description":"美女一只", "sales":17, "imgUrl":"https://xiaolei1996.oss-cn-shanghai.aliyuncs.com/blog/title/we1.jpg", "promoStatus":2, "promoPrice":50, "promoId":1, "startDate":"2020-03-23 21:50:59" }}

原因: 是因为和redis内部的编码协议出现了问题,所以需要改进。spring提供了一个优化方案。springboot的redisTemplate改进。

@Component@EnableRedisHttpSession(maxInactiveIntervalInSeconds = 3600)public class RedisConfig { @Bean public RedisTemplate redisTemplate(RedisConnectionFactory factory){ RedisTemplate redisTemplate = new RedisTemplate(); redisTemplate.setConnectionFactory(factory); //首先解决key的序列化问题 StringRedisSerializer stringRedisSerializer = new StringRedisSerializer(); redisTemplate.setKeySerializer(stringRedisSerializer); //解决value的序列化问题 Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class); redisTemplate.setValueSerializer(jackson2JsonRedisSerializer); return redisTemplate; }}

比之前好了,但是还有点小问题,json的数据比以前多了,这是因为日期的转化出现问题,这块的知识触及盲区,就先把解决方案写下面,以后有时间在研究。

public class JodaDateTimeJsonSerializer extends JsonSerializer<DateTime> { @Override public void serialize(DateTime value, JsonGenerator gen, SerializerProvider serializers) throws IOException { gen.writeString(value.toString("yyyy-MM-dd HH:mm:ss")); }}

public class JodaDateTimeJsonDeserializer extends JsonDeserializer<DateTime> { @Override public DateTime deserialize(JsonParser p, DeserializationContext ctxt ) throws IOException, JsonProcessingException { String dateString= p.readValueAs(String.class); DateTimeFormatter dateTimeFormatter = DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss"); return DateTime.parse(dateString,dateTimeFormatter);//转成 }}

@Component@EnableRedisHttpSession(maxInactiveIntervalInSeconds = 3600)public class RedisConfig { @Bean public RedisTemplate redisTemplate(RedisConnectionFactory factory){ RedisTemplate redisTemplate = new RedisTemplate(); redisTemplate.setConnectionFactory(factory); //首先解决key的序列化问题 StringRedisSerializer stringRedisSerializer = new StringRedisSerializer(); redisTemplate.setKeySerializer(stringRedisSerializer); //解决value的序列化问题 Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class); redisTemplate.setValueSerializer(jackson2JsonRedisSerializer); //改进日期转化问题 ObjectMapper objectMapper = new ObjectMapper(); SimpleModule simpleModule = new SimpleModule(); simpleModule.addSerializer(DateTime.class,new JodaDateTimeJsonSerializer()); simpleModule.addDeserializer(DateTime.class,new JodaDateTimeJsonDeserializer());//解决反序列化问题objectMapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL); objectMapper.registerModule(simpleModule); jackson2JsonRedisSerializer.setObjectMapper(objectMapper); redisTemplate.setValueSerializer(jackson2JsonRedisSerializer); return redisTemplate; }}

最后终于出现了预期的效果

以上这篇redis 解决key的乱码问题,并清理详解就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持真格学网。

spring-data-redis的RedisTemplate,V>模板类在操作redis时默认使用JdkSerializationRedisSerializer来进行序列化,解决方案就是手动把序列化方式设置为StringRedisSerializer;代码如下private RedisTemplate,Object>redisTemplate;SuppressWarnings({"unchecked内容来自www.zgxue.com请勿采集。


  • 本文相关:
  • redis中的数据结构和编码详解
  • window手动操作清理redis缓存的技巧总结
  • redis中key的设置方法步骤
  • centos 7下安装 redis 3.0.6并配置集群的过程详解
  • redis cluster集群的介绍
  • 使用 redis 流实现消息队列的代码
  • 谈谈redis分布式锁的正确实现方法
  • redis中修改配置文件中的端口号 密码方法
  • redis 事务与过期时间详细介绍
  • redis中键的过期删除策略深入讲解
  • redis分布式锁的正确实现方法总结
  • redis中3种特殊的数据类型(bitmap、geo和hyperloglog)
  • centos7.5使用mysql_multi方式安装mysql5.7.28多实例(详解)
  • spring+jedis保存数据到redis的key乱码问题
  • 将乱码后的中文作为key放入redis后,取值时找不到key该怎么弄
  • redis设置缓存时key相同怎么处理
  • 如何读取redis中的key值中的结果
  • redis删除key的问题
  • redis 多个请求对一个key 实现 读取操作并发下怎么加锁
  • 如何读取redis中的key值中的结果
  • redis多线程处理下,同时设置一个key的值
  • 怎么生成验证码key放入redis
  • 如何读取redis中的key值中的结果
  • 网站首页网页制作脚本下载服务器操作系统网站运营平面设计媒体动画电脑基础硬件教程网络安全mssqlmysqlmariadboracledb2mssql2008mssql2005sqlitepostgresqlmongodbredisaccess数据库文摘数据库其它首页redis中的数据结构和编码详解window手动操作清理redis缓存的技巧总结redis中key的设置方法步骤centos 7下安装 redis 3.0.6并配置集群的过程详解redis cluster集群的介绍使用 redis 流实现消息队列的代码谈谈redis分布式锁的正确实现方法redis中修改配置文件中的端口号 密码方法redis 事务与过期时间详细介绍redis中键的过期删除策略深入讲解redis分布式锁的正确实现方法总结redis中3种特殊的数据类型(bitmap、geo和hyperloglog)centos7.5使用mysql_multi方式安装mysql5.7.28多实例(详解)超强、超详细redis数据库入门教程redis常用命令、常见错误、配置技redis操作命令总结redis中5种数据结构的使用场景介64位windows下安装redis教程redis中使用redis-dump导出、导入redis中统计各种数据大小的方法redis常用命令小结让redis在你的系统中发挥更大作用centos 6.6下redis安装配置记录redis教程(二):string数据类型redis配置认证密码的方法redis实现布隆过滤器的方法及原理从一个小需求感受redis的独特魅力(需求设redis中的动态字符串学习教程linux下redis安装配置教程利用redis实现sql伸缩的方法简介解决redis设置密码重启后失效的问题redis cluster集群数据分片机制原理redis集合类型的常用命令小结
    免责声明 - 关于我们 - 联系我们 - 广告联系 - 友情链接 - 帮助中心 - 频道导航
    Copyright © 2017 www.zgxue.com All Rights Reserved