首页 > 数据库 >Redis详解

Redis详解

时间:2023-02-06 12:55:45浏览次数:45  
标签:String opsForValue Redis 详解 RedisTemplate template 序列化 redisTemplate

Redis配置yml

spring:
  redis:
    host: 82.157.248.243          #host地址
    port: 6379        #地址端口号
    password:         #密码
    database:         #redis数据库索引(默认为0)
    timeout:          #redis连接超时时间(单位毫秒)
    lettuce:
      pool:           #redis连接池配置
        max-wait: 1000ms #从连接池中获取最大等待时间(默认为-1,单位为毫秒,负数表无限)
        max-active: 8   #最大可用连接数(默认为8,负数表无限)
        min-idle: 0     #最小空闲连接数(默认为0,负数表无限)
        max-idle: 8     #最大空闲连接数(默认为8,负数表无限)

RedisTemplate 使用方式一:

RedisConfig配置类

@Configuration
public class RedisConfig {
    @Bean
    public RedisTemplate<String,Object> redisTemplate(RedisConnectionFactory connectionFactory){
        //创建RedisTemplate对象
        RedisTemplate<String,Object> template = new RedisTemplate<>();
        //设置连接工厂
        template.setConnectionFactory(connectionFactory);
        //创建JSON序列化工具
        GenericJackson2JsonRedisSerializer jsonRedisSerializer = new GenericJackson2JsonRedisSerializer();
        //设置key的序列化
        template.setKeySerializer(RedisSerializer.string());
        template.setHashValueSerializer(RedisSerializer.string());
        //设置value的序列化
        template.setValueSerializer(jsonRedisSerializer);
        template.setHashValueSerializer(jsonRedisSerializer);
        //返回
        return template;
    }
}

测试使用

@SpringBootTest
class Demo5ApplicationTests {

    @Autowired
    private RedisTemplate<String,Object> redisTemplate;

    @Test
    void contextLoads() {
        //写入一条String数据
        redisTemplate.opsForValue().set("name","虎哥");
        //获取String数据
        System.out.println(redisTemplate.opsForValue().get("name"));
    }

    @Test
    void testSaveUser(){
        // 写入数据
        redisTemplate.opsForValue().set("user:100",new User("刀哥",23));
        System.out.println(redisTemplate.opsForValue().get("user:100"));
    }
}

测试结果

 

 

尽管JSON的序列化可以满足我们的需求,但依然存在一些问题即,为了在反序列化时知道对象的类型,JSON序列化器会将类的class类型(也就是上图中的“@class属性”)写入json结果中,存入Redis,会带来额外的内存开销。

 

StringRedisTemplate 常用方式

为了节省内存空间,并不会使用JSON序列化器来处理value,而是统一使用String序列化器,要求只能存储String类型的key和value。当需要存储java对象时,手动完成对象的序列化和反序列化。

 Spring默认提供了一个StringRedisTemplate类,它的key和value的序列化方式默认方式就是String方式。省去了我们自定义RedisTemolate的过程:

@SpringBootTest
class RedisStringTest {
    @Autowired
    private StringRedisTemplate stringRedisTemplate;

    @Test
    void contextLoads() {
        //写入一条String数据
        stringRedisTemplate.opsForValue().set("name2","虎哥");
        //获取String数据
        System.out.println(stringRedisTemplate.opsForValue().get("name"));
    }

    private static final ObjectMapper mapper = new ObjectMapper();

    @Test
    void testSaveUser() throws JsonProcessingException {
        // 创建对象
        User user = new User("虎哥", 21);
        //手动序列化
        String json= mapper.writeValueAsString(user);
        // 写入数据
        stringRedisTemplate.opsForValue().set("user:101",json);
        String s = stringRedisTemplate.opsForValue().get("user:101");
        //手动反序列化
        User user1 = mapper.readValue(s, User.class);
        System.out.println(user1);
    }
}

结果:

 

通常来说使用的是第二种序列化和反序列化方法。

标签:String,opsForValue,Redis,详解,RedisTemplate,template,序列化,redisTemplate
From: https://www.cnblogs.com/Yukino1903/p/17095025.html

相关文章

  • java注解与反射详解
    一、注解篇1.1、注解的基本概念注解:一种代码级别的说明,它是JDK1.5及以后版本引入的一个特性,与类、接口、枚举是在同一个层次;它可以声明在包、类、字段、方法、局部变量......
  • 2:redis
    一:redis端口6379,是key-vaule键值对类型数据,数据存储到内存里面,读写速度快,键必须是字符串,值有五种类型二:Redis支持五种数据类型:string(字符串),hash(哈希),list(列表),set(集合)及zse......
  • C++右值引用,移动语义与完美转发详解
    tags:C++Interview写在前面总结一下深入理解C++11这本书的第三章第三节,右值引用部分.文中全部代码可以参考我在GitHub上传的部分:​​Learn_C_Cpp/c++11-14/Depth_unde......
  • linux安装redis
    linux安装redis1.打开官网找到要安装的版本复制下载连接redis官网wgethttps://github.com/redis/redis/archive/7.0.8.tar.gz#如果提示wget不存在可以使用yuminst......
  • Node.JS模块化详解(Math加乘实现/模块外包围)
    视频math.js/* 定义一个模块math -在该模块中提供两个方法 add(a,b);//求两个数的和 mul(a,b);//求两个数的积*/module.exports.add=function(a......
  • php两种基本的输出方及实例详解
    在PHP中,有两种基本的输出方法:echo和print。echo和print之间的差异echo-输出一个或多个字符串,可以接受多个参数并且没有返回值print-只能输出一个字符串,只能......
  • Tomcat内存设置详解
    一、常见的Java内存溢出有以下三种: 1. java.lang.OutOfMemoryError:Javaheapspace ----JVMHeap(堆)溢出JVM在启动的时候会自动设置JVMHeap的值,其初始空间(即-Xms)是物......
  • 看一遍就懂,详解java多线程——volatile
    多线程一直以来都是面试必考点,而volatile、synchronized也是必问点,这里我试图用容易理解的方式来解释一下volatile。来看一下它的最大特点和作用:一使变量在多个线程间可见......
  • PHP7中对十六进制字符串处理的问题详解
    本篇文章由PHP7教程栏目给大家介绍一下关于php7中"0xFFFFFFFF"和0xFFFFFFFF的问题。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。具体问题:$t1......
  • php生成唯一uid的解决方法详解
    目录一、生成唯一uuid二、生成唯一uid三、生成唯一uid的正确方法补充 一、生成唯一uuid看到某些人会用uuid去代替用户的uid从代码中可以看出,通过unique生成一个......