企业级-实现Redis封装层

news2024/11/8 18:05:59

作者:fyupeng
技术专栏:☞ https://github.com/fyupeng
项目地址:☞ https://github.com/fyupeng/distributed-blog-system-api


留给读者

封装 Redis 客户端Dao层、分布式锁等。

一、介绍

二、代码

DataInitialLoadRunner.java

/**
 * @ClassName: DataInitialLoadRunner
 * @Description: 程序启动时初始化加载操作
 *
 */
@Component
@Order(value = 1)
public class DataInitialLoadRunner implements CommandLineRunner {

	protected final static Logger logger = LoggerFactory.getLogger(DataInitialLoadRunner.class);
	
	@Autowired
    private ApplicationContext context;
	/**
	 * 执行程序启动时初始化加载操作
	 * 
	 * @param args
	 * @throws Exception
	 * @see CommandLineRunner#run(String[])
	 */
	@Override
	public void run(String... args) throws Exception {
		logger.info(">>>>>>>>>common系统初始化数据操作开始<<<<<<<<<<");
		// 开始时间
		long begin = System.currentTimeMillis();
		//获取当前启动参数
		CoreConstants.PROFILE_NAME = context.getEnvironment().getActiveProfiles()[0];
		logger.info(">>>>>>>>>当前启动参数:"+CoreConstants.PROFILE_NAME);

		// 加载redis连接池	
		RedisManager.init();
		// 加载获取gwssi-core.properties配置文件
		ResourceBundle torchBundle = ResourceBundle.getBundle("gwssi-core");
		
		//电子文书文件参数初始化设置
		CoreConstants.DOC_APPLY_DATASOURCE_KEY=torchBundle.getString("doc.apply.datasource.key"); //申请端电子文书数据源key
		CoreConstants.DOC_REDIS_DBINDEX = Integer.parseInt(torchBundle.getString("doc.redis.index")); // redis库ID
		CoreConstants.DOC_CONFIG_PATH = torchBundle.getString("doc.config.path"); // 电子文书xml文件路径
		CoreConstants.DOC_BASE_URL_PATH = torchBundle.getString("doc.base.url.path");
		
		//CoreConstants.FILE_IDENTITY_PATH= torchBundle.getString("file.identity.path"); //身份认证文件上传路径
		String initLoad = torchBundle.getString("init.load");
		// 检查程序每次启动时是否都要再加载一遍XML文件放入缓存中
		if (StringUtil.isNotBlank(initLoad.trim()) && "true".equals(initLoad.trim())) {
			logger.info("文书配置加载完成");
		}

		long end = System.currentTimeMillis(); // 结束时间
		logger.info(">>>>>>>>>系统初始化数据操作结束:" + (end - begin) + "ms<<<<<<<<<<");
	}

}

RedisManager.java

/**
 * redis连接池获取数据源连接
 *
 */
public class RedisManager {

    private static Pool<Jedis> pool;

    protected final static Logger logger = LoggerFactory.getLogger(RedisManager.class);

