Redis(持续更新)

1、安装

安装太麻烦了直接使用宝塔的一键部署

密码是bt_redis

2、jedis

1、引入依赖

<dependency>
            <groupId>redis.clients</groupId>
            <artifactId>jedis</artifactId>
            <version>3.7.0</version>
        </dependency>

 2、建立连接

private Jedis jedis;
    @BeforeEach
    void setUp(){
        //1建立连接
        jedis=new Jedis("IP",37690);
        //2设置密码
        jedis.auth("bt_redis");
        //3选择库
        jedis.select(0);
    }

3、测试String

@Test
    void testString() {
        //存入结果
        String result = jedis.set("name", "高晗");
        System.out.println(result);
        //获取数据
        String name = jedis.get("name");
        System.out.println(name);
    }

    @Test
    void testHash() {

        //插入哈希
        jedis.hset("user:1","name","Jack");
        jedis.hset("user:1","age","21");
        //获取
        Map<String, String> stringStringMap = jedis.hgetAll("user:1");
        System.out.println(stringStringMap);
    }

4、释放资源

//释放连接
    void tearDown(){
        if (jedis!=null)
            jedis.close();
    }

多线程时使用连接池

1、创建连接池工具

public class jedisConnectionFactory {
    private static  JedisPool jedispool;

    static {
        //配置连接池
        JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
        jedisPoolConfig.setMaxTotal(8);//最大连接数
        jedisPoolConfig.setMaxIdle(8);//最大空闲连接
        jedisPoolConfig.setMinIdle(0);//最小空闲连接
        jedisPoolConfig.setMaxWaitMillis(100);//等待时间
        //创建连接池对象
        JedisPool jedisPool = new JedisPool(
                jedisPoolConfig,
                "IP",
                37690,
                1000,
                "bt_redis");


    }
    public static Jedis getJedis(){
        return jedispool.getResource();
    }

}

 修改建立连接代码

@BeforeEach
    void setUp(){
        //1建立连接
        jedis= jedisConnectionFactory.getJedis();//从池子中获取连接
        //2设置密码
        jedis.auth("bt_redis");
        //3选择库
        jedis.select(0);
    }

释放资源时底层会自动判断是否使用连接池,如果使用则归还连接池 

3、SpringDataRedis

RedisTemplate入门

依赖与springboot整合

 <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-pool2</artifactId>
        </dependency>
<!--        底层都通过commons完成底层线程池-->
        
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>

配置

spring:
  data:
    redis:
      host: IP
      port: 37690
      password: bt_redis
      lettuce:
        pool:
          max-active: 8
          max-idle: 8
          min-idle: 0
          max-wait: 100

3注入RedisTemplate并使用

@Autowired
    private RedisTemplate redisTemplate;

    @Test
    void testString() {
        //底层自动序列化 所以object类型
        //写入一条数据
        redisTemplate.opsForValue().set("name","姜赫");
        Object name = redisTemplate.opsForValue().get("name");
        System.out.println(name);
    }

使用上述创建时,传入的是object而不是string所以会进行序列化所以当去底层使用原本object的文本时,会得到不同与String内容,可读性差(key,value)都序列化 序列化后增加了长度增加了内存容量的所以要改变序列化方式。 

两者序列化方案

RedisSerializer

自定义序列号方式:

@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());//spring专门处理字符的序列化
        template.setHashKeySerializer(RedisSerializer.string());
        //设置Value序列化
        template.setValueSerializer(jsonRedisSerializer);
        template.setHashValueSerializer(jsonRedisSerializer);
        //返回
        return template;
    }

}

测试

//一般情况
@Test
    void testString() {
        //底层自动序列化 所以object类型
        //写入一条数据
        redisTemplate.opsForValue().set("name","姜赫");
        Object name = redisTemplate.opsForValue().get("name");
        System.out.println(name);
    }
//如果是对象的话

    @Test
    void testSaveUser() {
        //写入数据
        redisTemplate.opsForValue().set("user:100",new User("姜赫",19));
        //获取数据
        User o = (User) redisTemplate.opsForValue().get("user:100");
        System.out.println(o);
    }

 ok

StringRedisTemplate

要实现自动序列化和反序列化必须要这样如果不知道class就没办法自动反转

所以如果想节省就不能实现自动的序列化和反序列化

所以我们不会使用JSON的序列化器

用KEY的序列化器来使用

如果必需存对象,我们就必须手动序列化

 StringRedisTemplate默认key value都是sting


    @Test
    void testString() {
        //底层自动序列化 所以object类型
        //写入一条数据
        stringRedisTemplate.opsForValue().set("name","米浴");
        Object name = stringRedisTemplate.opsForValue().get("name");
        System.out.println(name);
    }

    private static  final ObjectMapper mapper=new ObjectMapper();
    @Test
    void testSaveUser() throws JsonProcessingException {
        //创建对象
        User user = new User("米浴", 6);
        //手动序列化
        String json = mapper.writeValueAsString(user);
        //写入数据
        stringRedisTemplate.opsForValue().set("user:200",json);
        //获取数据
        String jsonUser=  stringRedisTemplate.opsForValue().get("user:200");
        //手动反序列化
        User user1=mapper.readValue(jsonUser,User.class);
        System.out.println("user1="+user1);
    }

 Hash(Api更接近java编程习惯)

@Test
    void testHash(){
        stringRedisTemplate.opsForHash().put("user:400","name","东海帝皇");
        stringRedisTemplate.opsForHash().put("user:400","age","3");

        Map<Object, Object> entries = stringRedisTemplate.opsForHash().entries("user:400");
        System.out.println(entries);
    }

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值