一,redis的安装配置+图形化工具redis insight
因为安装配置非常简单,所以这里不再赘述,大家可以自行寻找资料下载
二,redis的基本类型及命令(学会使用help+命令查看命令的使用方式)
tips:为了解决id重复的问题,一般采用层级结构存储key>>>项目名:业务名:id
1,通用命令
2,String类型
set key value,写入一个键值对
get key,取出key对应的value
mset key1 value1 key2 value2......,批量写入多个键值对
mget key1 key2....批量取出多个key对应的value
incr key,对整数value自增长(+1)
incrby,对整数value增长并且指定步长
incrbyfloat,对浮点数value增长并且指定步长
setnx,不存在才会添加键值对
setex,添加并且指定有效期
3,hash类型(单个value中存储了多个键值对的结构)
4,list类型
思考:(1)怎么用list实现栈?(2)怎么实现队列?(3)怎么实现阻塞队列?
其实非常简单,栈保证入口和出口在同一边,队列保证入口和出口在不同的两边,阻塞队列先满足队列的要求,然后再将出口换成BLPOP和BRPOP即可
5,set类型(通常用于好友列表等功能)
* 不能重复
6, shrtedSet类型
三,redis的Java客户端的使用
1,jedis
(1)简单连接
直接通过创建jedis对象的方式连接redis,这种方式不推荐,因为jedis是线程不安全的
private Jedis jedis;
@BeforeEach
void setUp(){
jedis = new Jedis("192.168.xxx.xxx",6379);
jedis.auth("密码...");
this.jedis.select(1);
}
@AfterEach
void tearDown(){
if (jedis != null){
jedis.close();
}
}
(2)创建jedis连接池(推荐的jedis连接方式):
public class JedisConnectionFactory {
// 定义一个JedisPool对象
private static final JedisPool jedisPool;
// 静态代码块,初始化JedisPool对象
static {
// 创建一个JedisPoolConfig对象
JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
// 设置最大连接数
jedisPoolConfig.setMaxTotal(8);
// 设置最大空闲连接数
jedisPoolConfig.setMaxIdle(8);
// 设置最小空闲连接数
jedisPoolConfig.setMinIdle(1);
// 设置最大等待时间
jedisPoolConfig.setMaxWait(Duration.ofMinutes(2));
// 创建一个JedisPool对象
jedisPool = new JedisPool(jedisPoolConfig, "192.168.xxx.xxx",
6379,1000);
}
// 获取Jedis对象
public static Jedis getJedis(){
return jedisPool.getResource();
}
}
2,Sprig Data Redis
(1)引入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
(2)注入RedisTemplate
2.1,当我们向redis中存入数据会发现,key和value都出现了乱码,原因是RedisTemplate底层的序列化机制,因为RedisTemplate可以接受object类型的key和value,但是序列化会走默认的序列化机制,这个机制底层是ObjectOutputStream流完成序列化,所以会乱码
if (this.defaultSerializer == null) {
this.defaultSerializer = new JdkSerializationRedisSerializer(this.classLoader != null ? this.classLoader : this.getClass().getClassLoader());
}
//JdkSerializationRedisSerializer底层
public class DefaultSerializer implements Serializer<Object> {
public DefaultSerializer() {
}
public void serialize(Object object, OutputStream outputStream) throws IOException {
if (!(object instanceof Serializable)) {
String var10002 = this.getClass().getSimpleName();
throw new IllegalArgumentException(var10002 + " requires a Serializable payload but received an object of type [" + object.getClass().getName() + "]");
} else {
ObjectOutputStream objectOutputStream = new ObjectOutputStream(outputStream);
objectOutputStream.writeObject(object);
objectOutputStream.flush();
}
}
}
2.2,通过自定义RedisTemplate解决这个问题,自定义key,hashkey和value,hashvalue的序列化规则同时定义自己需要的key和value泛型
@Configuration
public class RedisConfig {
@Bean
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
//创建RedisTemplate对象
RedisTemplate<String, Object> template = new RedisTemplate<>();
//设置连接工厂
template.setConnectionFactory(redisConnectionFactory);
//创建JSON序列化工具
GenericJackson2JsonRedisSerializer jsonRedisSerializer = new GenericJackson2JsonRedisSerializer();
//配置序列化规则
template.setKeySerializer(RedisSerializer.string());
template.setHashKeySerializer(RedisSerializer.string());
template.setValueSerializer(jsonRedisSerializer);
template.setHashValueSerializer(jsonRedisSerializer);
//返回RedisTemplate对象
return template;
}
}
(3)调用opsForValue/hash/Set()等等方法
@Test
public void testString() {
redisTemplate1.opsForValue().set("1", new User("jack",18));
User user = (User) redisTemplate1.opsForValue().get("1");
System.out.println(user);
}
此时又引出一个问题,对象user转换为JSON字符串会携带user类的全路径,如果对象传输数量多可能就会占用大量内存
3,使用StringRedisTemplate
通过JSON工具(private static final ObjectMapper mapper = new ObjectMapper();)将对象转为字符,取出时再将字符转换为对象:
String json = mapper.writeValueAsString(user);
redisTemplate.opsForValue().set("1", json);
String string = redisTemplate.opsForValue().get("1");
User value = mapper.readValue(string, User.class);
总结,至此redis的基本用法已经全部学习完毕,接下来进入redis项目的实战篇,同时也希望看到这篇博客的小伙伴能够有所收获,祝大家更进一步。