    /**
     * 初始化redis连接池连接
     */
    public static void init() throws Exception {
        // 加载读取application.properties文件
        String profile = CoreConstants.PROFILE_NAME;
        String profilename = "application";
        if (StringUtils.isNotBlank(profile)) {
            profilename += ("-" + profile);
        }
        logger.info("profilename=" + profilename);
        ResourceBundle torchBundle = ResourceBundle.getBundle(profilename);
        //>>>>>>>>初始化Redis连接池<<<<<<<<
        if (torchBundle == null) {
            throw new RuntimeException("没有找到redis配置文件");
        }
        String host = torchBundle.getString("spring.redis.host"); // redis IP地址
        int port = Integer.valueOf(torchBundle.getString("spring.redis.port")); // 端口号
        String password = "";
        if (torchBundle.containsKey("spring.redis.password")) {
            password = torchBundle.getString("spring.redis.password"); // 密码
        }

        logger.info("redis.host=" + host + "----redis.port=" + port);
        // 创建jedis池配置实例
        JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
        // 设置池配置项值
        // 最大连接数
        int poolMaxTotal = Integer.valueOf(torchBundle.getString("spring.redis.maxActive").trim());
        jedisPoolConfig.setMaxTotal(poolMaxTotal);
        // 最大空闲连接数
        int poolMaxIdle = Integer.valueOf(torchBundle.getString("spring.redis.maxIdle").trim());
        int poolMinIdle = Integer.valueOf(torchBundle.getString("spring.redis.MinIdle").trim());
        jedisPoolConfig.setMaxIdle(poolMaxIdle);
        jedisPoolConfig.setMinIdle(poolMinIdle);
        jedisPoolConfig.setMaxTotal(200);
        // 获取连接时的最大等待毫秒数,小于零:阻塞不确定的时间,默认-1
        long poolMaxWaitMillis = Long.valueOf(torchBundle.getString("spring.redis.maxWaitMillis").trim());
        jedisPoolConfig.setMaxWaitMillis(poolMaxWaitMillis);
        //拿到连接的时候是否进行校验操作
        jedisPoolConfig.setTestOnBorrow(true);
        //连接归还池进行校验
        jedisPoolConfig.setTestOnReturn(true);
//表示idle object evitor两次扫描之间要sleep的毫秒数
        jedisPoolConfig.setTimeBetweenEvictionRunsMillis(30000);
//表示idle object evitor每次扫描的最多的对象数
        jedisPoolConfig.setNumTestsPerEvictionRun(10);
//表示一个对象至少停留在idle状态的最短时间,然后才能被idle object evitor扫描并驱逐;这一项只有在timeBetweenEvictionRunsMillis大于0时才有意义
        jedisPoolConfig.setMinEvictableIdleTimeMillis(60000);

        // 添加连接池
        if (StringUtils.isNotBlank(password)) {
            int timeOut = Integer.valueOf(torchBundle.getString("spring.redis.timeOut")); // 超时时间
            pool = new JedisPool(jedisPoolConfig, host, port, timeOut, password);
        } else {
            pool = new JedisPool(jedisPoolConfig, host, port);
        }
        logger.info("redis 初始化完成");
    }

    /**
     * 获取Jedis对象
     *
     * @return
     */
    public static Jedis getResource() {

        Jedis jedis = pool.getResource();
        return jedis;
    }

    /**
     * 获取Jedis对象
     *
     * @param db 数据库序号
     * @return
     */
    public static Jedis getResource(int db) {
        //索引0 =线程
        //索引1 =这个
        //索引2 =直接呼叫者,可以是自己。
        //索引3 ... n =相互调用以获得索引2及以下的类和方法。
		/*StackTraceElement[] stackTrace = Thread.currentThread().getStackTrace();
		for (int i = 0; i < stackTrace.length; i++)
		{
			StackTraceElement s = stackTrace[i];
			System.out.format(" ClassName:%d\t%s\n", i, s.getClassName());
			System.out.format("MethodName:%d\t%s\n", i, s.getMethodName());
			System.out.format("  FileName:%d\t%s\n", i, s.getFileName());
			System.out.format("LineNumber:%d\t%s\n\n", i, s.getLineNumber());
		}*/
        Jedis jedis = pool.getResource();
        jedis.select(db);
        return jedis;
    }


    /**
     * 销毁
     *
     * @throws Exception
     */
    public static void destroy() throws Exception {
        pool.destroy();
    }
}

Redis工具类

/**
 * redis工具类
 *
 */
public class RedisUtils {

    protected final static Logger logger = LoggerFactory.getLogger(RedisUtils.class);
    private static final long sleepTime = 100L;

    /**
     * 根据dbindex删除缓存
     *
     * @param dbIndex
     */
    public static void flushDB(int dbIndex) {
        Jedis jedis = null;
        try {
            jedis = RedisManager.getResource(dbIndex);
            jedis.flushDB();
        } catch (Exception e) {
            logger.error("redis-flushDB异常", e);
        } finally {
            if (jedis != null) {
                jedis.close();
            }
        }
    }

