1 redis入门

redis 数据库是非关系型数据库,是基于内存的数据库,所有读写数据巨快,常用于高并发的应用场景中。
  redis只能安装在linux上和mac上。

2 redis可以存储的数据类型

1 普通的key-value
  • set key value 存
  • get key 取
  • exists key 查
  • del key 删
  • expire key 时间(s) 设置key的存活时间

注意可以给同一个key设置多次,但是后面的会覆盖前面的

2 List类型
  • rpush list名字 元素,用空格隔开 从左边添加
  • rpush 同上从右边添加
  • lpop 从左边取一个
  • rpop 从右边取一个
  • lrange list的名字 x y 取出从索引从x 到y 的元素
  • llen list 查询list的长度

注意 再pop的时候,如果list中没有元素则返回nil 在消息服务中可能会导致一致尝试调用pop命令。可以使用如下
Blpop list名字 等待时间
同时 blpop可以同时pop多个集合 如下

Blpop list1 list2 5

3 Hash 类似于java的HashMap
  • hset map名字 mkey mvalue 添加
  • hget map名字 mkey 取
  • hexists map名字 mkey 判断是否存在
  • hkeys map名字
  • hgetall map名字 返回所有的key和value
  • hdel map名字 mkey 删除map中指定的key对应的元素
4 Set 类似于java中的set代表元素不重复的集合
  • sadd set名子 元素 ,多个元素 空格隔开 添加
  • srem set名字 同上 删除
  • smember key 返回一个集合中的所有元素
  • sinter 集合1 集合2 返回集合的交集
  • sinterstore 集合3 集合2 集合1 返回交集,并存到集合3中
  • sunion 集合1 集合2 返回集合并集
  • sunionstore 集合3 集合2 集合1 返回并集 ,存到集合3中

3 springboot 集成redis

1添加依赖
<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-data-redis</artifactId>
   <version>2.1.3.RELEASE</version>
</dependency>
2 配置redis数据库的地址和端口
spring:
  application:
    name: xxxxxxx
  redis:
    host: xx.xx.xx.xx
    port: 6379
    jedis:
      pool:
        max-active: 5
3 使用redis依赖库中的StringRedisTemplate和RedisTemplate来操作redis
@RestController
public class RedisController {

//    @Autowired
//    StringRedisTemplate redisTemplate;
    
    @Qualifier("redisTemplate")
    @Autowired
    RedisTemplate redisTemplate;

    @GetMapping(value = "redis/{key}/{data}")
    public Object redisTest(
            @PathVariable String key,
            @PathVariable String data){
      redisTemplate.opsForValue().set(key,data);
      return redisTemplate.opsForValue().get(key);
    }

}
总结

StringRedisTemplate 和RedisTemplate的区别:

  • StringRedisTemplate继承自 RedisTemplate,重新定义了序列化方式,举个栗子吧。如下图所示
  • 用StringRedisTemplate存储的key 为spring 是 “spring”
    而用RedisTemplate 存储key为spring时 实际在redis数据库是"\xac\xed\x00\x05t\x00\x06spring" 这就是因为两者序列化的方式不同导致的。

所以如果key和value都是String类型的话,使用StringRedisTemplates会比较合适。

但是在我们的java代码上不受影响,任然可以根据id为”spring”查询出来,,,因为在查询的时候”spring” 依然会被序列化为。。。所以是可以查到结果的。查询的结果也会被反序列化回来。。只是在redis-cli查询的时候根据”spring”查询不到了,需要根据序列化之后的key 查询

自定义序列化方式

既然StringRedisTemplates 重写了Redis的序列化方式来改变序列化方式,那么我们也可以自定义序列化方式。如下 建立一个配置类

@Configuration
public class RedisConfiguration extends CachingConfigurerSupport {
    @Bean(name = "redisTemplate1")
    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {
        RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
        redisTemplate.setConnectionFactory(factory);
        redisTemplate.setHashValueSerializer(new Jackson2JsonRedisSerializer<>(Object.class));
        redisTemplate.setKeySerializer(new StringRedisSerializer());
        //redisTemplate.setKeySerializer(new Jackson2JsonRedisSerializer<>(Object.class));
        redisTemplate.setHashKeySerializer(new Jackson2JsonRedisSerializer<>(Object.class));
        redisTemplate.setValueSerializer(new Jackson2JsonRedisSerializer<>(Object.class));
        redisTemplate.afterPropertiesSet();
        return redisTemplate;
    }
}

 这里我们分别设置了KYE ,value,hasKey,hasValue的序列化方式。

然后在需要操作redis的地方使用到注入我们这个Bean,用我么这个Bean去执行相应的写入读出就可以了。如下

@RestController
public class RedisController {

//    @Autowired
//    StringRedisTemplate redisTemplate1;

//    @Qualifier("redisTemplate")
    @Autowired
    RedisTemplate redisTemplate1;

    @GetMapping(value = "redis/{key}/{data}")
    public Object redisTest(
            @PathVariable String key,
            @PathVariable String data){
      redisTemplate1.opsForValue().set(key,data);
      return redisTemplate1.opsForValue().get(key);
    }

}

@Qualifier 注解
  这个注解的意识是合格者的意识,参数为bean的名称
不使用该注解则默认去注入 redisTemplate1 使用该注解会去找该注解里面的参数名称的bean,替换掉redisTemplate1的bean。不同的bean配置不一样,可能会导致最终的结果不一样。。。今天又学到了一个注解 @Qualifier

不同序列化方式在redis中存储的数据形式

springboot redis bitmap清理 springboot删除redis中的key_序列化