[转帖]为什么我Redis中key惊现“乱码”?

为什么,redis,key,乱码 · 浏览次数 : 0

小编点评

**RedisTemplate配置** ```java // 使用 RedisTemplate 配置 redisTemplate = new RedisTemplate(); // 设置连接地址 redisTemplate.setConnectionFactory(new RedisConnectionFactory(redisAddress)); // 设置连接密码 redisTemplate.setPassword("your_password"); // 设置序列化器 redisTemplate.setDefaultSerializer(new JacksonSerializer()); // 设置序列化器反序列化器 redisTemplate.setDefaultDeserializer(new JacksonSerializer()); ```

正文

为什么Redis中key会惊现“乱码”?

最近在做一个秒杀项目,过程中大量应用到了redis。
而我在用ElasticJob进行数据化初始化到Redis数据库时发现这些key都出现了一段前缀“乱码”。
在这里插入图片描述
数据结构为Hash,可以观察到hashkey也带有前缀“乱码”
在这里插入图片描述
这究竟是怎么回事呢?原来问题出在这:
我使用的是RedisTemplate,而RedisTemplate会出现编码问题,需要自行配置,如果不想配置,可以使用StringRedisTemplate,因为StringRedisTemplate的源码中是有帮我们配置的,因此使用StringRedisTemplate即可完美解决“乱码”问题。

代码: 重点在12行