    /**
     * set集合
     *
     * @param key
     * @param value
     */
    public static void set(String key, Object value, int dbIndex) {
        Jedis jedis = null;
        try {
            jedis = RedisManager.getResource(dbIndex);
            if (value instanceof String) {
                jedis.set(key, String.valueOf(value));
            } else {
                jedis.set(key.getBytes(), serialize(value));
            }
        } catch (Exception e) {
            logger.error("redis-set异常", e);
        } finally {
            if (jedis != null) {
                jedis.close();
            }
        }
    }

    /**
     * set集合, 有过期时间
     *
     * @param key
     * @param value
     * @param second
     */
    public static void setex(String key, int second, Object value, int dbIndex) {
        Jedis jedis = null;
        try {
            jedis = RedisManager.getResource(dbIndex);
            if (value instanceof String) {
                jedis.setex(key, second, String.valueOf(value));
            } else {
                jedis.setex(key.getBytes(), second, serialize(value));
            }
        } catch (Exception e) {
            logger.error("redis-set异常", e);
        } finally {
            if (jedis != null) {
                jedis.close();
            }
        }
    }

    /**
     * @param 参数
     * @return void    返回类型
     * @throws
     * @Title: expire
     * @Description: 设置时间
     */
    public static void expire(String key, int secends, int dbIndex) {
        Jedis jedis = null;
        try {
            jedis = RedisManager.getResource(dbIndex);
            jedis.expire(key.getBytes(), secends);
        } catch (Exception e) {
            logger.error("redis-expire异常", e);
        } finally {
            if (jedis != null) {
                jedis.close();
            }
        }
    }

    /**
     * 从redis缓存中获取key的值
     */
    public static String get(String key, int dbIndex) {
        Jedis jedis = null;
        try {
            jedis = RedisManager.getResource(dbIndex);
            return jedis.get(key);
        } catch (Exception e) {
            logger.error("redis-get异常", e);
        } finally {
            if (jedis != null) {
                jedis.close();
            }
        }
        return null;
    }

    /**
     * @param 参数
     * @return Object    返回类型
     * @throws
     * @Title: get
     * @Description: key查询返回Object对象
     */
    public static Object get(byte[] key, int dbIndex) {
        Jedis jedis = null;
        try {
            jedis = RedisManager.getResource(dbIndex);
            logger.info("redis取值:" + key.toString());
            return unserialize(jedis.get(key));
        } catch (Exception e) {
            logger.error("redis-get异常", e);
        } finally {
            if (jedis != null) {
                jedis.close();
            }
        }
        return null;
    }

    /**
     * 根据key删除缓存
     *
     * @param key
     */
    public static void delete(String[] key, int dbIndex) {
        Jedis jedis = null;
        try {
            jedis = RedisManager.getResource(dbIndex);
            logger.info("redis删除:" + key);
            jedis.del(key);
        } catch (Exception e) {
            logger.error("redis-delete异常", e);
        } finally {
            if (jedis != null) {
                jedis.close();
            }
        }
    }

    /**
     * 设置 map
     *
     * @param <T>
     * @param key
     * @param value
     */
    public static <T> void setMap(String key, Map<String, T> map, int dbIndex) {
        Jedis jedis = null;
        try {
            jedis = RedisManager.getResource(dbIndex);
            jedis.set(key.getBytes(), serialize(map));
        } catch (Exception e) {
            logger.error("redis-setMap异常", e);
        } finally {
            if (jedis != null) {
                jedis.close();
            }
        }
    }

    /**
     * 获取list
     *
     * @param <T>
     * @param key
     * @return list
     */
    public static <T> Map<String, T> getMap(String key, int dbIndex) {
        Jedis jedis = null;
        try {
            jedis = RedisManager.getResource(dbIndex);
            if (jedis == null || !jedis.exists(key.getBytes())) {
                return null;
            }
            byte[] in = jedis.get(key.getBytes());
            @SuppressWarnings("unchecked")
            Map<String, T> map = (Map<String, T>) unserialize(in);
            return map;
        } catch (Exception e) {
            logger.error("redis-getMap异常", e);
        } finally {
            if (jedis != null) {
                jedis.close();
            }
        }
        return null;
    }

