美文网首页
Spring Boot整合Redis,并且实现查询操作,以及工具

Spring Boot整合Redis,并且实现查询操作,以及工具

作者: 阿里高级软件架构师 | 来源:发表于2020-11-29 03:37 被阅读0次

    最近我在把项目的php后端改成Java后端,之前的php项目我用的是Redis做的缓存记录,然后还要用订阅进行短信推送,所以Redis必须要用到。但是我用spring boot去整合Redis的时候,遇到的问题还是有的,先说整合的步骤吧!

    首先你得在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-redis</artifactId>

                <version>1.3.8.RELEASE</version>

            </dependency>

            <dependency>

                <groupId>org.apache.commons</groupId>

                <artifactId>commons-pool2</artifactId>

            </dependency>

            <dependency>

                <groupId>commons-io</groupId>

                <artifactId>commons-io</artifactId>

                <version>2.6</version>

            </dependency>

            <dependency>

                <groupId>com.alibaba</groupId>

                <artifactId>fastjson</artifactId>

                <version>1.2.38</version>

            </dependency>

            <dependency>

                <groupId>redis.clients</groupId>

                <artifactId>jedis</artifactId>

                <version>2.9.1</version>

            </dependency>

    这些都是得在spring boot里面进行整合的,然后还要进行序列化等操作,这些百度都有

    然后开始在yml里面配置Redis的信息:

    redis:

        password: 123456

        port: 6379

        host: 127.0.0.1

        lettuce:

          pool:

            min-idle: 5

            max-idle: 10

            max-active: 8

            max-wait: 1ms

          shutdown-timeout: 100ms

        database: 0

    然后就是工具类的封装:

    @Slf4j

    @Configuration

    public class RedisConfig {

        @Resource

        private RedisTemplate redisTemplate;

        public RedisTemplate setDataBase(int num) {

            LettuceConnectionFactory connectionFactory = (LettuceConnectionFactory) redisTemplate.getConnectionFactory();

            if (connectionFactory != null && num != connectionFactory.getDatabase()) {

                connectionFactory.setDatabase(num);

                this.redisTemplate.setConnectionFactory(connectionFactory);

                connectionFactory.afterPropertiesSet();//一定要加上这句

                connectionFactory.resetConnection();

            }

            return redisTemplate;

        }

        /**

        * 序列化注入spring容器的RedisTemplate

        *

        * @return

        */

        @Bean

        public RedisTemplate<Serializable, Object> getRedisTemplate() {

            Jackson2JsonRedisSerializer serializer = new Jackson2JsonRedisSerializer(Object.class);

            ObjectMapper mapper = new ObjectMapper();

            mapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);

            serializer.setObjectMapper(mapper);

            redisTemplate.setKeySerializer(new StringRedisSerializer());

            redisTemplate.setValueSerializer(new StringRedisSerializer());

            redisTemplate.setValueSerializer(serializer);

            redisTemplate.setHashKeySerializer(new StringRedisSerializer());

            redisTemplate.setHashValueSerializer(new StringRedisSerializer());

            redisTemplate.afterPropertiesSet();

            return redisTemplate;

        }

    }

    这里有一个注意点:

    因为后期你不可能一直在某个数据库里面加一个数据集合,还得用到其他的库,所以就得用到切换数据库的功能。

    setDatabase后,如果你不用afterPropertiesSet,是无法达到刷新连接信息的目的。

    在看用redis实现异步消息队列时,遇到了注册Event,其中看到了afterPropertiesSet。然后查博客,记录下。

    1、init-method方法,初始化bean的时候执行,可以针对某个具体的bean进行配置。init-method需要在applicationContext.xml配置文档中bean的定义里头写明。例如:<bean id="TestBean" class="nju.software.xkxt.util.TestBean" init-method="init"></bean>这样,当TestBean在初始化的时候会执行TestBean中定义的init方法。

    2、afterPropertiesSet方法,初始化bean的时候执行,可以针对某个具体的bean进行配置。afterPropertiesSet 必须实现 InitializingBean接口。实现 InitializingBean接口必须实现afterPropertiesSet方法。

    3、BeanPostProcessor,针对所有Spring上下文中所有的bean,可以在配置文档applicationContext.xml中配置一个BeanPostProcessor,然后对所有的bean进行一个初始化之前和之后的代理。BeanPostProcessor接口中有两个方法: postProcessBeforeInitialization和postProcessAfterInitialization。 postProcessBeforeInitialization方法在bean初始化之前执行, postProcessAfterInitialization方法在bean初始化之后执行。

    总之,afterPropertiesSet 和init-method之间的执行顺序是afterPropertiesSet 先执行,init-method 后执行。从BeanPostProcessor的作用,可以看出最先执行的是postProcessBeforeInitialization,然后是afterPropertiesSet,然后是init-method,然后是postProcessAfterInitialization。

    @Slf4j

    @Component

    public class RedisUtils {

        @Resource

        private RedisConfig redisConfig;

        /**

        * 根据db获取对应的redisTemplate实例

        *

        * @param db

        * @return redisTemplate实例

        */

        public RedisTemplate<Serializable, Object> getRedisTemplateByDb(final int db) {

            return redisConfig.setDataBase(db);

        }

        /**

        * 设置缓存

        *

        * @param key  缓存key

        * @param value 缓存value

        */

        public void setString(String key, String value, int db) {

            RedisTemplate<Serializable, Object> redisTemplate = getRedisTemplateByDb(db);

            redisTemplate.opsForValue().set(key, value);

            Loger.debug("RedisUtil:set cache key={},value={}", key, value);

        }

        /**

        * 设置缓存,并且自己指定过期时间

        *

        * @param key

        * @param value

        * @param expireTime 过期时间

        */

        public void setString(String key, String value, int expireTime, int db) {

            RedisTemplate<Serializable, Object> redisTemplate = getRedisTemplateByDb(db);

            redisTemplate.opsForValue().set(key, value, expireTime, TimeUnit.SECONDS);

            Loger.debug("RedisUtil:set cache key={},value={}", key, value, expireTime, TimeUnit.SECONDS);

        }

        /**

        * 设置缓存对象,可指定DB

        *

        * @param key 缓存key

        * @param obj 缓存value

        */

        public <T> void setObject(String key, T obj, int db) {

            RedisTemplate<Serializable, Object> redisTemplate = getRedisTemplateByDb(db);

            redisTemplate.opsForValue().set(key, obj);

        }

        /**

        * 新增hashMap值

        *

        * @param key

        * @param hashKey

        * @param hashValue

        * @param db

        * @return void

        * @author Xuyijieing

        * @date 2019年10月26日 9:22

        */

        public <T> void hashPutString(Serializable key, Serializable hashKey, String hashValue, int db) {

            RedisTemplate<Serializable, Object> redisTemplate = getRedisTemplateByDb(db);

            HashOperations<Serializable, Serializable, Serializable> operations = redisTemplate.opsForHash();

            operations.put(key, hashKey, hashValue);

        }

        /**

        * 以map集合的形式添加键值对

        *

        * @param key

        * @param maps

        * @param db

        * @return void

        * @author Sunhj

        * @date 2019年10月26日 9:56

        */

        public void hashPutAll(String key, Map<Serializable, Serializable> maps, int db) {

            RedisTemplate<Serializable, Object> redisTemplate = getRedisTemplateByDb(db);

            HashOperations<Serializable, Serializable, Serializable> operations = redisTemplate.opsForHash();

            operations.putAll(key, maps);

        }

        /**

        * 获取变量中的键值对

        * {key3=value3, key1=value1, key5=value5, key4=value4, key2=value2}

        *

        * @param db

        * @param key

        * @return java.util.Map<String, String>

        * @author Xuyijie

        * @date 2019年10月26日 8:47

        */

        public <T> Map<Object, Object> hashGetAll(int db, Serializable key) {

            RedisTemplate<Serializable, Object> redisTemplate = getRedisTemplateByDb(db);

            return redisTemplate.opsForHash().entries(key);

        }

        /**

        * 判断key是否存在

        *

        * @param key

        * @param db

        * @return java.util.Map<String, String>

        * @author Xuyijie

        * @date 2019年10月26日 8:47

        */

        public <T> Boolean hashHasKey(Serializable key, Serializable hahsKey, int db) {

            RedisTemplate<Serializable, Object> redisTemplate = getRedisTemplateByDb(db);

            return redisTemplate.opsForHash().hasKey(key, hahsKey);

        }

        /**

        * 获取hash表中存在的所有的键

        *

        * @param key

        * @param db

        * @return java.util.List<java.lang.String>

        * @author Sunhj

        * @date 2019年10月26日 10:58

        */

        public Set<Object> hashGetAllHashKeys(Serializable key, int db) {

            RedisTemplate<Serializable, Object> redisTemplate = getRedisTemplateByDb(db);

            return redisTemplate.opsForHash().keys(key);

        }

        /**

        * 获取hash表中存在的所有的值

        *

        * @param key

        * @param db

        * @return java.util.List<java.lang.String>

        * @author Sunhj

        * @date 2019年10月26日 10:58

        */

        public List<Object> hashGetAllHashValues(Serializable key, int db) {

            RedisTemplate<Serializable, Object> redisTemplate = getRedisTemplateByDb(db);

            return redisTemplate.opsForHash().values(key);

        }

        /**

        * 根据key,hashKey

        * 获取hash表中存在的单个值

        *

        * @param key

        * @param db

        * @return java.util.List<java.lang.String>

        * @author Sunhj

        * @date 2019年10月26日 10:58

        */

        public Object hashGetObject(Serializable key, Serializable hashKey, int db) {

            RedisTemplate<Serializable, Object> redisTemplate = getRedisTemplateByDb(db);

            return redisTemplate.opsForHash().get(key, hashKey);

        }

        /**

        * 删除一个或者多个hash表字段

        *

        * @param key

        * @param db

        * @param fields

        * @return java.lang.Long

        * @author Sunhj

        * @date 2019年10月26日 10:15

        */

        public Long hashDelete(Serializable key, int db, Serializable... fields) {

            RedisTemplate<Serializable, Object> redisTemplate = getRedisTemplateByDb(db);

            HashOperations<Serializable, Serializable, Serializable> operations = redisTemplate.opsForHash();

            return operations.delete(key, (Object) fields);

        }

        /**

        * 删除一个hash表字段

        *

        * @param key

        * @param db

        * @param fields

        * @return java.lang.Long

        * @author Sunhj

        * @date 2019年10月26日 10:15

        */

        public boolean hashDeleteOne(Serializable key, String fields, int db) {

            RedisTemplate<Serializable, Object> redisTemplate = getRedisTemplateByDb(db);

            HashOperations<Serializable, Serializable, Serializable> operations = redisTemplate.opsForHash();

            return operations.delete(key, fields) == 1;

        }

        /**

        * 设置缓存对象

        *

        * @param key 缓存key

        * @param obj 缓存value

        */

        public <T> void setObject(String key, T obj, int expireTime, int db) {

            RedisTemplate<Serializable, Object> redisTemplate = getRedisTemplateByDb(db);

            redisTemplate.opsForValue().set(key, obj, expireTime, TimeUnit.SECONDS);

        }

        /**

        * 获取指定key的缓存

        *

        * @param key---JSON.parseObject(value, User.class);

        */

        public Object getObject(String key, int db) {

            RedisTemplate<Serializable, Object> redisTemplate = getRedisTemplateByDb(db);

            return redisTemplate.opsForValue().get(key);

        }

        /**

        * 获取指定key的缓存

        *

        * @param key---JSON.parseObject(value, User.class);

        */

        public Object getKeys(String key, int db) {

            RedisTemplate<Serializable, Object> redisTemplate = getRedisTemplateByDb(db);

            return redisTemplate.opsForValue().getOperations().keys(key);

        }

        /**

        * 判断当前key值 是否存在

        *

        * @param key

        */

        public boolean hasKey(String key, int db) {

            RedisTemplate<Serializable, Object> redisTemplate = getRedisTemplateByDb(db);

            return redisTemplate.hasKey(key);

        }

        /**

        * 获取指定key的缓存

        *

        * @param key

        */

        public String getString(String key, int db) {

            RedisTemplate<Serializable, Object> redisTemplate = getRedisTemplateByDb(db);

            String value = (String) redisTemplate.opsForValue().get(key);

            Loger.debug("RedisUtil:get cache key={},value={}", key, value);

            return value;

        }

        /**

        * 删除指定key的缓存

        *

        * @param key

        */

        public boolean delete(String key, int db) {

            RedisTemplate<Serializable, Object> redisTemplate = getRedisTemplateByDb(db);

            return redisTemplate.delete(key);

        }

        /**

        * @param key

        * @throws

        * @Title: expire

        * @Description: 更新key的失效时间

        */

        public Boolean expire(String key, int seconds, int db) {

            RedisTemplate<Serializable, Object> redisTemplate = getRedisTemplateByDb(db);

            Loger.debug("RedisUtil:expire cache key={}", key);

            return redisTemplate.expire(key, seconds, TimeUnit.SECONDS);

        }

        /**

        * 移除并获取列表中第一个元素

        *

        * @param key

        * @param db

        * @return void

        * @author sunhj

        * @date 2019年10月26日 14:35

        */

        public String listLeftPop(Serializable key, int db) {

            RedisTemplate<Serializable, Object> redisTemplate = getRedisTemplateByDb(db);

            Object leftPop = redisTemplate.opsForList().leftPop(key);

            if (leftPop == null) {

                return null;

            }

            return JSON.toJSONString(leftPop);

        }

        /**

        * 移除并获取列表最后一个元素

        *

        * @param key

        * @param db

        * @return java.lang.Object

        * @author sunhj

        * @date 2019年10月26日 14:40

        */

        public String listRightPop(Serializable key, int db) {

            RedisTemplate<Serializable, Object> redisTemplate = getRedisTemplateByDb(db);

            ListOperations<Serializable, Object> operations = redisTemplate.opsForList();

            Object x = operations.rightPop(key);

            if (x == null) {

                return null;

            }

            return JSON.toJSONString(x);

        }

        /**

        * 获取变量中的指定map键是否有值,如果存在该map键则获取值,没有则返回null。

        *

        * @param key

        * @param field

        * @param db

        * @return T

        * @author Sunhj

        * @date 2019年10月26日 8:41

        */

        public <T> T hashGet(Serializable key, Serializable field, Class<T> t, int db) {

            try {

                RedisTemplate<Serializable, Object> redisTemplate = getRedisTemplateByDb(db);

                HashOperations<Serializable, Serializable, Serializable> operations = redisTemplate.opsForHash();

                //String x = Objects.requireNonNull(operations.get(key, field)).toString();

                //T y = JSON.parseObject(Objects.requireNonNull(operations.get(key, field)).toString(), t);

                //T y = JSON.parseObject(x , t);

                return JSON.parseObject(Objects.requireNonNull(operations.get(key, field)).toString(), t);

            } catch (Exception e) {

                return null;

            }

        }

        /**

        * 获取变量中的指定map键是否有值,如果存在该map键则获取值(String格式),没有则返回null。

        *

        * @param key

        * @param field

        * @param db

        * @return T

        * @author Sunhj

        * @date 2019年10月26日 8:41

        */

        public String hashGetString(Serializable key, Serializable field, int db) {

            RedisTemplate<Serializable, Object> redisTemplate = getRedisTemplateByDb(db);

            HashOperations<Serializable, Serializable, Serializable> operations = redisTemplate.opsForHash();

            try {

                Serializable serializable = operations.get(key, field);

                if (serializable != null) {

                    return serializable.toString();

                }

                return null;

            } catch (Exception e) {

                Loger.error("hashGetString方法异常", e);

                return null;

            }

        }

        /**

        * 获取变量中的键值对 ??

        *

        * @param key

        * @param db

        * @return java.util.Map<String, String>

        * @author Sunhj

        * @date 2019年10月26日 8:47

        */

        public <T> Map<String, T> hashGetAll(Serializable key, Class<T> t, int db) {

            RedisTemplate<Serializable, Object> redisTemplate = getRedisTemplateByDb(db);

            HashOperations<Serializable, Serializable, Serializable> operations = redisTemplate.opsForHash();

            Map<Serializable, Serializable> x = operations.entries(key);

            Map<String, T> map = new HashMap<>();

            try {

                for (Serializable xa : x.keySet()) {

                    String keyValue = x.get(xa).toString();

                    map.put(xa.toString(), JSON.parseObject(keyValue, t));

                }

                return map;

            } catch (Exception e) {

                return null;

            }

        }

        /**

        * 新增hashMap值

        *

        * @param key

        * @param hashKey

        * @param hashValue

        * @param db

        * @return void

        * @author Sunhj

        * @date 2019年10月26日 9:22

        */

        public <T> boolean hashPut(Serializable key, Serializable hashKey, T hashValue, int db) {

            RedisTemplate<Serializable, Object> redisTemplate = getRedisTemplateByDb(db);

            HashOperations<Serializable, Serializable, Serializable> operations = redisTemplate.opsForHash();

            operations.put(key, hashKey, JSON.toJSONString(hashValue, SerializerFeature.WriteMapNullValue));

            return true;

        }

        /**

        * 查看hash表中指定字段是否存在

        *

        * @param key

        * @param field

        * @param db

        * @return boolean

        * @author Sunhj

        * @date 2019年10月26日 10:32

        */

        public boolean hashExists(Serializable key, Serializable field, int db) {

            RedisTemplate<Serializable, Object> redisTemplate = getRedisTemplateByDb(db);

            HashOperations<Serializable, Serializable, Serializable> operations = redisTemplate.opsForHash();

            return operations.hasKey(key, field);

        }

        /**

        * 存储在list的头部,即添加一个就把它放在最前面的索引处

        *

        * @param key

        * @param value

        * @param db

        * @return java.lang.Long

        * @author sunhj

        * @date 2019年10月26日 14:03

        */

        public Long listLeftPush(Serializable key, Serializable value, int db) {

            RedisTemplate<Serializable, Object> redisTemplate = getRedisTemplateByDb(db);

            ListOperations<Serializable, Object> operations = redisTemplate.opsForList();

            return operations.leftPush(key, value);

        }

        /**

        * 获取所有的KEY

        *

        * @param key

        */

        public List<Object> getHashKeys(String key, int db) {

            RedisTemplate<Serializable, Object> redisTemplate = getRedisTemplateByDb(db);

            List<Object> values = redisTemplate.opsForHash().values(key);

            return values;

        }

    }

    这些都是比较简单的,,没什么好说的

    然后平常使用redis的时候,避免不了使用树形的结构,就是

    用:隔开的树形结构,但是你用redisTeamplate用get()是拿不到的,而且你就算使用通配符也拿不到,这个就得看源码了!具体的我不分析了,不然还是写一大篇

    有一个api 是可以用通配符的,用

    这个是获取Redis对应的键才可以使用通配符,而且RedisManager也做了一个运算符的展示:

    其他的都在上面了,然后后面还要做一个Redis 的连接池,避免Redis的连接资源浪费了,简单的就不多说了

    相关文章

      网友评论

          本文标题:Spring Boot整合Redis,并且实现查询操作,以及工具

          本文链接:https://www.haomeiwen.com/subject/psuhwktx.html