//让Spring扫描到
@Component
@Getter
@Setter
@Slf4j
public class MyInitSeckillProductsJob implements SimpleJob {
    //从nacos取cron
    @Value("${jobCron.initSeckillProduct}")
    private String cron;
    @Autowired
    private SeckillProductFeignApi seckillProductFeignApi;
    @Autowired//这里要用StringRedisTemplate
    private StringRedisTemplate redisTemplate;
<span class="token annotation punctuation">@Override</span>
<span class="token keyword">public</span> <span class="token keyword">void</span> <span class="token function">execute</span><span class="token punctuation">(</span>ShardingContext shardingContext<span class="token punctuation">)</span> <span class="token punctuation">{<!-- --></span>
    <span class="token function">doWork</span><span class="token punctuation">(</span>shardingContext<span class="token punctuation">.</span><span class="token function">getShardingParameter</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>

<span class="token comment">//shardingParameter 就是分片参数 time</span>
<span class="token keyword">public</span> <span class="token keyword">void</span> <span class="token function">doWork</span><span class="token punctuation">(</span>String time<span class="token punctuation">)</span> <span class="token punctuation">{<!-- --></span>
    <span class="token comment">//key</span>
    String SeckillProductKey <span class="token operator">=</span> JobRedisKey<span class="token punctuation">.</span>SECKILL_PRODUCT_LIST<span class="token punctuation">.</span><span class="token function">getRealKey</span><span class="token punctuation">(</span>time<span class="token punctuation">)</span><span class="token punctuation">;</span>
    String StockCountKey<span class="token operator">=</span>JobRedisKey<span class="token punctuation">.</span>SECKILL_STOCK_COUNT_HASH<span class="token punctuation">.</span><span class="token function">getRealKey</span><span class="token punctuation">(</span>time<span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token comment">//1.先把之前的数据删除掉</span>
    redisTemplate<span class="token punctuation">.</span><span class="token function">delete</span><span class="token punctuation">(</span>SeckillProductKey<span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token comment">//2.远程调用秒杀商品服务根据分片参数time查询出result</span>
    Result<span class="token operator">&lt;</span>List<span class="token generics function"><span class="token punctuation">&lt;</span>SeckillProductVo<span class="token punctuation">&gt;</span></span><span class="token operator">&gt;</span> result <span class="token operator">=</span> seckillProductFeignApi<span class="token punctuation">.</span><span class="token function">selectSeckillProductVoByTime</span><span class="token punctuation">(</span>Integer<span class="token punctuation">.</span><span class="token function">parseInt</span><span class="token punctuation">(</span>time<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token comment">//对list进行判空</span>
    <span class="token keyword">if</span> <span class="token punctuation">(</span>result <span class="token operator">!=</span> null <span class="token operator">&amp;&amp;</span> <span class="token operator">!</span>result<span class="token punctuation">.</span><span class="token function">hasError</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{<!-- --></span>
        <span class="token comment">//从result中取出data</span>
        List<span class="token generics function"><span class="token punctuation">&lt;</span>SeckillProductVo<span class="token punctuation">&gt;</span></span> data <span class="token operator">=</span> result<span class="token punctuation">.</span><span class="token function">getData</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
        <span class="token keyword">if</span> <span class="token punctuation">(</span>data <span class="token operator">!=</span> null <span class="token operator">&amp;&amp;</span> data<span class="token punctuation">.</span><span class="token function">size</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">&gt;</span> <span class="token number">0</span><span class="token punctuation">)</span> <span class="token punctuation">{<!-- --></span>
            <span class="token keyword">for</span> <span class="token punctuation">(</span>SeckillProductVo seckillProductVo <span class="token operator">:</span> data<span class="token punctuation">)</span> <span class="token punctuation">{<!-- --></span>
                <span class="token comment">//3.将Vo对象存到redis中</span>
                redisTemplate<span class="token punctuation">.</span><span class="token function">opsForHash</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">put</span><span class="token punctuation">(</span>SeckillProductKey<span class="token punctuation">,</span>seckillProductVo<span class="token punctuation">.</span><span class="token function">getId</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">+</span> <span class="token string">""</span><span class="token punctuation">,</span> JSON<span class="token punctuation">.</span><span class="token function">toJSONString</span><span class="token punctuation">(</span>seckillProductVo<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
                <span class="token comment">//4.将秒秒杀商品库存存到redis中</span>
                redisTemplate<span class="token punctuation">.</span><span class="token function">opsForHash</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">put</span><span class="token punctuation">(</span>StockCountKey<span class="token punctuation">,</span>seckillProductVo<span class="token punctuation">.</span><span class="token function">getId</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token operator">+</span><span class="token string">""</span><span class="token punctuation">,</span>seckillProductVo<span class="token punctuation">.</span><span class="token function">getStockCount</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token operator">+</span><span class="token string">""</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
                log<span class="token punctuation">.</span><span class="token function">info</span><span class="token punctuation">(</span><span class="token string">"今日秒杀商品数据初始化完成"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
            <span class="token punctuation">}</span>
        <span class="token punctuation">}</span>
    <span class="token punctuation">}</span>
<span class="token punctuation">}</span>

}

    解决编码问题之后的效果:
    在这里插入图片描述
    最后如果想了解如何使用RedisTemplate配置请浏览:
    Redis key 乱码问题(springboot)

    文章知识点与官方知识档案匹配,可进一步学习相关知识
    Java技能树首页概览90800 人正在系统学习中

    与[转帖]为什么我Redis中key惊现“乱码”?相似的内容:

    [转帖]为什么我Redis中key惊现“乱码”?

    为什么Redis中key会惊现“乱码”? 最近在做一个秒杀项目,过程中大量应用到了redis。 而我在用ElasticJob进行数据化初始化到Redis数据库时发现这些key都出现了一段前缀“乱码”。 数据结构为Hash,可以观察到hashkey也带有前缀“乱码” 这究竟是怎么回事呢?原来问题出在这

    [转帖]Redis进阶实践之十八 使用管道模式提高Redis查询的速度

    https://www.cnblogs.com/PatrickLiu/p/8580301.html 一、引言 学习redis 也有一段时间了,该接触的也差不多了。后来有一天,以前的同事问我,如何向redis中批量的增加数据,肯定是大批量的,为了这主题,我又重新找起了解决方案。目前的解决方案大都是从官

    [转帖]Redis进阶实践之十八 使用管道模式提高Redis查询的速度

    https://www.cnblogs.com/PatrickLiu/p/8580301.html 一、引言 学习redis 也有一段时间了,该接触的也差不多了。后来有一天,以前的同事问我,如何向redis中批量的增加数据,肯定是大批量的,为了这主题,我又重新找起了解决方案。目前的解决方案大都是从官

    [转帖]redis bigkey 删除问题

    一、慢操作分析 redis 的慢操作已经有了,如果没有,我们可以自己去 redis 服务器查看历史的慢日志操作,或者有对应的慢操作监控系统也可以发现问题,这里不做展开。 接下来我们就要看一看为什么这么慢。 看了下项目中的实现代码,结合日志一分析,发现是一个 redis bigkey。 一个 redi

    [转帖]编译实战 | 手摸手教你在Windows环境下运行Redis6.x

    原创:微信公众号 码农参上,欢迎分享,转载请保留出处。 哈喽大家好啊,我是没事就愿意瞎捣鼓的Hydra。 不知道有没有小伙伴像我一样,平常开发中用的是windows操作系统,有时候想装点什么软件,一看只支持linux系统,无奈要么启动虚拟机、要么装在云服务器上。 这不前几天又是这样,刚想用一下Red

    [转帖]高性能IO模型:为什么单线程Redis能那么快?

    https://zhuanlan.zhihu.com/p/596170085 你好,我是蒋德钧。 今天,我们来探讨一个很多人都很关心的问题:“为什么单线程的Redis能那么快?” 首先,我要和你厘清一个事实,我们通常说,Redis是单线程,主要是指Redis的网络IO和键值对读写是由一个线程来完成的

    [转帖]玩转REDIS-删除了两百万KEY,为什么内存依旧未释放?

    https://www.freesion.com/article/87101375552/ 《玩转Redis》系列文章主要讲述Redis的基础及中高级应用。本文是《玩转Redis》系列第【12】篇,最新系列文章请前往公众号“zxiaofan”(点我点我)查看,或百度搜索“玩转Redis zxiaof

    [转帖]Redis:我是如何与客户端进行通信的

    江湖上说,天下武功,无坚不摧,唯快不破,这句话简直是为我量身定制。 我是一个Redis服务,最引以为傲的就是我的速度,我的 QPS 能达到10万级别。 在我的手下有数不清的小弟,他们会时不时到我这来存放或者取走一些数据,我管他们叫做客户端,还给他们起了英文名叫 Redis-client。 有时候一个

    [转帖]【Jmeter】Jmeter压力测试工具安装及使用教程(redis测试)

    摘自:https://www.cnblogs.com/monjeo/p/9330464.html 一、Jmeter下载 进入官网:http://jmeter.apache.org/ 1.第一步进入官网如下图 2.选择进行下载,下载下来为一个压缩包,解压即可。 3.我下载的是jmeter4.0版本,对

    [转帖]为什么redis的SDS的最大长度限制为512mb?

    当客户端操作 client 时,一般不会直接使用 sds ,而是通过对象的方式来使用。比如创建的字符串其实是一个对象,间接使用到了 sds 结构。限制 512M 的逻辑在 t_string.c 的 checkStringLength 方法。 在redis3.2.13、redis4.0.14、redi