    /**
     * 设置object
     *
     * @param <T>
     * @param key
     * @param object
     */
    public static <T> void setObject(String key, Object object, int dbIndex) {
        Jedis jedis = null;
        try {
            jedis = RedisManager.getResource(dbIndex);
            jedis.set(key.getBytes(), serialize(object));
        } catch (Exception e) {
            logger.error("redis-setObject异常", e);
        } finally {
            if (jedis != null) {
                jedis.close();
            }
        }
    }

    /**
     * 获取object
     *
     * @param <T>
     * @param key
     * @return list
     */
    public static <T> T getObject(String key, int dbIndex) {
        Jedis jedis = null;
        Object object = null;
        try {
            jedis = RedisManager.getResource(dbIndex);
            if (jedis == null || !jedis.exists(key.getBytes())) {
                return null;
            }
            byte[] in = jedis.get(key.getBytes());
            object = unserialize(in);
        } catch (Exception e) {
            logger.error("redis-getObject异常", e);
        } finally {
            if (jedis != null) {
                jedis.close();
            }
        }
        return object==null?null:(T)object;
    }

    /**
     * 设置 String
     *
     * @param key
     * @param value
     */
    public static void setString(String key, String value, int dbIndex) {
        Jedis jedis = null;
        try {
            jedis = RedisManager.getResource(dbIndex);
            // value = StringUtil.isNullOrEmpty(value) ? "" : value;
            jedis.set(key, value);
        } catch (Exception e) {
            logger.error("redis-setString异常", e);
        } finally {
            if (jedis != null) {
                jedis.close();
            }
        }
    }

    /**
     * 设置 过期时间
     *
     * @param key
     * @param seconds 以秒为单位
     * @param value
     */
    public static void setString(String key, int seconds, String value, int dbIndex) {
        Jedis jedis = null;
        try {
            jedis = RedisManager.getResource(dbIndex);
            // value = StringUtil.isNullOrEmpty(value) ? "" : value;
            jedis.setex(key, seconds, value);
        } catch (Exception e) {
            logger.error("redis-setString异常", e);
        } finally {
            if (jedis != null) {
                jedis.close();
            }
        }
    }

    /**
     * 获取String值
     *
     * @param key
     * @return value
     */
    public static String getString(String key, int dbIndex) {
        Jedis jedis = null;
        try {
            jedis = RedisManager.getResource(dbIndex);
            if (jedis == null || !jedis.exists(key)) {
                return null;
            }
            return jedis.get(key);
        } catch (Exception e) {
            logger.error("redis-getString异常", e);
        } finally {
            if (jedis != null) {
                jedis.close();
            }
        }
        return null;
    }

    /**
     * 设置 list
     *
     * @param <T>
     * @param key
     * @param list
     */
    public static <T> void setList(String key, List<T> list, int dbIndex) {
        Jedis jedis = null;
        try {
            jedis = RedisManager.getResource(dbIndex);
            jedis.set(key.getBytes(), serialize(list));
        } catch (Exception e) {
            logger.error("redis-setList异常", e);
        } finally {
            if (jedis != null) {
                jedis.close();
            }
        }
    }

    /**
     * 获取list
     *
     * @param <T>
     * @param key
     * @return list
     */
    @SuppressWarnings("unchecked")
    public static <T> List<T> getList(String key, int dbIndex) {
        Jedis jedis = null;
        try {
            jedis = RedisManager.getResource(dbIndex);
            if (jedis == null || !jedis.exists(key.getBytes())) {
                return null;
            }
            byte[] in = jedis.get(key.getBytes());
            List<T> list = (List<T>) unserialize(in);
            return list;
        } catch (Exception e) {
            logger.error("redis-getList异常", e);
        } finally {
            if (jedis != null) {
                jedis.close();
            }
        }
        return null;
    }

    public static byte[] getbyte(String key, int secends, int dbIndex) {
        Jedis jedis = null;
        try {
            jedis = RedisManager.getResource(dbIndex);
            if (null == jedis.get(key.getBytes())) {
                return null;
            } else {
                // 更新过期时间
                jedis.expire(key, secends);// 1小时
            }
            return jedis.get(key.getBytes());
        } catch (Exception e) {
            logger.error("session取Redis出现错误", e);
            return null;
        } finally {
            jedis.close();
        }

    }

