Spring boot 整合 Jedis

摘要:
1概述1。Jedis是Redis Java实现的客户端,其API为Redis命令提供全面支持。Jedis客户端实例不是线程安全的,因此您需要通过连接池使用Jedis。

1  概述

  1. Jedis是Redis的Java实现的客户端,其API提供了比较全面的Redis命令的支持。

      2.Jedis中的方法调用是比较底层的暴露的Redis的API,也即Jedis中的Java方法基本和Redis的API保持着一致,了解Redis的API,也就能熟练的使用Jedis。

      3.Jedis使用阻塞的I/O,且其方法调用都是同步的,程序流需要等到sockets处理完I/O才能执行,不支持异步。Jedis客户端实例不是线程安全的,所以需要通过连接池来使用Jedis。

      4.Jedis仅支持基本的数据类型如:String、Hash、List、Set、Sorted Set。

2   pom

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

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
  
<version>
2.0.5.RELEASE</version>
</dependency>

3  properties

spring.jedis.enabled = true
spring.jedis.cluster = false
spring.jedis.host = x.x.x.x
spring.jedis.port = x
spring.jedis.password = xxxxx
spring.jedis.pool-config.max-total = 300

4  Jedis配置类JedisProperties

package com.yx.redis.jedis;

import org.apache.commons.pool2.impl.GenericObjectPoolConfig;
import org.springframework.boot.context.properties.ConfigurationProperties;

/**
 * @Auther: yx
 * @Date: 2019-04-30 10:35
 * @Description: RedisProperties
 */
@ConfigurationProperties(prefix = "spring.jedis")
public class JedisProperties {
    boolean cluster = false;

    String hosts;

    String host = "localhost";

    int port = 6379;

    int timeout = 600000;

    String password;

    PoolConfig poolConfig = new PoolConfig();

    Cluster clusterConfig = new Cluster();

    public static class Cluster {
        int connectionTimeout = 5000;
        int soTimeout = 5000;
        int maxAttempts = 5000;

        public int getConnectionTimeout() {
            return connectionTimeout;
        }

        public void setConnectionTimeout(int connectionTimeout) {
            this.connectionTimeout = connectionTimeout;
        }

        public int getSoTimeout() {
            return soTimeout;
        }

        public void setSoTimeout(int soTimeout) {
            this.soTimeout = soTimeout;
        }

        public int getMaxAttempts() {
            return maxAttempts;
        }

        public void setMaxAttempts(int maxAttempts) {
            this.maxAttempts = maxAttempts;
        }
    }

    public static class PoolConfig {
        int maxTotal = GenericObjectPoolConfig.DEFAULT_MAX_TOTAL;

        int maxIdle = GenericObjectPoolConfig.DEFAULT_MAX_IDLE;

        int minIdle = GenericObjectPoolConfig.DEFAULT_MIN_IDLE;

        int numTestsPerEvictionRun = GenericObjectPoolConfig.DEFAULT_NUM_TESTS_PER_EVICTION_RUN;

        long timeBetweenEvictionRunsMillis = GenericObjectPoolConfig.DEFAULT_TIME_BETWEEN_EVICTION_RUNS_MILLIS;

        long minEvictableIdleTimeMillis = GenericObjectPoolConfig.DEFAULT_MIN_EVICTABLE_IDLE_TIME_MILLIS;

        long softMinEvictableIdleTimeMillis = GenericObjectPoolConfig.DEFAULT_SOFT_MIN_EVICTABLE_IDLE_TIME_MILLIS;

        long maxWaitMillis = GenericObjectPoolConfig.DEFAULT_MAX_WAIT_MILLIS;

        boolean testWhileIdle = GenericObjectPoolConfig.DEFAULT_TEST_WHILE_IDLE;

        boolean blockWhenExhausted = GenericObjectPoolConfig.DEFAULT_BLOCK_WHEN_EXHAUSTED;

        boolean testOnCreate = GenericObjectPoolConfig.DEFAULT_TEST_ON_CREATE;

        boolean testOnBorrow = GenericObjectPoolConfig.DEFAULT_TEST_ON_BORROW;

        boolean testOnReturn = GenericObjectPoolConfig.DEFAULT_TEST_ON_RETURN;

        public int getMaxTotal() {
            return maxTotal;
        }

        public void setMaxTotal(int maxTotal) {
            this.maxTotal = maxTotal;
        }

        public int getMaxIdle() {
            return maxIdle;
        }

