Redis学习笔记

本文总阅读量
本文最后更新于2 分钟前,文中所描述的信息可能已发生改变。

Redis启动(Windows下)

在 Redis 的安装目录下进入终端,输入redis-server.exe redis.windows.conf启动 Redis 服务端,另起一个终端进入 Redis 的安装目录下输入redis-cli.exe -h 127.0.0.1 -p 6379启动客户端。

Redis安全

shell
127.0.0.1:6379> config get requirepass
1) "requirepass"
2) ""

查看是否设置了 Redis 的密码,显示空字符串则为没有设置。

通过config set requirepass "12345"即可设置密码。设置后客户端连接 redis 需要输入auth 12345才能操作数据库。

数据类型

  • String类型:set "string.key" "value"
  • list类型:加入元素lpush "key" "value1" "value2";输出全部元素lrange "key" 0 20
  • set类型:加入元素add "key" "value1" "value2";输出全部元素smembers "key"
  • zset类型:加入zadd key value;输出zrange key start end
  • hash类型:加入hmset key field1 v1 field2 v2...;输出hget key filed

其它的数据类型:位图(bitmaps)、超日志(HyperLogLogs)、地理空间(Geospatial)、发布/订阅(Pub/Sub)、流(Streams)、模块(Modules)。

Redis整合SpringBoot

依赖导入

pom
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<!-- 简化缓存操作 -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-cache</artifactId>
</dependency>

配置文件配置(springboot2.x版本)

yml
# 单机模式配置
server:
  port: 8080
spring:
  redis:
    database: 0
    host: localhost
    port: 6379
    lettuce:
      pool:
        enabled: true #使用连接池
        max-active: 8
  main: 
    banner-mode: off #关闭横幅
  cache: #使用redis的缓存
    type: redis 
    cache-names: test

配置 RedisTemplate

java
@Configuration
@Slf4j
public class MyConfig {
    @Bean
    public RedisTemplate<String,Object> redisTemplate(RedisConnectionFactory redisConnectionFactory){
        RedisTemplate<String, Object> template = new RedisTemplate<>();
        //设置连接工厂
        template.setConnectionFactory(redisConnectionFactory);
        StringRedisSerializer redisSerializer = new StringRedisSerializer();
        GenericJackson2JsonRedisSerializer jsonRedisSerializer = new GenericJackson2JsonRedisSerializer();
        //设置key的序列化器为StringRedisSerializer
        template.setKeySerializer(redisSerializer);
        //设置value的序列化器为GenericJackson2JsonRedisSerializer
        template.setValueSerializer(jsonRedisSerializer);
        //设置hash类型数据的序列化方式
        template.setHashKeySerializer(redisSerializer);
        template.setHashValueSerializer(jsonRedisSerializer);
        log.info("RedisTemplate注入完成");
        return template;
    }
    /**
     * 配置后缓存入redis不会乱码
     * @param redisTemplate
     * @return
     */
    @Bean
    public CacheManager cacheManager(RedisTemplate<String,Object> redisTemplate){
        RedisCacheConfiguration redisCacheConfiguration = RedisCacheConfiguration.defaultCacheConfig()
                //设置key的序列化方式
                .serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(redisTemplate.getStringSerializer()))
                //设置value的序列化方式
                .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(redisTemplate.getValueSerializer()))
                //设置不缓存null值
                .disableCachingNullValues()
                //设置过期时间为1小时
                .entryTtl(Duration.ofHours(1));
        RedisCacheManager cacheManager = RedisCacheManager.RedisCacheManagerBuilder
                //设置连接池
                .fromConnectionFactory(redisTemplate.getConnectionFactory())
                //设置缓存默认配置
                .cacheDefaults(redisCacheConfiguration)
                //设置同步修改或删除 put/evict
                .transactionAware()
                .build();
        return cacheManager;
    }

    //获取操作String类型数据的类,简化。
    @Bean(name = "valueOperations")
    public ValueOperations<String,Object> valueOperations(RedisTemplate<String,Object> redisTemplate){
        return redisTemplate.opsForValue();
    }
}