    /*
     * 序列化对象
     */
    public static byte[] serialize(Object value) {
        if (value == null) {
            throw new NullPointerException("Can't serialize null");
        }
        byte[] rv = null;
        ByteArrayOutputStream bos = null;
        ObjectOutputStream os = null;
        try {
            bos = new ByteArrayOutputStream();
            os = new ObjectOutputStream(bos);
            os.writeObject(value);
            rv = bos.toByteArray();
        } catch (IOException e) {
            logger.error("redis-serialize异常", e);
            throw new IllegalArgumentException("Non-serializable object", e);
        } finally {
            try {
                if (os != null)
                    os.close();
                if (bos != null)
                    bos.close();
            } catch (Exception e2) {
                e2.printStackTrace();
            }
        }
        return rv;
    }

    /**
     * 反序列化对象
     *
     * @return Object
     */
    public static Object unserialize(byte[] in) {
        Object rv = null;
        ByteArrayInputStream bis = null;
        ObjectInputStream is = null;
        try {
            if (in != null) {
                bis = new ByteArrayInputStream(in);
                is = new ObjectInputStream(bis);
                rv = is.readObject();
            }
        } catch (Exception e) {
            logger.error("redis-unserialize异常", e);
        } finally {
            try {
                if (is != null)
                    is.close();
                if (bis != null)
                    bis.close();
            } catch (Exception e2) {
                e2.printStackTrace();
            }
        }
        return rv;
    }

    public static Long incr(String key, int dbIndex) {
        Jedis jedis = null;
        try {
            jedis = RedisManager.getResource(dbIndex);
            if (jedis == null) {
                return null;
            }
            return jedis.incr(key);
        } catch (Exception e) {
            logger.error("redis-getString异常", e);
        } finally {
            if (jedis != null) {
                jedis.close();
            }
        }
        return null;
    }

    /**
     * Jedis执行Lua脚本,获取结果
     *
     * @param lua     Lua字符串
     * @param keys    keys
     * @param args    其他Lua需要参数
     * @param dbIndex 索引
     * @return
     */
    public static Object evalLua(String lua, List<String> keys, List<String> args, int dbIndex) {
        Jedis jedis = null;
        try {
            jedis = RedisManager.getResource(dbIndex);
            if (jedis == null) {
                return null;
            }
            return jedis.eval(lua, keys, args);
        } catch (Exception e) {
            logger.error("redis-执行Lua异常", e);
        } finally {
            if (jedis != null) {
                jedis.close();
            }
        }
        return null;
    }

    /**
     * 自定义获取锁的超时时间
     *
     * @param key
     * @param timeout
     * @param waitTime
     * @param timeUnit
     * @return
     * @throws InterruptedException
     */
    public static boolean tryLock(String key, int timeout, long waitTime, TimeUnit timeUnit) throws InterruptedException {
        try (Jedis jedis = RedisManager.getResource(LOCK_DB_INDEX)) {
            long timeoutSeconds = timeUnit.toSeconds(timeout);
            long waitTimeMicroSeconds = timeUnit.toMicros(waitTime);
            while (waitTimeMicroSeconds >= 0) {
                String result = jedis.set(key, "1", "nx", "ex", timeoutSeconds);
                if ("OK".equals(result)) {
                    return true;
                }
                waitTimeMicroSeconds -= sleepTime;
                Thread.sleep(sleepTime);
            }
        } catch (Exception e) {
            logger.error("redis-setString异常", e);
        }
        return false;
    }

    /**
     * 使用Lua脚本进行解锁操纵,解锁的时候验证value值
     *
     * @param key
     * @return
     */
    public static void unlock(String key) {
        try (Jedis jedis = RedisManager.getResource(LOCK_DB_INDEX)) {
            String luaScript = "if redis.call('get',KEYS[1]) == ARGV[1] then " +
                    "return redis.call('del',KEYS[1]) else return 0 end";
            jedis.eval(luaScript, Collections.singletonList(key), Collections.singletonList("1")).equals(1L);
        } catch (Exception e) {
            logger.error("redis-setString异常", e);
        }
    }

}

三、总结