        public void setMaxIdle(int maxIdle) {
            this.maxIdle = maxIdle;
        }

        public int getMinIdle() {
            return minIdle;
        }

        public void setMinIdle(int minIdle) {
            this.minIdle = minIdle;
        }

        public int getNumTestsPerEvictionRun() {
            return numTestsPerEvictionRun;
        }

        public void setNumTestsPerEvictionRun(int numTestsPerEvictionRun) {
            this.numTestsPerEvictionRun = numTestsPerEvictionRun;
        }

        public long getTimeBetweenEvictionRunsMillis() {
            return timeBetweenEvictionRunsMillis;
        }

        public void setTimeBetweenEvictionRunsMillis(long timeBetweenEvictionRunsMillis) {
            this.timeBetweenEvictionRunsMillis = timeBetweenEvictionRunsMillis;
        }

        public long getMinEvictableIdleTimeMillis() {
            return minEvictableIdleTimeMillis;
        }

        public void setMinEvictableIdleTimeMillis(long minEvictableIdleTimeMillis) {
            this.minEvictableIdleTimeMillis = minEvictableIdleTimeMillis;
        }

        public long getSoftMinEvictableIdleTimeMillis() {
            return softMinEvictableIdleTimeMillis;
        }

        public void setSoftMinEvictableIdleTimeMillis(long softMinEvictableIdleTimeMillis) {
            this.softMinEvictableIdleTimeMillis = softMinEvictableIdleTimeMillis;
        }

        public long getMaxWaitMillis() {
            return maxWaitMillis;
        }

        public void setMaxWaitMillis(long maxWaitMillis) {
            this.maxWaitMillis = maxWaitMillis;
        }

        public boolean isTestWhileIdle() {
            return testWhileIdle;
        }

        public void setTestWhileIdle(boolean testWhileIdle) {
            this.testWhileIdle = testWhileIdle;
        }

        public boolean isBlockWhenExhausted() {
            return blockWhenExhausted;
        }

        public void setBlockWhenExhausted(boolean blockWhenExhausted) {
            this.blockWhenExhausted = blockWhenExhausted;
        }

        public boolean isTestOnCreate() {
            return testOnCreate;
        }

        public void setTestOnCreate(boolean testOnCreate) {
            this.testOnCreate = testOnCreate;
        }

        public boolean isTestOnBorrow() {
            return testOnBorrow;
        }

        public void setTestOnBorrow(boolean testOnBorrow) {
            this.testOnBorrow = testOnBorrow;
        }

        public boolean isTestOnReturn() {
            return testOnReturn;
        }

        public void setTestOnReturn(boolean testOnReturn) {
            this.testOnReturn = testOnReturn;
        }
    }


    public int getTimeout() {
        return timeout;
    }

    public void setTimeout(int timeout) {
        this.timeout = timeout;
    }

    public PoolConfig getPoolConfig() {
        return poolConfig;
    }

    public void setPoolConfig(PoolConfig poolConfig) {
        this.poolConfig = poolConfig;
    }

    public boolean isCluster() {
        return cluster;
    }

    public void setCluster(boolean cluster) {
        this.cluster = cluster;
    }

    public String getHosts() {
        return hosts;
    }

    public void setHosts(String hosts) {
        this.hosts = hosts;
    }

    public String getHost() {
        return host;
    }

    public void setHost(String host) {
        this.host = host;
    }

    public int getPort() {
        return port;
    }

    public void setPort(int port) {
        this.port = port;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public Cluster getClusterConfig() {
        return clusterConfig;
    }

    public void setClusterConfig(Cluster clusterConfig) {
        this.clusterConfig = clusterConfig;
    }
}

5  Jedis配置类JedisTemplate

package com.yx.redis.jedis;

import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisCluster;
import redis.clients.jedis.JedisCommands;

import java.util.List;
import java.util.Map;
import java.util.Set;

/**
 * @Auther: yx
 * @Date: 2019-04-30 10:35
 * @Description: JedisTemplate
 */
public class JedisTemplate {
    private JedisAction jedisAction;
    public JedisCommands jedisCommands;

    public JedisTemplate(final JedisAction jedisAction, final JedisClient jedisClient) {
        this.jedisAction = jedisAction;
        this.jedisCommands = jedisClient.getJedisCommands();
    }

    public void set(String key, String value) {
        jedisAction.execute(new JedisAction.ActionNoResult() {
            @Override
            public void action(Jedis jedis) {
                jedis.set(key, value);
            }

            @Override
            public void action(JedisCluster jedisCluster) {
                jedisCluster.set(key, value);
            }
        });
    }

