Redis使用示例

简介:

教程网站:https://www.redis.net.cn/tutorial/3501.html

命令参考:http://redisdoc.com/index.html

REmote DIctionary Server(Redis) 是一个由Salvatore Sanfilippo写的key-value存储系统;

Redis多种类型的value,包括string(字符串)、list(链表)、set(集合)、zset(sorted set --有序集合)和hash(哈希类型)。三种特殊数据类型:Bitmaps、Hyperloglog、地理位置

Jedis 是 Redis 官方首选的 Java 客户端开发包。

可作为数据库、缓存、消息订阅

方法一:springboot整合redis

1、pom依赖

<!--redis-->
<dependency>
     <groupId>org.springframework.boot</groupId>
     <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<!-- 对象池,使用redis时必须引入 -->
<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-pool2</artifactId>
</dependency>
<!-- 引入 jackson 对象json转换 -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-json</artifactId>
</dependency>

 2、配置文件

application.yml

spring:
  redis:
    host: 192.168.xx.xx
    password: 123456
    port: 6379
    # 连接超时时间(记得添加单位,Duration)
    timeout: 10000ms
    # Redis默认情况下有16个分片,这里配置具体使用的分片
    database: 3
    lettuce:
      pool:
        # 连接池最大连接数(使用负值表示没有限制) 默认 8
        max-active: 8
        # 连接池最大阻塞等待时间(使用负值表示没有限制) 默认 -1
        max-wait: -1ms
        # 连接池中的最大空闲连接 默认 8
        max-idle: 8
        # 连接池中的最小空闲连接 默认 0
        min-idle: 0
    cache:
      # 一般来说是不用配置的,Spring Cache 会根据依赖的包自行装配
      type: redis
View Code

RedisConfig

@Configuration
@AutoConfigureAfter(RedisAutoConfiguration.class)
@EnableCaching
public class RedisConfig {

    /**
     * 默认情况下的模板只能支持RedisTemplate<String, String>,也就是只能存入字符串,因此支持序列化
     */
    @Bean
    public RedisTemplate<String, Serializable> redisTemplate(LettuceConnectionFactory redisConnectionFactory) {
        RedisTemplate<String, Serializable> template = new RedisTemplate<>();
        template.setKeySerializer(new StringRedisSerializer());
        template.setValueSerializer(new GenericJackson2JsonRedisSerializer());
        template.setConnectionFactory(redisConnectionFactory);
        return template;
    }

    /**
     * 配置使用注解的时候缓存配置,默认是序列化反序列化的形式,加上此配置则为 json 形式
     */
    @Bean
    public CacheManager cacheManager(RedisConnectionFactory factory) {
        // 配置序列化
        RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig();
        RedisCacheConfiguration redisCacheConfiguration = config.serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(new StringRedisSerializer())).serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(new GenericJackson2JsonRedisSerializer()));
        return RedisCacheManager.builder(factory).cacheDefaults(redisCacheConfiguration).build();
    }
}
View Code

 

3、实际使用 @CachePut、@Cacheable、@CacheEvict 配合对k-v使用很便利

    @CachePut(value = "admin", key = "#admin.id")//与@Cacheable区别在于是否每次都调用方法,常用于更新
    @Override
    public Admin saveOrUpdate(Admin admin) {
        System.out.println("执行方法体 -> 将结果缓存起来");
        return admin;
    }
    //@CacheEvict(value = {"admin"}, key = "#id") //清空缓存
    @Cacheable(value = {"admin"}, key = "#id")
    @Override
    public Admin getCacheable(Integer id) {
        System.out.println("查找缓存 -> 有就返回/没有就执行方法体 - 将结果缓存起来");
        Admin admin=this.selectById(id);
        return admin;
    }

 

方法二 :springboot使用redisTemplat

1、配置在方法一替换config中的 redisTemplate,解决以下方法存入乱码

@Autowired
private RedisTemplate redisTemplate;

@Bean
public RedisTemplate <String, Object> stringSerializerRedisTemplate() {
    RedisSerializer <String> stringSerializer = new StringRedisSerializer();
    redisTemplate.setKeySerializer(stringSerializer);
    redisTemplate.setValueSerializer(stringSerializer);
    redisTemplate.setHashKeySerializer(stringSerializer);
    redisTemplate.setHashValueSerializer(stringSerializer);
    return redisTemplate;
}
View Code

2、使用方法

redisTemplate.opsForValue();//操作字符串
redisTemplate.opsForHash();//操作hash
redisTemplate.opsForList();//操作list
redisTemplate.opsForSet();//操作set
redisTemplate.opsForZSet();

3、使用感想:看着好像好一些,按实取需吧

 

方法三:JedisPool使用方式

1、pom依赖

<dependency>
    <groupId>redis.clients</groupId>
    <artifactId>jedis</artifactId>
</dependency>

2、配置

application.yml使用以上

JedisConfig

@Configuration
public class JedisConfig extends CachingConfigurerSupport {
    private Logger logger = LoggerFactory.getLogger(JedisConfig.class);

    @Value("${spring.redis.host}")
    private String host;

    @Value("${spring.redis.port}")
    private int port;

    @Value("${spring.redis.password}")
    private String password;

    @Value("${spring.redis.timeout}")
    private int timeout;

    @Value("${spring.redis.database}")
    private int database;

    @Value("${spring.redis.lettuce.pool.max-active}")
    private int maxActive;

    @Value("${spring.redis.lettuce.pool.max-idle}")
    private int maxIdle;

    @Value("${spring.redis.lettuce.pool.min-idle}")
    private int minIdle;