简洁

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2235990.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

[IAA系列] Image Aesthetic Assessment

Preface 本文旨在记录个人结合AI工具对IAA这个领域的一些了解&#xff0c;主要是通过论文阅读的方式加深对领域的了解。有什么问题&#xff0c;欢迎在评论区提出并讨论。 什么是IAA Image Aesthetic Assessment&#xff08;图像美学评估&#xff09;是一种评估图像在视觉上的…

leetcode 2043.简易银行系统

1.题目要求: 示例: 输入&#xff1a; ["Bank", "withdraw", "transfer", "deposit", "transfer", "withdraw"] [[[10, 100, 20, 50, 30]], [3, 10], [5, 1, 20], [5, 20], [3, 4, 15], [10, 50]] 输出&#xff…

一文了解Android SELinux

在Android系统中&#xff0c;SELinux&#xff08;Security-Enhanced Linux&#xff09;是一个增强的安全机制&#xff0c;用于对系统进行强制访问控制&#xff08;Mandatory Access Control&#xff0c;MAC&#xff09;。它限制了应用程序和进程的访问权限&#xff0c;提供了更…

Java链表及源码解析

文章目录 创建一个ILindkedList接口创建方法(模拟实现链表方法)创建MyLinkedList来实现接口的方法创建链表节点addFirst方法&#xff08;新增头部属性&#xff09;addLast方法&#xff08;新增到末尾一个属性&#xff09;remove方法&#xff08;删除指定属性&#xff09;addInd…

微服务系列四:热更新措施与配置共享

目录 前言 一、基于Nacos的管理中心整体方案 二、配置共享动态维护 2.1 分析哪些配置可拆&#xff0c;需要动态提供哪些参数 2.2 在nacos 分别创建共享配置 创建jdbc相关配置文件 创建日志相关配置文件 创建接口文档配置文件 2.3 拉取本地合并配置文件 2.3.1 拉取出现…

NoETL自动化指标平台为数据分析提质增效,驱动业务决策

直觉判断往往来源于多年的经验和专业知识&#xff0c;能够在复杂和不确定的环境中快速做出决策反应。但这种方式普遍存在主观偏见&#xff0c;缺乏合理的科学依据&#xff0c;无法全面、客观、精准地评估和识别市场趋势与用户需求&#xff0c;从而造成决策失误&#xff0c;给业…

使用亚马逊 S3 连接器为 PyTorch 和 MinIO 创建地图式数据集

在深入研究 Amazon 的 PyTorch S3 连接器之前&#xff0c;有必要介绍一下它要解决的问题。许多 AI 模型需要使用无法放入内存的数据进行训练。此外&#xff0c;许多为计算机视觉和生成式 AI 构建的真正有趣的模型使用的数据甚至无法容纳在单个服务器附带的磁盘驱动器上。解决存…

基于MATLAB的实现垃圾分类Matlab源码

⼀、垃圾分类 如何通过垃圾分类管理&#xff0c;最⼤限度地实现垃圾资源利⽤&#xff0c;减少垃圾处置量&#xff0c;改善⽣存环境质量&#xff0c;是当前世界各国共同关注的迫切问题之⼀。根据国家制定的统⼀标准&#xff0c;现在⽣活垃圾被⼴泛分为四类&#xff0c;分别是可…

硬件基础10 逻辑门电路——CMOS

目录 一、门电路类型 二、CMOS逻辑门 1、CMOS基础 2、MOS管开关电路 &#xff08;1&#xff09;、基础理论分析 &#xff08;2&#xff09;、开关动态特性 3、CMOS反相器 4、与非、或非门 三、逻辑门的不同输出结构与参数 1、CMOS的保护和缓冲 2、漏极开路与三态输出…

新手散户如何避免被割?有量化策略适应暴涨暴跌行情吗?|附代码

这是邢不行第 124 期量化小讲堂的分享 作者 | 邢不行 大A今年上半年的行情较为坎坷&#xff0c;市场持续下跌&#xff0c;导致诸多投资者风格大变&#xff0c;从倾向于高风险的进攻策略转为低风险的防御策略&#xff0c;尤以高股息策略和杠铃策略最为火爆。 本文给大家介绍一…