    public void setex(String key, String value, int time) {
        jedisAction.execute(new JedisAction.ActionNoResult() {
            @Override
            public void action(Jedis jedis) {
                jedis.setex(key, time, value);
            }

            @Override
            public void action(JedisCluster jedisCluster) {
                jedisCluster.setex(key, time, value);
            }
        });
    }

    public void zadd(String key, double score, String member) {
        jedisAction.execute(new JedisAction.ActionNoResult() {
            @Override
            public void action(Jedis jedis) {
                jedis.zadd(key, score, member);
            }

            @Override
            public void action(JedisCluster jedisCluster) {
                jedisCluster.zadd(key, score, member);
            }
        });
    }

    public void zscore(String key, String member) {
        jedisAction.execute(new JedisAction.ActionNoResult() {
            @Override
            public void action(Jedis jedis) {
                jedis.zscore(key, member);
            }

            @Override
            public void action(JedisCluster jedisCluster) {
                jedisCluster.zscore(key, member);
            }
        });
    }

    public void zrem(String key, String member) {
        jedisAction.execute(new JedisAction.ActionNoResult() {
            @Override
            public void action(Jedis jedis) {
                jedis.zrem(key, member);
            }

            @Override
            public void action(JedisCluster jedisCluster) {
                jedisCluster.zrem(key, member);
            }
        });
    }

    public String get(String key) {
        return jedisAction.execute(new JedisAction.ActionResult<String>() {
            @Override
            public String action(Jedis jedis) {
                return jedis.get(key);
            }

            @Override
            public String action(JedisCluster jedisCluster) {
                return jedisCluster.get(key);
            }
        });
    }

    public List<String> mget(String[] key) {
        return jedisAction.execute(new JedisAction.ActionResult<List<String>>() {
            @Override
            public List<String> action(Jedis jedis) {
                return jedis.mget(key);
            }

            @Override
            public List<String> action(JedisCluster jedisCluster) {
                return jedisCluster.mget(key);
            }
        });
    }

    public List<String> hmget(String key, String[] field) {
        return jedisAction.execute(new JedisAction.ActionResult<List<String>>() {
            @Override
            public List<String> action(Jedis jedis) {
                return jedis.hmget(key, field);
            }

            @Override
            public List<String> action(JedisCluster jedisCluster) {
                return jedisCluster.hmget(key, field);
            }
        });
    }

    public void hset(String key, String field, String value) {
        jedisAction.execute(new JedisAction.ActionNoResult() {
            @Override
            public void action(Jedis jedis) {
                jedis.hset(key, field, value);
            }

            @Override
            public void action(JedisCluster jedisCluster) {
                jedisCluster.hset(key, field, value);
            }
        });
    }


    public Long hincrBy(String key, String field, int step) {
        return jedisAction.execute(new JedisAction.ActionResult<Long>() {
            @Override
            public Long action(Jedis jedis) {
                return jedis.hincrBy(key, field, step);
            }

            @Override
            public Long action(JedisCluster jedisCluster) {
                return jedisCluster.hincrBy(key, field, step);
            }
        });
    }

    public String hget(String key, String field) {
        return jedisAction.execute(new JedisAction.ActionResult<String>() {
            @Override
            public String action(Jedis jedis) {
                return jedis.hget(key, field);
            }

            @Override
            public String action(JedisCluster jedisCluster) {
                return jedisCluster.hget(key, field);
            }
        });
    }


    public Long hdel(String key, String field) {
        return jedisAction.execute(new JedisAction.ActionResult<Long>() {
            @Override
            public Long action(Jedis jedis) {
                return jedis.hdel(key, field);
            }

            @Override
            public Long action(JedisCluster jedisCluster) {
                return jedisCluster.hdel(key, field);
            }
        });
    }

    public void expire(String key, int seconds) {
        jedisAction.execute(new JedisAction.ActionNoResult() {
            @Override
            public void action(Jedis jedis) {
                jedis.expire(key, seconds);
            }

            @Override
            public void action(JedisCluster jedisCluster) {
                jedisCluster.expire(key, seconds);
            }
        });
    }

    public boolean exists(String... keys) {
        return jedisAction.execute(new JedisAction.ActionResult<Boolean>() {
            @Override
            public Boolean action(Jedis jedis) {
                return jedis.exists(keys) > 0;
            }

            @Override
            public Boolean action(JedisCluster jedisCluster) {
                return jedisCluster.exists(keys) > 0;
            }
        });
    }

