今天遇到一个BUG,新创建不为零的数据,但是取到的值为零。一路Debug发现存数据貌似没有什么问题,取数据的代码逻辑上没有什么问题,但是却取不到数据。但是经过仔细研究发现,存数据的时候将数据存入了MySQL,而取数据的时候却是从Redis中取出,需要将存数据过程改为存入Redis。
//剩余次数存储在Redis中 RedissonUtil.set(CacheNameConstants.API_REAL_TOKEN + token, apisqPo.getDycs());
这时新存入的数据都能够正常的取到了,但之前的数据仍然无法取到。这时遇到的问题就是之前MySQL中的数据也需要存入Redis。
可以通过写一个测试类,来从MySQL中查询所有信息,并将其存入Redis中。
import xxxxxx
......
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import java.util.List;
@RunWith(SpringRunner.class)
@SpringBootTest
public class RedisInsert {
@Autowired
private GxApiYyglMapper gxApiYyglMapper;
@Test
public void insertToRedis() throws Exception{
List gxApiYygls = gxApiYyglMapper.findAll(GxApiYygl.class);
for(GxApiYygl gxApiYygl : gxApiYygls) {
String token = gxApiYygl.getToken();
RedissonUtil.set(CacheNameConstants.API_REAL_TOKEN + token,gxApiYygl.getSycs());
}
}
}
问题虽然很简单,但是在分析这个问题的过程中,有一些感触。
就像C(++)分配的内存一定要释放,malloc/free(new/delete)一定要成对出现那样,资源的获取与释放,连接的打开与关闭(或try with resource),数据的存取,一定要以相同的方式成对出现。
将项目中一些常用到的数据存储在Redis中能够大幅度改善性能。项目原来设计为将这些数据存储在MySQL中,更改代码逻辑使得这些数据存储在Redis后,出现了一些数据项为0的BUG。这时,虽然数据的存取方式相同且成对出现了,但是仍然改变不了与已经持久化的数据不兼容的问题。我们还需要将之前的数据同步到Redis中。
假如Redis的数据在持久化前丢失了,怎么办?能否定期将Redis的数据同步到MySQL中?这样能将损失尽可能减少。
数据库中的数据能够更改,人生过去的时光却不可能重来。人生就像区块链那样,经历过的一切,有过的幸运或是遗憾都不会改变,哪怕存取数据的方式已经更改。我们所能做的只有做好当下,不断优化自己的存取方式,争取能够把握住未来罢了。当然,我们也能将以前的数据同步到新的存储中,怎么做呢?读取旧的数据,并存入新的存储。具体来说就是,过去那些想做却又能力不够的事情,能不能再尝试一下呢?以后遇到了喜欢的姑娘,能不能鼓起勇气呢?曾经有过的梦想,能不能再去追一回呢?
往者不可谏,来者犹可追