数据链路层Mac协议与ARP协议

Mac帧 ​ ​ 如何将有效载荷和报头分离&#xff1f; 根据固定大小 ​​ 报头固定大小&#xff0c;按报头大小分离 如何分用&#xff1f; ​​​​ 类型为0800&#xff0c;代表为IP报文&#xff0c;应该交给网络层IP协议 目的地址 原地址为Mac地址 局域网通信 ​ 局…

轮椅车、医用病床等康复类器具检测设备的介绍

康复类器具检测设备是指用于检测、评估和测试康复类器具的设备。康复类器具包括轮椅、助行器、假肢、矫形器等。这些器具在使用前需要经过检测和评估以确保其满足质量、性能、安全和有效性的要求。 康复类器具的测试项目及其设备主要包括以下几种&#xff1a; 1、力学测试设…

WiFi一直获取不到IP地址是怎么回事?

在当今这个信息化时代&#xff0c;WiFi已成为我们日常生活中不可或缺的一部分。无论是家庭、办公室还是公共场所&#xff0c;WiFi都为我们提供了便捷的无线互联网接入。然而&#xff0c;有时我们可能会遇到WiFi连接后无法获取IP地址的问题&#xff0c;这不仅影响了我们的网络使…

基于SSM+VUE儿童接种疫苗预约管理系统JAVA|VUE|Springboot计算机毕业设计源代码+数据库+LW文档+开题报告+答辩稿+部署教+代码讲解

源代码数据库LW文档&#xff08;1万字以上&#xff09;开题报告答辩稿 部署教程代码讲解代码时间修改教程 一、开发工具、运行环境、开发技术 开发工具 1、操作系统&#xff1a;Window操作系统 2、开发工具&#xff1a;IntelliJ IDEA或者Eclipse 3、数据库存储&#xff1a…

城镇住房保障:SpringBoot系统架构解析

2相关技术 2.1 MYSQL数据库 MySQL是一个真正的多用户、多线程SQL数据库服务器。 是基于SQL的客户/服务器模式的关系数据库管理系统&#xff0c;它的有点有有功能强大、使用简单、管理方便、安全可靠性高、运行速度快、多线程、跨平台性、完全网络化、稳定性等&#xff0c;非常…

软件测试—功能测试详解

&#x1f345; 点击文末小卡片 &#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 一、测试项目启动与研读需求文档 &#xff08;一&#xff09; 组建测试团队 1、测试团队中的角色 2、测试团队的基本责任 尽早地发现软件程序、系统或产…

第十五届蓝桥杯C/C++B组题解——数字接龙

题目描述 小蓝最近迷上了一款名为《数字接龙》的迷宫游戏&#xff0c;游戏在一个大小为N N 的格子棋盘上展开&#xff0c;其中每一个格子处都有着一个 0 . . . K − 1 之间的整数。游戏规则如下&#xff1a; 从左上角 (0, 0) 处出发&#xff0c;目标是到达右下角 (N − 1, N …

【9695】基于springboot+vue的学生就业管理系统

作者主页&#xff1a;Java码库 主营内容&#xff1a;SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app等设计与开发。 收藏点赞不迷路 关注作者有好处 文末获取免费源码 项目描述 本学生就业管理系统以springboot作为框架&#xff…

Android使用scheme方式唤醒处于后台时的App场景

场景&#xff1a;甲App唤醒处于后台时的乙App的目标界面Activity&#xff0c;且乙App的目标界面Activity处于最上层&#xff0c;即已经打开状态&#xff0c;要求甲App使用scheme唤醒乙App时&#xff0c;达到跟从桌面icon拉起App效果一致&#xff0c;不能出现只拉起了乙App的目标…

centos7,yum安装mongodb

yum安装mongodb 1.配置MongoDB的yum源2.安装Mongodb3.启动Mongodb4.配置远程访问5.设置mongo密码 1.配置MongoDB的yum源 1.创建yum源文件&#xff0c;输入命令&#xff1a; vim /etc/yum.repos.d/mongodb-org-5.0.repo然后在文件中输入以下内容并保存&#xff1a; [mongodb-…