Redis应用

本文章是跟着黑马程序员的课程记录的查看连接

RedisTemplate

导入pom文件


<dependency>
    <groupId>org.springframework.bootgroupId>
    <artifactId>spring-boot-starter-data-redisartifactId>
dependency>

<dependency>
    <groupId>org.apache.commonsgroupId>
    <artifactId>commons-pool2artifactId>
dependency>

<dependency>
    <groupId>com.fasterxml.jackson.coregroupId>
    <artifactId>jackson-databindartifactId>
dependency>

<dependency>
    <groupId>cn.hutoolgroupId>
    <artifactId>hutool-allartifactId>
    <version>5.7.17version>
dependency>

编写配置文件

spring:
  redis:
    host: 192.168.150.101
    port: 6379
    password: 123321
    lettuce:
      pool:
        max-active: 8 # 最大连接
        max-idle: 8 # 最大空闲连接
        min-idle: 0 # 最小空闲连接
        max-wait: 100 # 连接等待时间

自定义序列化方式

RedisTemplate可以接受任意Object作为值写入Redis,写入之前会把Object序列化为字节形式,默认是采用JDK序列化,这种序列化之后的结果不完全是我们想要的格式,所以需要自定义序列化方式

@Bean
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory)
        throws UnknownHostException {
    // 创建Template
    RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
    // 设置连接工厂
    redisTemplate.setConnectionFactory(redisConnectionFactory);
    // 设置序列化工具
    GenericJackson2JsonRedisSerializer jsonRedisSerializer = 
					new GenericJackson2JsonRedisSerializer();
    // key和 hashKey采用 string序列化
    redisTemplate.setKeySerializer(RedisSerializer.string()); 
    redisTemplate.setHashKeySerializer(RedisSerializer.string());
    // value和 hashValue采用 JSON序列化
    redisTemplate.setValueSerializer(jsonRedisSerializer);
    redisTemplate.setHashValueSerializer(jsonRedisSerializer);
    return redisTemplate;
}

编写测试类

// 自动注入RedisTemplate
@Autowired
private RedisTemplate redisTemplate;


// 测试方法
@SpringBootTest
public class RedisTest {

    @Autowired
    private RedisTemplate redisTemplate;

    @Test
    void testString() { 
        // 插入一条string类型数据
        redisTemplate.opsForValue().set("name", "李四");
        // 读取一条string类型数据
        Object name = redisTemplate.opsForValue().get("name");
        System.out.println("name = " + name);
    }
}

StringRedisTemplate

因为RedisTemplate序列化时会存储类的全路径,会造成内存的开销
所以Spring默认提供了StringRedisTemplate类,它的key和value的序列化方式默认是String方式.省去了我们自定义RedisTemplate的过程

@Autowired
private StringRedisTemplate stringRedisTemplate;
// JSON工具
@SpringBootTest
public class RedisTest {
    @Autowired
    private StringRedisTemplate stringRedisTemplate;
    // JSON工具
    private static final ObjectMapper mapper = new ObjectMapper();
    @Test
    public void test01() throws JsonProcessingException {
        User user = new User();
        user.setName("zhangsan");
        user.setAge(23);
        // 手动序列化
        String json = mapper.writeValueAsString(user);
        // 添加到redis中并设置存活时间为2分钟
        // 也可以通过stringRedisTemplate.expire(key, 2, TimeUnit.MINUTES)来设置存活时间
        stringRedisTemplate.opsForValue().set("user:001", json, 2, TimeUnit.MINUTES);
        // 从redis中读取
        String val = stringRedisTemplate.opsForValue().get("user:001");
        // 反序列化
        User user1 = mapper.readValue(val, User.class);
        System.out.println(user1);
        System.out.println(user1.getName());
    }
}

Redis应用场景

1. 计数器

可以对String进行自增自减运算,从而实现计数器功能。Redis这种内存型数据库的读写性能非常高,很适合存储频繁读写的计数

2. 缓存

将热点数据放到内存中,设置内存的最大使用量以及淘汰策略来保证缓存的命中率

3. 分布式锁实现

在分布式场景下,无法使用单机环境下的锁来对多个节点的进程进行同步。可以使用Redis自带的SETNX命令实现分布式锁,除此之外,还可以使用官方提供的RedLock分布式锁实现

4. 共同好友

Set可以实现交集,并集等操作,从而实现共同好友等功能。

5. 排行榜

ZSet可以实现有序行操作,从而实现排行榜等功能

你可能感兴趣的:(笔记,redis,java,缓存)