    public Map<String, String> hgetAll(String key) {
        return jedisAction.execute(new JedisAction.ActionResult<Map<String, String>>() {

            @Override
            public Map<String, String> action(Jedis jedis) {
                return jedis.hgetAll(key);
            }

            @Override
            public Map<String, String> action(JedisCluster jedisCluster) {
                return jedisCluster.hgetAll(key);
            }
        });
    }

    public Boolean setnxex(String key, int seconds, String value) {
        return "OK".equals(jedisAction.execute(new JedisAction.ActionResult<String>() {

            @Override
            public String action(Jedis jedis) {

                return jedis.set(key, value, "NX", "EX", seconds);
            }

            @Override
            public String action(JedisCluster jedisCluster) {
                return jedisCluster.set(key, value, "NX", "EX", seconds);
            }
        }));
    }

    public Long setnx(String key, String value) {
        return jedisAction.execute(new JedisAction.ActionResult<Long>() {
            @Override
            public Long action(Jedis jedis) {
                return jedis.setnx(key, value);
            }

            @Override
            public Long action(JedisCluster jedisCluster) {
                return jedisCluster.setnx(key, value);
            }
        });
    }

    public Long incr(String key) {
        return jedisAction.execute(new JedisAction.ActionResult<Long>() {

            @Override
            public Long action(Jedis jedis) {
                return jedis.incr(key);
            }

            @Override
            public Long action(JedisCluster jedisCluster) {
                return jedisCluster.incr(key);
            }
        });
    }


    public Long incrBy(String key, int step) {
        return jedisAction.execute(new JedisAction.ActionResult<Long>() {

            @Override
            public Long action(Jedis jedis) {
                return jedis.incrBy(key, step);
            }

            @Override
            public Long action(JedisCluster jedisCluster) {
                return jedisCluster.incrBy(key, step);
            }
        });
    }

    public void sadd(String key, String value) {
        jedisAction.execute(new JedisAction.ActionNoResult() {
            @Override
            public void action(Jedis jedis) {
                jedis.sadd(key, value);
            }

            @Override
            public void action(JedisCluster jedisCluster) {
                jedisCluster.sadd(key, value);
            }
        });
    }

    public Set<String> smembers(String key) {
        return jedisAction.execute(new JedisAction.ActionResult<Set<String>>() {
            @Override
            public Set<String> action(Jedis jedis) {
                return jedis.smembers(key);
            }

            @Override
            public Set<String> action(JedisCluster jedisCluster) {
                return jedisCluster.smembers(key);
            }
        });
    }


    public void srem(String key, String... value) {
        jedisAction.execute(new JedisAction.ActionNoResult() {
            @Override
            public void action(Jedis jedis) {
                jedis.srem(key, value);
            }

            @Override
            public void action(JedisCluster jedisCluster) {
                jedisCluster.srem(key, value);
            }
        });
    }


    public void lpush(String key, String... value) {
        jedisAction.execute(new JedisAction.ActionNoResult() {
            @Override
            public void action(Jedis jedis) {
                jedis.lpush(key, value);
            }

            @Override
            public void action(JedisCluster jedisCluster) {
                jedisCluster.lpush(key, value);
            }
        });
    }

    public void rpush(String key, String... value) {
        jedisAction.execute(new JedisAction.ActionNoResult() {
            @Override
            public void action(Jedis jedis) {
                jedis.rpush(key, value);
            }

            @Override
            public void action(JedisCluster jedisCluster) {
                jedisCluster.rpush(key, value);
            }
        });
    }


    public List<String> lrange(String key, int start, int end) {
        return jedisAction.execute(new JedisAction.ActionResult<List<String>>() {
            @Override
            public List<String> action(Jedis jedis) {
                return jedis.lrange(key, start, end);
            }

            @Override
            public List<String> action(JedisCluster jedisCluster) {
                return jedisCluster.lrange(key, start, end);
            }
        });
    }


    public void lrem(String key, int count, String value) {
        jedisAction.execute(new JedisAction.ActionNoResult() {
            @Override
            public void action(Jedis jedis) {
                jedis.lrem(key, count, value);
            }

            @Override
            public void action(JedisCluster jedisCluster) {
                jedisCluster.lrem(key, count, value);
            }
        });
    }

