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中存储的数据形式