首页 > 数据库 >@Cacheable和@CachePut存入redis的数据使用redisTemplate取出时为null的解决

@Cacheable和@CachePut存入redis的数据使用redisTemplate取出时为null的解决

时间:2023-04-09 23:00:50浏览次数:43  
标签:username Cacheable redis CachePut User key redisTemplate

当使用@Cacheable和@CachePut注解存数据到redis中时如果使用spring默认的redis key序列化方式时,使用redisTemplate取数据为null

@CacheConfig(cacheNames = "users")     存入redis users目录下取数据时的key为users::username
public interface UserRepository extends JpaRepository<User, Long> {
    @Query("from User u where u.username=:username")
    User findUser(@Param("username") String username);

    @Cacheable(key = "#p0")  //使用第一个参数作为key
    User findUserByUsername(String username);

    @CachePut(key = "#p0.username")
    User save(User user);
}

 

不配置redisTemplate的效果:

  @Test
    public void before() {
        userRepository.save(new User("AAA", 10));
        System.out.println("直接从redis取数据:" + redisTemplate.opsForValue().get("users::AAA"));
    }
  //Hibernate: insert into user (age, username) values (?, ?)

    //直接从redis取数据:null

 

 

配置redis key的序列化方式

@Configuration
public class RedisConfig {
     @Bean
    public RedisTemplate redisTemplate(RedisConnectionFactory redisConnectionFactory) {
        RedisTemplate redisTemplate = new RedisTemplate<>();
        redisTemplate.setConnectionFactory(redisConnectionFactory);
        GenericToStringSerializer<String> stringGenericToStringSerializer = new GenericToStringSerializer<>(String.class);
        redisTemplate.setKeySerializer(stringGenericToStringSerializer);
        redisTemplate.setHashKeySerializer(stringGenericToStringSerializer);
        redisTemplate.setStringSerializer(stringGenericToStringSerializer);
        redisTemplate.afterPropertiesSet();
        return redisTemplate;
    }        
}

配置完后打印结果

Hibernate: insert into user (age, username) values (?, ?)
直接从redis取数据:com.cw.study.domain.User@41cf4272

 

说明默认的redisTemplate序列化key的方式和@Cacheable、@CachePut序列化key的方式不同

标签:username,Cacheable,redis,CachePut,User,key,redisTemplate
From: https://www.cnblogs.com/wscw/p/17301369.html

相关文章

  • Redis随笔
    Redis简介Redis是一个开源的key-value存储系统。存储在内存中。相比于Memcached,value类型相对更多,string、list、set、zset、hash。Redis操作都是原子性的,单线程多路IO复用Redis支持各种不同方式的排序。 keys*查看当前库所有keyexistskey判断某个key是否存在typek......
  • MongoDB、Redis、HBase、Cassandra、Elasticsearch、ClickHouse等NoSQL数据库简介及优
    MongoDBMongoDB是一个基于文档的NoSQL数据库,它使用BSON(二进制JSON)格式存储数据。MongoDB支持动态查询,可以轻松地处理非结构化数据。它还支持水平扩展,可以在多个节点上分布数据。优点:灵活性高,支持非结构化数据存储。支持水平扩展,可以在多个节点上分布数据。支持动态查询,可......
  • Linux安装Redis
    1.下载下载地址:https://redis.io/download  本人选择的是5.0.14版本  上传服务器。本人上传至usr/local目录下。2.解压  将解压后的redis-5.0.14文件夹改名为redis3.编译cd到/usr/local/redis目录,输入命令make执行编译命令,接下来控制台会输出各种编译过程中输......
  • 爬虫最后一天,爬取到的数据存到mysql中,爬虫和下载中间件、加代理、cookie、header、se
    爬到的数据存到mysql中classFirstscrapyMySqlPipeline:defopen_spider(self,spider):print('我开了')self.conn=pymysql.connect(user='root',password="",host='127.0.0.1......
  • Redis之父萨尔瓦多·桑菲利波又名安蒂雷斯
    萨尔瓦多·桑菲利波又名安蒂雷斯个人博客连接嗨,我是萨尔瓦多·桑菲利波,也被称为安提雷斯,一位居住在卡塔尼亚的意大利计算机程序员。我于7年1977月2020日出生在坎波贝洛迪利卡塔。2022年,我停止编写代码,开始全职写小说。现在,从<>年底开始,我再次编码,交替写作和编码。萨尔瓦......
  • java中操作redis
             ......
  • redis常用命令
               ......
  • mysql与redis如何保证数据一致性
    1.先更新MySQL数据库,再删除缓存,再从数据库查询到的最新的数据同步到redis。采用最终一致性性策略。缺点:相较于mq的方式,这种方式由于要查数据库并将最新数据写到redis,可能会造成接口响应速度变慢。2.更新mysql数据库,再采用mq异步的方式,将数据同步到redis中。缺点:数据同步延时......
  • 1 REDIS 入门1
    1连接登录认证redis-cli -h hostip -pport -a pwd    命令行登录认证。入门常用,可用于登录远程redis库。出于安全考虑,可以不带密码先进行连接,然后再通过authpwd进行认证redis-cli  客户端工具。如果本机安装并启动了redis服务,redis-cli命令会直接连接......
  • 一文讲透 Redis 事务 (事务模式 VS Lua 脚本)
    准确的讲,Redis事务包含两种模式:事务模式和Lua脚本。先说结论:Redis的事务模式具备如下特点:保证隔离性;无法保证持久性;具备了一定的原子性,但不支持回滚;一致性的概念有分歧,假设在一致性的核心是约束的语意下,Redis的事务可以保证一致性。但Lua脚本更具备实用场景,它......