    public String set(String key, String value, String nxxx, String expx, int timeout) {
        return jedisAction.execute(new JedisAction.ActionResult<String>() {
            @Override
            public String action(Jedis jedis) {
                return jedis.set(key, value, nxxx, expx, timeout);
            }

            @Override
            public String action(JedisCluster jedisCluster) {
                return jedisCluster.set(key, value, nxxx, expx, timeout);
            }
        });
    }

    public void del(String... key) {
        jedisAction.execute(new JedisAction.ActionNoResult() {
            @Override
            public void action(Jedis jedis) {
                jedis.del(key);
            }

            @Override
            public void action(JedisCluster jedisCluster) {
                jedisCluster.del(key);
            }
        });
    }

    public String hmset(String key, Map<String, String> map) {
        return jedisAction.execute(new JedisAction.ActionResult<String>() {
            @Override
            public String action(Jedis jedis) {
                return jedis.hmset(key, map);
            }

            @Override
            public String action(JedisCluster jedisCluster) {
                return jedisCluster.hmset(key, map);
            }
        });
    }

    public Long setnxByte(byte[] key, byte[] value) {
        return jedisAction.execute(new JedisAction.ActionResult<Long>() {
            @Override
            public Long action(Jedis jedis) {
                return jedis.setnx(key, value);
            }

            @Override
            public Long action(JedisCluster jedisCluster) {
                return jedisCluster.setnx(key, value);
            }
        });
    }

    public void setByte(byte[] key, byte[] value) {
        jedisAction.execute(new JedisAction.ActionNoResult() {
            @Override
            public void action(Jedis jedis) {
                jedis.set(key, value);
            }

            @Override
            public void action(JedisCluster jedisCluster) {
                jedisCluster.set(key, value);
            }
        });
    }

    public byte[] getByte(byte[] key) {
        return jedisAction.execute(new JedisAction.ActionResult<byte[]>() {
            @Override
            public byte[] action(Jedis jedis) {
                return jedis.get(key);
            }

            @Override
            public byte[] action(JedisCluster jedisCluster) {
                return jedisCluster.get(key);
            }
        });
    }

    /**
     * 位图
     *
     * @param key
     * @param offset
     * @param value
     * @return 修改之前的状态
     */
    public Boolean setBit(String key, Long offset, boolean value) {
        return jedisAction.execute(new JedisAction.ActionResult<Boolean>() {
            @Override
            public Boolean action(Jedis jedis) {
                return jedis.setbit(key, offset, value);
            }

            @Override
            public Boolean action(JedisCluster jedisCluster) {
                return jedisCluster.setbit(key, offset, value);
            }
        });
    }

    public Boolean getBit(String key, Long offset) {
        return jedisAction.execute(new JedisAction.ActionResult<Boolean>() {
            @Override
            public Boolean action(Jedis jedis) {
                return jedis.getbit(key, offset);
            }

            @Override
            public Boolean action(JedisCluster jedisCluster) {
                return jedisCluster.getbit(key, offset);
            }
        });
    }

    public Set<String> zrevrange(String key, long start, long end) {
        return jedisAction.execute(new JedisAction.ActionResult<Set<String>>() {
            @Override
            public Set<String> action(Jedis jedis) {
                return jedis.zrevrange(key, start, end);
            }

            @Override
            public Set<String> action(JedisCluster jedisCluster) {
                return jedisCluster.zrevrange(key, start, end);
            }
        });
    }

    public Object eval(String script, List<String> keys, List<String> args) {
        return jedisAction.execute(new JedisAction.ActionResult<Object>() {
            @Override
            public Object action(Jedis jedis) {
                return jedis.eval(script, keys, args);
            }

            @Override
            public Object action(JedisCluster jedisCluster) {
                return jedisCluster.eval(script, keys, args);
            }
        });
    }

}

6  Jedis配置类JedisCondition

package com.yx.redis.jedis;

import org.springframework.context.annotation.Condition;
import org.springframework.context.annotation.ConditionContext;
import org.springframework.core.type.AnnotatedTypeMetadata;

/**
 * @Auther: yx
 * @Date: 2019-04-30 10:35
 * @Description: KafkaCondition
 */
public class JedisCondition implements Condition {
    @Override
    public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
        return propertyIsTrue(context, "spring.jedis.enabled");
    }

    private static boolean propertyIsTrue(ConditionContext context, String key) {
        return context.getEnvironment().getProperty(key, Boolean.TYPE, Boolean.FALSE);
    }
}