    @Value("${spring.redis.lettuce.pool.max-wait}")
    private long maxWaitMillis;

    /**
     * SpringSession  需要注意的就是redis需要2.8以上版本,然后开启事件通知,在redis配置文件里面加上
     */
    @Bean
    public JedisPool redisPoolFactory() {
        JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
        jedisPoolConfig.setMaxIdle(maxIdle);
        jedisPoolConfig.setMaxWaitMillis(maxWaitMillis);
        jedisPoolConfig.setMaxTotal(maxActive);
        jedisPoolConfig.setMinIdle(minIdle);
        JedisPool jedisPool = new JedisPool(jedisPoolConfig, host, port, timeout, password, database);
        logger.info("JedisPool注入成功!" + "redis地址:" + host + ":" + port);
        return jedisPool;
    }
}
View Code

 

3、工具类封装使用(通过class获取Bean)

public class RedisUtil {

    /**
     * 添加一个Map<K, field, V>集合,成功返回1,失败返回0
     *
     * @param key
     * @param value
     * @return
     */
    public static int setMap(String key, String field, Object value) {
        JedisPool jedisPool = SpringUtil.getBean(JedisPool.class);
        if(value == null || key == null || "".equals(key)) {
            return 0;
        }
        Jedis jedis = null;
        try {
            jedis = jedisPool.getResource();
            String data = JSON.toJSONString(value);
            Long result = jedis.hset(key, field, data);
            if(result == 1 || result == 0) {
                return 1;
            } else {
                return 0;
            }
        } finally {
            RedisUtil.closeJedis(jedis);
        }
    }

    /**
     * 获得一个Map<v,k>的集合
     *
     * @param key
     * @return
     */
    public static <T> T getMap(String key, String field, Class <T> clazz) {
        JedisPool jedisPool = SpringUtil.getBean(JedisPool.class);
        if(key == null || "".equals(key)) {
            return null;
        }
        Jedis jedis = null;
        try {
            jedis = jedisPool.getResource();
            String data = jedis.hget(key, field);
            if(data == null) return null;
            return JSON.parseObject(data, clazz);
        } finally {
            RedisUtil.closeJedis(jedis);
        }
    }

    /**
     * 返回所有的value
     *
     * @param key
     * @return
     */
    public static List <String> getMapValues(String key) {
        JedisPool jedisPool = SpringUtil.getBean(JedisPool.class);
        if(key == null || "".equals(key)) {
            return null;
        }
        Jedis jedis = null;
        try {
            jedis = jedisPool.getResource();
            List <String> list = jedis.hvals(key);
            return list;
        } finally {
            RedisUtil.closeJedis(jedis);
        }
    }

    public static long getMapCount(String key) {
        JedisPool jedisPool = SpringUtil.getBean(JedisPool.class);
        if(key == null || "".equals(key)) {
            return -1;
        }
        Jedis jedis = null;
        try {
            jedis = jedisPool.getResource();
            return jedis.hlen(key);
        } finally {
            RedisUtil.closeJedis(jedis);
        }
    }

    /**
     * 设置String结构key
     *
     * @param key
     * @param val
     * @return
     */
    public static String set(String key, String val) {
        JedisPool jedisPool = SpringUtil.getBean(JedisPool.class);
        if(key == null || "".equals(key)) {
            return "";
        }
        Jedis jedis = null;
        try {
            jedis = jedisPool.getResource();
            return jedis.set(key, val);
        } finally {
            RedisUtil.closeJedis(jedis);
        }
    }

    /**
     * 获取String结构key
     *
     * @param key
     * @return
     */
    public static <T> T get(String key, Class <T> clazz) {
        JedisPool jedisPool = SpringUtil.getBean(JedisPool.class);
        if(key == null || "".equals(key)) {
            return null;
        }
        Jedis jedis = null;
        try {
            jedis = jedisPool.getResource();
            String data = jedis.get(key);
            if(data == null) return null;
            return JSON.parseObject(data, clazz);
        } finally {
            RedisUtil.closeJedis(jedis);
        }
    }

    /**
     * 删除String结构key
     *
     * @param key
     * @return
     */
    public static long del(String key) {
        JedisPool jedisPool = SpringUtil.getBean(JedisPool.class);
        if(key == null || "".equals(key)) {
            return 0;
        }
        Jedis jedis = null;
        try {
            jedis = jedisPool.getResource();
            return jedis.del(key);
        } finally {
            RedisUtil.closeJedis(jedis);
        }
    }

    public static long delMapByFiled(String key, String filed) {
        JedisPool jedisPool = SpringUtil.getBean(JedisPool.class);
        Jedis jedis = null;
        try {
            jedis = jedisPool.getResource();
            return jedis.hdel(key, filed);
        } finally {
            RedisUtil.closeJedis(jedis);
        }
    }

    /**
     * 关闭redis
     *
     * @param jedis
     */
    public static void closeJedis(Jedis jedis) {
        if(jedis != null) {
            jedis.close();
        }
    }
}
View Code

 4、使用方法

 RedisUtil.setMap("bigKey", "field"+admin.getId(), admin);//
 Admin admin= RedisUtil.getMap("bigKey", "field"+id, Admin.class);//

 5、计时器:incr/decr  inceby/decrby 

 6、Redis事务命令:multi标记事务开始  exec 执行 multi 之后发的命令  discard 丢弃所有multi 之后发出的命令

 地理位置、HyperLogLog、位图使用场景也算美滋滋

 参考文档:http://redisdoc.com

posted on 2020-06-11 15:27  fuanfei  阅读(270)  评论(0)    收藏  举报