还需要在主启动类上加上注解@EnableCaching启用SpringCache的注解功能

配置一个RedisController用于测试

应该是写在业务层的

java
@RequestMapping("/redis")
@RestController
@Slf4j
public class RedisController {
    @GetMapping("/get1")
    @Cacheable(value = "cacheName",key = "#key")
    public User getUser1(@RequestParam("key") String key){
        log.info("key :{}",key);
        return User.builder().id(1).name("哈姆").age(18).build();
    }
    @GetMapping("/get2")
    @Cacheable(value = "cacheName",key = "#key")
    public String getUser2(@RequestParam("key") String key){
        log.info("key :{}",key);
        return "我是数据";
    }
    @GetMapping("/del")
    @CacheEvict(value = "cacheName",key = "#key")
    public void delUser(@RequestParam("key")String key){
        log.info("删除数据与缓存:{}",key);
    }
    
    @GetMapping("/update1")
    @CachePut(value = "cacheName",key = "#key",unless = "#result == null")
    public void update1(@RequestParam("key")String key){
        //此处更新因为返回值为空且设置了unless判断是否进行缓存,条件为真则不进行更新缓存。
        log.info("更新数据与缓存:{}",key);
    }

    @GetMapping("/update2")
    @CachePut(value = "cacheName",key = "#key",unless = "#result == null")
    public String update2(@RequestParam("key")String key){
        //返回值不为空,会将返回值更新到对于的缓存中。
        log.info("更新数据与缓存:{}",key);
        return "更新后的数据";
    }
    @GetMapping("/addBatch")
    @Caching(cacheable = {
            @Cacheable(value = "cacheName",key = "#key1"),
            @Cacheable(value = "cacheName",key = "#key2")
    })
    public String addBatch(@RequestParam("key1")String key1,@RequestParam("key2")String key2){
        log.info("批量缓存:{} {}",key1,key2);
        return "批量缓存的数据";
    }
}

@Cacheable(value = "cacheName",key = "key")使用在方法上,如果缓存中有则提供缓存中的,如果缓存中没有则将方法返回值添加到缓存中。key为缓存的key,value类似分组。 属性详情

@CachePut(value = "cacheName",key = "key")用在方法上,用于更新缓存,无论缓存中否有都执行方法并将执行结果更新到缓存中。

@CacheEvict(value = "cacheName,key = "key")用在方法上,用于删除缓存,当方法掉用时会清除指定value与key的缓存。通过allEntries、beforeInvocation属性可以来清除全部缓存数据,不过allEntries是方法调用后清理,beforeInvocation是方法调用前清理。

@Caching用于方法或类上,即用于执行批量的缓存操作,可以在里面使用多个Spring Cache相关注解。

java
//此处当方法执行时会移除两个缓存中的数据。
//@Caching的属性cacheable、put、evict分别用于指定@Cacheable、@CachePut、@CacheEvict注解
@Caching(evict{
        @CacheEvict(value = "c1",key = "#args.id"),
        @CacheEvict(value = "c2",key = "#args.id")
    }
)
public void save(MyArgs args){
    //业务逻辑
}

@CacheConfig可以写在类上,主要就是用于简化缓存的配置,例如我可以在类上CacheConfig(cacheNames = {"myCache"})这样就不用在每一个方法上都指定 cacheName 属性的值。

缓存的key可以使用sqEL表达式书写,#result表示方法执行后的返回值。

整合SpringCloud

其实和整合SpringBoot是一样的,只不过是在配置中心配置罢了。

最佳实践

  • 读多写少,对及时性与一致性要求不高的数据尽量使用缓存。
  • 注意数据一致性问题,即线程安全问题。
MySQL学习笔记
linux指令学习
Valaxy v0.18.5 驱动 | 主题 - Yun v0.18.5
本站总访问量
本站访客数 人次
本站已运行0 天0 小时0 分0 秒后缀