7  Jedis配置类JedisClient

package com.yx.redis.jedis;

import lombok.Getter;
import lombok.Setter;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisCluster;
import redis.clients.jedis.JedisCommands;
import redis.clients.jedis.JedisPool;

/**
 * @Auther: yx
 * @Date: 2019-04-30 14:16
 * @Description: JedisClient
 */
public class JedisClient {
    @Setter
    private boolean cluster = false;

    @Setter
    private JedisPool jedisPool;

    @Setter
    @Getter
    private JedisCluster jedisCluster;

    public JedisCommands getJedisCommands() {
        if (cluster) {
            return jedisCluster;
        } else {
            return getJedis();
        }
    }

    public Jedis getJedis() {
        return jedisPool.getResource();
    }
}

8  Jedis配置类JedisAction

package com.yx.redis.jedis;

import lombok.Setter;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisCluster;
import redis.clients.jedis.ShardedJedis;

/**
 * @Auther: yx
 * @Date: 2019-04-30 14:30
 * @Description: JedisAction
 */
public class JedisAction {
    @Setter
    private boolean isCluster = false;
    @Setter
    private JedisClient jedisClient;

    interface ActionResult<T>{

        T action(Jedis jedis);


        T action(JedisCluster jedisCluster);

    }

    interface ActionNoResult{

        void action(Jedis jedis);

        void action(JedisCluster jedisCluster);
    }

    public void execute(ActionNoResult actionNoResult){

        if(isCluster){
            JedisCluster jedisCluster = jedisClient.getJedisCluster();
            actionNoResult.action(jedisCluster);
        }else{
            Jedis jedis = null;
            try {
                jedis = jedisClient.getJedis();
                actionNoResult.action(jedis);
            }finally {
                if(jedis != null){
                    jedis.close();
                }
            }

        }

    }

    public <T> T  execute(ActionResult<T> actionResult){

        if(isCluster){
            ShardedJedis shardedJedis = null;
            try {
                JedisCluster jedisCluster = jedisClient.getJedisCluster();
                return actionResult.action(jedisCluster);
            }finally {
                if(shardedJedis != null){
                    shardedJedis.close();
                }
            }
        }else{
            Jedis jedis = null;
            try {
                jedis = jedisClient.getJedis();
                return actionResult.action(jedis);
            }finally {
                if(jedis != null){
                    jedis.close();
                }
            }

        }

    }
}

免责声明:文章转载自《Spring boot 整合 Jedis》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇redis配置文件 redis.conf电脑使用说明书下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

FTP文件上传下载(C#)

下面是ftp上传下载工具,不能直接运行,请删除不必要的代码。 /// <summary> /// ftp文件上传下载 /// </summary> public class FtpHelper { private string FtpServer; private st...

Spring Boot集成thymeleaf异步刷新页面

 现在比较流行前后端分离开发,但在有些业务场景下模板引擎也用的不少。本文介绍thymeleaf页面的局部更新,Spring Boot采用的是2.0.4,先来看代码。 IndexController.java: package com.example.demo.thymeleaf; import org.springframework.stereoty...

Android应用自动更新功能的代码实现

由于Android项目开源所致,市面上出现了N多安卓软件市场。为了让我们开发的软件有更多的用户使用,我们需要向N多市场发布,软件升级后,我们也必须到安卓市场上进行更新,给我们增加了工作量。因此我们有必要给我们的Android应用增加自动更新的功能。 既然实现自动更新,我们首先必须让我们的应用知道是否存在新版本的软件,因此我们可以在自己的网站上放置配置文件...

微服务-使用Redis实现分布式缓存

在单体中对于key信息和用户信息是放在内存中放的,通过session进行管理。 微服务是要放在分布式缓存中,以实现服务的无状态化。 @Autowired privateStringRedisTemplate redisTemplate; @Value("${file.prefix}") privateString imgPrefix;...

iOS开发 字符串

iOS开发之玩转字符串 (转)这是另一个收藏的超链接 来自SegmentFault 大神的精品 下面这是一些常用的方法和属性 记得不牢所以收藏下 //一、NSString /*----------------创建字符串的方法----------------*///1、创建常量字符串。NSString *astring = @"This is a Strin...

SpringMVC之类型转换Converter

(转载:http://blog.csdn.net/renhui999/article/details/9837897) 1.1     目录 1.1      目录 1.2      前言 1.3      Converter接口 1.4      ConversionService接口 1.5      ConverterFactory接口 1.6   ...