前言
由于版本原因,SpringBoot2.0整合Redis和低版本的SpringBoot不太一样,此方案基于Srping Boot 2.x
。
Linux下Redis安装
整合
maven 依赖
org.springframework.boot
spring-boot-starter-data-redis
org.springframework.session
spring-session-data-redis
分布式共享session
参考:参考
配置文件application.properties
# Redis 数据库索引
spring.redis.host=127.0.0.1
spring.redis.port=6379
spring.redis.password=maxzhao
# 连接池最大连接数
spring.redis.jedis.pool.max-active=1000
# 连接池最大阻塞等待时间,负值没有限制
spring.redis.jedis.pool.max-wait=-1
# 连接池中最大空闲连接
spring.redis.jedis.pool.max-idle=10
# 连接池中的最小空闲连接
spring.redis.jedis.pool.min-idle=2
# 超时时间 毫秒
spring.redis.timeout=1000
注入
@Autowired
private RedisTemplate redisTemplate;
@Autowired
private StringRedisTemplate stringRedisTemplate;
// StringRedisTemplate是继承RedisTemplate的,
// RedisTemplate在StringRedisTemplate中泛型定义为String
StringRedisTemplate
源码
public class StringRedisTemplate extends RedisTemplate {
public StringRedisTemplate() {
this.setKeySerializer(RedisSerializer.string());
this.setValueSerializer(RedisSerializer.string());
this.setHashKeySerializer(RedisSerializer.string());
this.setHashValueSerializer(RedisSerializer.string());
}
public StringRedisTemplate(RedisConnectionFactory connectionFactory) {
this();
this.setConnectionFactory(connectionFactory);
this.afterPropertiesSet();
}
protected RedisConnection preProcessConnection(RedisConnection connection, boolean existingConnection) {
return new DefaultStringRedisConnection(connection);
}
}
StringRedisTemplate
测试
这里用的是Springboot Test
@RunWith(SpringRunner.class)
@SpringBootTest(classes = IttestApplication.class)
public class RedisTest {
@Autowired
private RedisTemplate redisTemplate;
@Autowired
private StringRedisTemplate stringRedisTemplate;
@Test
public void testRedisTemplate() {
String prefix = "maxzhao:redisTemplate:";
HashOperations hashOperations = redisTemplate.opsForHash();
ValueOperations valueOps = redisTemplate.opsForValue();
ListOperations listOps = redisTemplate.opsForList();
SetOperations setOps = redisTemplate.opsForSet();
ZSetOperations zSetOps = redisTemplate.opsForZSet();
GeoOperations geoOperations = redisTemplate.opsForGeo();
ClusterOperations clusterOperations = redisTemplate.opsForCluster();
Map map = Arrays.stream(new String[]{"a", "B"}).collect(Collectors.toMap(Function.identity(), Function.identity()));
hashOperations.putAll(prefix + "hash", map);
}
@Test
public void testStringRedisTemplate() {
String prefix = "maxzhao:stringRedisTemplate:";
HashOperations hashOperations = stringRedisTemplate.opsForHash();
hashOperations.putAll(prefix + "hash", Arrays.stream(new String[]{"a", "b"}).collect(Collectors.toMap(Function.identity(), Function.identity())));
hashOperations.putAll(prefix + "hash", Arrays.stream(new String[]{"c", "d"}).collect(Collectors.toMap(Function.identity(), Function.identity())));
hashOperations.putAll(prefix + "hash", Arrays.stream(new String[]{"e", "f"}).collect(Collectors.toMap(Function.identity(), Function.identity())));
hashOperations.put(prefix + "hash", "max", "maxvalue");// a b c d e f max
hashOperations.get(prefix + "hash", "max");// maxvalue
hashOperations.delete(prefix + "hash", "f");// return 1 database:a b c d e max
hashOperations.delete(prefix + "hash", "c", "d");// return 2 database:a b e max
hashOperations.hasKey(prefix + "hash", "max");//return true
hashOperations.values(prefix + "hash");// return map object
ValueOperations valueOperations = stringRedisTemplate.opsForValue();
valueOperations.set(prefix + "value", "value");
valueOperations.set(prefix + "value", "valueTest");//value 被覆盖
valueOperations.get(prefix + "value");// return valueTest
ListOperations listOps = stringRedisTemplate.opsForList();
// listOps.remove(prefix + "list", listOps.size(prefix + "list"), 1);
listOps.leftPush(prefix + "list", "A");
listOps.leftPush(prefix + "list", "B");
listOps.rightPush(prefix + "list", "C", "D");//只有 1:B 2:A
listOps.leftPush(prefix + "list", "C");
listOps.leftPush(prefix + "list", "D");//return 3 1:D 2:C 3:A
listOps.range(prefix + "list", 0, listOps.size(prefix + "list"));//return 3 0:D 1:C 2:A list下标从0开始
listOps.leftPop(prefix + "list");//只有 1:A 返回的为B
listOps.leftPush(prefix + "list2", "A");
listOps.leftPush(prefix + "list2", "B");//只有 1:B 2:A
listOps.rightPush(prefix + "list2", "C");//只有 1:B 2:A 3 C
// set 是无序的,所有pop等获取value的操作,得到结果可能不同
SetOperations setOps = stringRedisTemplate.opsForSet();
setOps.add(prefix + "set", "A");//return 1
setOps.add(prefix + "set", "A");//return 0
setOps.add(prefix + "set", "B");//return 1
setOps.difference(prefix + "set", "A");//return HashSet A,B
setOps.isMember(prefix + "set", "A");//return true
setOps.isMember(prefix + "set", "C");//return false
setOps.members(prefix + "set");//return HashSet A,B
setOps.pop(prefix + "set");// 出序列并删除 1个
setOps.add(prefix + "set", "A","B", "C", "D", "E");//return 5
setOps.pop(prefix + "set", 2);// 出序列并删除 2个
setOps.add(prefix + "set", "A","B", "C", "D", "E");
setOps.move(prefix + "set", "D", "A");//return true database=BCE
// 把当前key=set的c值,move到 key=set1
setOps.move(prefix + "set", "C", prefix + "set1");//return true
setOps.remove(prefix + "set", "C", "D");//删除
// 有序的set
ZSetOperations zSetOps = stringRedisTemplate.opsForZSet();
GeoOperations geoOperations = stringRedisTemplate.opsForGeo();
// 只有jedis 和 lettuce 支持Redis Cluster。
ClusterOperations clusterOperations = stringRedisTemplate.opsForCluster();
System.out.println("====================");
}
}
Redis Cluster
Enabling Redis Cluster
集群的支持是基于非集群通讯构建的。RedisClusterConnection 是RedisConnection 的一个扩展,用来处理和Redis Cluster的通讯,转换错误信息到Spring DAO异常层。RedisClusterConnection 是通过RedisConnectionFactory 创建的,该工程的创建要依据于RedisClusterConfiguration配置。
Example 1. Sample RedisConnectionFactory Configuration for Redis Cluster
@Component
@ConfigurationProperties(prefix = "spring.redis.cluster")
public class ClusterConfigurationProperties {
/*
* spring.redis.cluster.nodes[0] = 127.0.0.1:7379
* spring.redis.cluster.nodes[1] = 127.0.0.1:7380
* ...
*/
List nodes;
/**
* Get initial collection of known cluster nodes in format {@code host:port}.
*
* @return
*/
public List getNodes() {
return nodes;
}
public void setNodes(List nodes) {
this.nodes = nodes;
}
}
@Configuration
public class AppConfig {
/**
* Type safe representation of application.properties
*/
@Autowired ClusterConfigurationProperties clusterProperties;
public @Bean RedisConnectionFactory connectionFactory() {
return new JedisConnectionFactory(
new RedisClusterConfiguration(clusterProperties.getNodes()));
}
}
通过配置文件配置:
# 这个初始化的配置为驱动库指定了一组初始化集群节点。集群可以在线修改配置,但修改结果只会保存在本驱动的内存中,不会写入到配置文件中。
spring.redis.cluster.nodes: Comma delimited list of host:port pairs.
spring.redis.cluster.max-redirects: Number of allowed cluster redirections.
参考:官方文档中文版(个人站)
参考:官方文档中文版(官网)
参考:官方文档中文版(官网doc)
参考:SpringBoot的配置文件
RedisTemplate
源码
public class RedisTemplate extends RedisAccessor implements RedisOperations, BeanClassLoaderAware {
// 是否支持事物,必须通过设置setEnableTransactionSupport(true)显式地为使用中的每个RedisTemplate启用事务支持这将强制将正在使用的重断开绑定到当前线程触发MULTI。如果事务完成时没有错误,则调用EXEC,否则丢弃。一旦在MULTI中,RedisConnection将对写操作进行排队,所有只读操作(例如键)都将通过管道传输到一个新的(非线程绑定的)RedisConnection。
private boolean enableTransactionSupport = false;
// 有一个this.createRedisConnectionProxy代理
private boolean exposeConnection = false;
// afterPropertiesSet()方法用到,此方法允许bean实例在设置了所有bean属性后执行总体配置的验证和最终初始化。
private boolean initialized = false;
// 默认序列化
private boolean enableDefaultSerializer = true;
// 默认使用JdkSerializationRedisSerializer序列化
@Nullable
private RedisSerializer defaultSerializer;
@Nullable
private ClassLoader classLoader;
// 默认使用 this.defaultSerializer 序列化
@Nullable
private RedisSerializer keySerializer = null;
// 默认使用 this.defaultSerializer 序列化
@Nullable
private RedisSerializer valueSerializer = null;
// 默认使用 this.defaultSerializer 序列化
@Nullable
private RedisSerializer hashKeySerializer = null;
// 默认使用 this.defaultSerializer 序列化
@Nullable
private RedisSerializer hashValueSerializer = null;
// 默认使用 new StringRedisSerializer(StandardCharsets.UTF_8)
private RedisSerializer stringSerializer = RedisSerializer.string();
// 用于执行Redis脚本的ScriptExecutor
@Nullable
private ScriptExecutor scriptExecutor;
@Nullable
private ValueOperations valueOps;
@Nullable
private ListOperations listOps;
@Nullable
private SetOperations setOps;
@Nullable
private ZSetOperations zSetOps;
@Nullable
private GeoOperations geoOps;
@Nullable
private HyperLogLogOperations hllOps;
public RedisTemplate() {
}
public void afterPropertiesSet() ;
// 在连接中执行给定的操作对象
@Nullable
public T execute(RedisCallback action) ;
// 在连接中执行给定的操作对象,该对象可以公开,也可以不公开。
@Nullable
public T execute(RedisCallback action, boolean exposeConnection) ;
// 在可公开或不可公开的连接中执行给定的操作对象。此外,可以对连接进行流水线操作。注意,管道的结果被丢弃(使其适合只写的场景)。有道翻译
@Nullable
public T execute(RedisCallback action, boolean exposeConnection, boolean pipeline);
// 执行一个Redis会话。允许在同一个会话中执行多个操作,通过RedisOperations.multi()和RedisOperations.watch(Collection)操作启用“事务”功能。
public T execute(SessionCallback session) ;
//在管道连接上执行给定的Redis会话。允许流水线处理事务。注意,回调函数不能返回非空值,因为它被管道覆盖。
public List executePipelined(SessionCallback session) ;
// 自定义序列化
public List executePipelined(SessionCallback session, @Nullable RedisSerializer resultSerializer) ;
// 在管道连接上执行给定的操作对象,返回结果。注意,回调函数不能返回非空值,因为它被管道覆盖。此方法将使用默认的序列化器反序列化结果
public List executePipelined(RedisCallback action) ;
// 自定义序列化
public List executePipelined(RedisCallback action, @Nullable RedisSerializer resultSerializer) ;
public T execute(RedisScript script, List keys, Object... args) ;
public T execute(RedisScript script, RedisSerializer argsSerializer, RedisSerializer resultSerializer, List keys, Object... args) ;
public T executeWithStickyConnection(RedisCallback callback) ;
private Object executeSession(SessionCallback session) {
return session.execute(this);
}
protected RedisConnection createRedisConnectionProxy(RedisConnection pm) ;
protected RedisConnection preProcessConnection(RedisConnection connection, boolean existingConnection) ;
@Nullable
protected T postProcessResult(@Nullable T result, RedisConnection conn, boolean existingConnection) ;
public boolean isExposeConnection();
public void setExposeConnection(boolean exposeConnection) ;
public boolean isEnableDefaultSerializer() ;
public void setEnableDefaultSerializer(boolean enableDefaultSerializer) ;
@Nullable
public RedisSerializer getDefaultSerializer() ;
public void setDefaultSerializer(RedisSerializer serializer) ;
public void setKeySerializer(RedisSerializer serializer) ;
public RedisSerializer getKeySerializer() ;
public void setValueSerializer(RedisSerializer serializer) ;
public RedisSerializer getValueSerializer() ;
public RedisSerializer getHashKeySerializer() ;
public void setHashKeySerializer(RedisSerializer hashKeySerializer) ;
public RedisSerializer getHashValueSerializer() ;
public void setHashValueSerializer(RedisSerializer hashValueSerializer) ;
public RedisSerializer getStringSerializer() ;
public void setStringSerializer(RedisSerializer stringSerializer) ;
public void setScriptExecutor(ScriptExecutor scriptExecutor) ;
private byte[] rawKey(Object key) ;
private byte[] rawString(String key) ;
private byte[] rawValue(Object value) ;
private byte[][] rawKeys(Collection keys) ;
private K deserializeKey(byte[] value) ;
@Nullable
private List deserializeMixedResults(@Nullable List rawValues, @Nullable RedisSerializer valueSerializer, @Nullable RedisSerializer hashKeySerializer, @Nullable RedisSerializer hashValueSerializer) ;
private Set deserializeSet(Set rawSet, @Nullable RedisSerializer valueSerializer) ;
private Set> convertTupleValues(Set rawValues, @Nullable RedisSerializer valueSerializer) ;
public List exec() ;
public List exec(RedisSerializer valueSerializer) ;
protected List execRaw() ;
public Boolean delete(K key) ;
public Long delete(Collection keys) ;
public Boolean unlink(K key) ;
public Long unlink(Collection keys) ;
public Boolean hasKey(K key) ;
public Long countExistingKeys(Collection keys) ;
public Boolean expire(K key, long timeout, TimeUnit unit) ;
public Boolean expireAt(K key, Date date) ;
public void convertAndSend(String channel, Object message);
public Long getExpire(K key) ;
public Long getExpire(K key, TimeUnit timeUnit) ;
public Set keys(K pattern) ;
public Boolean persist(K key) ;
public Boolean move(K key, int dbIndex) ;
public K randomKey() ;
public void rename(K oldKey, K newKey) ;
public Boolean renameIfAbsent(K oldKey, K newKey) ;
public DataType type(K key);
public byte[] dump(K key) ;
public void restore(K key, byte[] value, long timeToLive, TimeUnit unit, boolean replace) ;
public void multi() ;
public void discard() ;
public void watch(K key) ;
public void watch(Collection keys) ;
public void unwatch() ;
public List sort(SortQuery query) ;
public List sort(SortQuery query, @Nullable RedisSerializer resultSerializer) ;
public List sort(SortQuery query, BulkMapper bulkMapper) ;
public List sort(SortQuery query, BulkMapper bulkMapper, @Nullable RedisSerializer resultSerializer) ;
public Long sort(SortQuery query, K storeKey) ;
public void killClient(String host, int port);
public List getClientList() ;
public void slaveOf(String host, int port) ;
public void slaveOfNoOne() ;
本文地址:SpringBoot整合Redis及Redis简介
推荐 SpringBoot的配置文件
你可能感兴趣的:(SpringBoot整合Redis及Redis简介)
jdk-8u121-windows-x64 安装步骤及下载
心灵宝贝
java windows 开发语言
1.下载JDK安装包JDK安装包下载链接:https://pan.quark.cn/s/50b825f5c31f2.运行安装程序双击下载的jdk-8u121-windows-x64.exe文件启动安装程序。3.选择安装路径安装程序会提示选择JDK的安装路径,默认路径为C:\ProgramFiles\Java\jdk1.8.0_121\,可自定义路径。4.安装JDK点击“下一步”开始安装,安装完成后
Python笔记之多线程与多进程
人间酒中仙
python笔记 python 笔记
Python笔记之多线程与多进程一、简介二、线程基础(`threading`模块)1、概念说明2、代码示例(1)创建与启动线程(2)使用`threading`模块创建多个线程三、进程基础(`multiprocessing`模块)1、概念说明2、代码示例(1)创建与启动进程(2)创建多个进程四、GIL与线程池1、概念说明2、代码示例(1)GIL影响演示(2)使用线程池管理线程五、小结一、简介本章节详
QT 中的元对象系统(三):QObject深入理解
流星雨爱编程
#Qt #C++进阶 qt 开发语言 c++
目录1.简介2.特性2.1.对象树与内存管理2.2.信号与槽机制2.3.事件处理2.4.属性系统2.4.1.Q_PROPERTY配置的属性2.4.2.动态属性2.4.3.实现原理2.5.国际化支持2.6.定时器支持3.类设计(q和d指针)4.总结1.简介QObject这个class是QT对象模型的核心,它是所有Qt对象的基类。它为对象间通信(信号与槽机制)、事件处理、定时器支持以及对象树管理等功能
01背包问题简介
天狼星——白羽
python
01背包问题是动态规划算法中非常经典的一个问题,广泛应用于优化选择场景。它描述的是:给定一组物品(每个物品有重量和价值),以及一个最大承重能力的背包,在不超过背包容积的前提下,如何挑选这些物品使得装入背包中的总价值最高。基本要素n件物品每一件都有两个属性:weight[i]表示第i物品的重量;value[i]表示该物品的价值。背包的最大承载量为W;目标是在满足重量限制的情况下获得最大的总价值Vma
实验八 排序算法的实现
哈哈哈0101
数据结构 算法 经验分享
实验八排序算法的实现一、实验实习目的及要求掌握常用的排序方法,并掌握用高级语言实现排序算法的方法;深刻理解排序的定义和各种排序方法的特点,并能加以灵活应用;了解各种方法的排序过程及其时间复杂度的分析方法。二、实验实习设备(环境)及要求(软硬件条件)实验室,使用VC上机调试出正确结果三、实验实习项目、内容与步骤统计成绩:给出n个学生的考试成绩表,每条信息由姓名和分数组成,试设计一个算法:(1)按分数
Redis数据类型--布隆过滤器类型详解及应用
码农爱java
【Redis】 redis 数据库 缓存
数据结构Redis无论什么数据类型,存储的时候都是以键值对key-value形势存储,并且所有的key都是String类型,本文讨论的数据类型是value的数据类型。布隆过滤器概述:布隆过滤器(BloomFilter)是1970年由布隆提出的,Redis4.0版本已插件的形式引入到Redis中,布隆过滤器是一种占用空间非常小的概率数据结构,效率高,有一定的误判率,而且无法删除元素,主要用于去重场景
基于STM32单片机智能储物柜快递柜无线摄像头视频监控GSM短信设计DIY24-294
通旺科技
单片机 stm32 语音识别
本系统由STM32F103C8T6单片机核心板、无线模块、TFT1.44寸彩屏液晶显示电路、智能语音电路、四路舵机驱动电路、矩阵按键电路、GSM模块和继电器模块及电源电路。【1】硬件相当于存取柜,可通过工作员验证密码后存件及获取柜号及密码。用户可以通过扫描二维码、输入取件码进行取件。同时液晶显示所有相关信息。语音播报操作结果。APP手机端相当于用户手机以及后台服务器功能,能够设置手机号码同时显示该
掌握 PageForge 扩展:从基础应用到深度开发
静态网站
在现代网页设计中,交互元素是提升用户体验的关键。开关(Switch)作为一种直观的交互控件,广泛应用于设置项、特性切换和状态控制等场景。本教程将详细介绍如何在PageForge中使用开关组件,帮助您打造更具交互性的文档和网站。!!!note这里我们使用开关组件来讲解。!!!1.开关组件简介PageForge的开关组件基于TailwindCSS构建,提供了美观且可高度自定义的UI控件。与传统的复选框
OpenManus:快速复刻Manus项目的技术路径与实施策略
花生糖@
manus openmanus AI 开源 人工智能
一、敏捷复刻的工程化基础1.1架构解耦设计OpenManus采用"微内核+插件"架构模式,其核心引擎仅保留智能体调度、消息路由等基础功能,将模型接入、任务处理等模块进行组件化封装。这种设计使得复刻项目时能够快速剥离非必要模块,例如:模块替换:通过修改config.toml的llm配置段,可在1小时内完成从GPT-4到Claude3的模型切换功能裁剪:删除vision模块相关代码及配置项即可实现15
H5播放webrtc视频
视频处理html5
一、简介WebRTC概念WebRTC是由Google主导的,由一组标准、协议和JavaScriptAPI组成,用于实现浏览器之间(端到端之间)的音频、视频及数据共享。WebRTC不需要安装任何插件,通过简单的JavaScriptAPI就可以使得实时通信变成一种标准功能。为什么使用webrtc现在各大浏览器以及终已经逐渐加大对WebRTC技术的支持。下图是webrtc官网给出的现在已经提供支持了的浏
H5播放Rtmp之vue-video-player播放播放
视频播放器html5
一、简介我们看到了HLS播放视频实时性非常差,好的在6-7s,差点的就要10-12s了,也就是人走了,估计视频上还能看到,这对观感效果造成了很大的影响!但是好处就是它是基于http协议文件下载的,所以不需要任何插件,到处播放,处处兼容,所以rtmp和hls在web端的特点如下:HLS(1)使用http协议,兼容所有浏览器。(2)延时非常大,不太适合实时视频源,适合文件点播或历史录像直播。RTMP(
H5播放HLS之videojs播放视频
视频播放器html5
一、简介如果要让网页支持在所有浏览器上播放,就需要使用第三方的播放器。VideoJs是一个较好的播放器库,完全免费,不像JWPlayer一样需要付费才能使用一些高级功能。videojs播放库是比较有名的一个播放库,它不仅支持hls也支持rtmp,不过如果是播放rtmp它最终也是通过flash插件完成的,我们暂时只看hls。二、实现如果使用videojs播放hls前端代码实现如下:Title请升级您
系统设计中的关键原则:打造稳健、高效软件架构的黄金法则
yangqjiayou
运维
系统设计犹如建筑一座摩天大楼,需要遵循一系列严谨的原则来确保其屹立不倒、运行顺畅。本文将揭示系统设计中至关重要的五大原则,辅以深入解读、生动比喻及实用建议,帮助您构建坚固、高效且易于维护的软件系统。一、模块化与分层原则模块化定义:模块化是将系统分解为独立、可复用的功能单元,如同乐高积木,每块积木代表一个特定功能,可以单独拼接、替换或复用。价值:提高代码复用性、降低耦合度、便于团队协作与测试,如同搭
Spring Boot应用知识梳理
你曾经是少年
spring boot 后端 java
一.简介SpringBoot是一个用于快速开发基于Spring框架的应用程序的工具。它简化了基于Spring的应用程序的配置和部署过程,提供了一种快速、便捷的方式来构建独立的、生产级别的Spring应用程序。SpringBoot的一些主要优点包括:1.简化配置:SpringBoot提供了自动配置功能,可以根据应用程序的依赖和环境自动配置Spring应用程序,减少了繁琐的配置工作。2.内嵌式容器:S
眼见不一定为实,孙悟空教你AI换脸换声的技术原理及如何用火眼金睛识别新型诈骗
非知名人士
人工智能
话说俺老孙自从大闹天宫归来,闲来无事,忽闻人间兴起一门奇术——所谓“换脸换声”。听说那乃现代科学家利用人工智能之奥秘,将人脸、声音通通变换得跟戏法似的,让人真假难辨。俺老孙心生好奇,便跃上筋斗云,直奔这科技之都,打算探个究竟。今就由俺老孙来给你们摆一摆,这换脸换声究竟是咋回事,就像俺大闹天宫时施展变化,变化无穷,妙趣横生!话说那日俺老孙正在花果山上闲逛,忽然听见猪八戒捧着一部闪闪发光的“小机灵”—
使用Python 打造专属自己的屏幕录制工具:使用NumPy、PIL和OpenCV的完整指南
LIY若依
opencv 人工智能 python 应用开发 录屏软件
简介在这篇博客中,我们将介绍如何使用NumPy、PIL和OpenCV创建一个屏幕录制工具。通过逐步解析代码片段,解释每个部分的功能,最终展示完整代码。希望这篇博客能帮助你理解如何实现屏幕录制功能。依赖库在运行代码之前,请确保已安装以下依赖库:NumPyPIL(Pillow)OpenCV可以使用以下命令安装这些库:pipinstallnumpypillowopencv-python步骤1:导入必要的
Ubuntu 12.04(32位)安装Oracle 11g(32位)全过程以及几乎所有问题的解决办法
cs294639693
linux
这两天在Ubuntu上安装Oracle把人折腾毁了,即使照着网上的教程来,还是出了很多问题。好在最后终于搞定了。写出来总结一下,免得以后忘了。标题注明32位是因为网上教程几乎全是以64位安装为例的,32位系统下照着做是绝对会安装失败的。出现的问题主要有两方面,一个是安装过程中出现的,另一个是安装完成后出现的。安装过程(主要过程就直接copy别人的教程了)及问题:1.将系统更新到最新:sudoapt
PyTorch 训练循环全攻略:从零到精通的深度学习秘籍
吴师兄大模型
PyTorch 深度学习 pytorch 人工智能 训练循环 LLM 大模型 python
Langchain系列文章目录01-玩转LangChain:从模型调用到Prompt模板与输出解析的完整指南02-玩转LangChainMemory模块:四种记忆类型详解及应用场景全覆盖03-全面掌握LangChain:从核心链条构建到动态任务分配的实战指南04-玩转LangChain:从文档加载到高效问答系统构建的全程实战05-玩转LangChain:深度评估问答系统的三种高效方法(示例生成、手
家用路由器该怎么选
一箭双雕2025
智能路由器 网络
选择家用路由器时,需综合考虑多个因素,以下是一些关键点:1.网络需求:宽带速率:路由器的WAN口速率应至少与宽带速率匹配,若宽带为100M以上的,那么路由器WAN口需支持千兆。设备数量:连接设备越多,对路由器性能要求越高,需选择带机量大的型号。使用场景:如需频繁下载、在线游戏或4K视频,需选择性能更强的路由器。2、家庭户型及安装位置小户型的可以将路由器安装在客厅。大户型的则需要用无线路由器+无线A
Spring Cloud Alibaba OpenFeign 实战:打造稳定高效的远程调用
扣丁梦想家
微服务 微服务 服务调用
1.OpenFeign简介OpenFeign是SpringCloud组件之一,用于在微服务架构中实现声明式HTTP客户端。它让我们可以像调用本地方法一样调用远程HTTP接口,简化了RESTfulAPI的调用逻辑。1.1为什么使用OpenFeign?声明式HTTP调用:只需定义接口,无需手动拼接URL。集成Ribbon负载均衡(SpringCloud2020之后默认使用SpringLoadBalan
如何在PHP中实现表单处理?
破碎的天堂鸟
PHP学习 php 开发语言
在PHP中实现表单处理涉及多个关键步骤,包括表单创建、数据接收、验证、处理及存储。以下是详细实现指南,结合了最佳实践和安全措施:一、表单处理基本流程PHP表单处理的核心流程包括以下步骤:创建HTML表单:定义输入字段和提交方式。提交数据:通过POST或GET方法发送数据。接收数据:使用超全局变量$_POST或$_GET获取数据。验证数据:检查数据的合法性、完整性和安全性。处理数据:存储到数据库、发
鸿蒙的底层是linux吗?
博览鸿蒙
鸿蒙 harmonyos linux 华为
结论:鸿蒙系统的底层技术确实与Linux有关联,但并非完全基于Linux开发。下面详细解释这一点:鸿蒙系统与Linux的关系技术根基:鸿蒙系统采用了Linux内核作为其底层的一部分,但华为在Linux的基础上进行了大量的优化和改进,以适应鸿蒙系统的特定需求和华为自家的硬件设备及软件生态。这意味着鸿蒙系统虽然利用了Linux内核的某些优势,但并非简单地复用Linux的代码或架构。自主可控:由
10-leveldb repair流程及优化方法
anda0109
leveldb从入门到精通 数据库 数据库架构 数据库开发 database nosql
leveldb做为一个单机存储引擎,难免遇到数据损坏的情况:比如意外断电、磁盘坏块等。轻者文件损坏无法读取,严重者则导致数据库无法启动。这个时候就需要进行数据修复了。leveldb提供的修复流程如下:(1)wal日志文件转化为sstable文件(2)扫描所有的sstable文件(a)smallest/largestforthetable(b)largestsequencenumberintheta
【粉丝福利社】鸿蒙HarmonyOS NEXT开发之路 卷1:ArkTS语言篇
愚公搬代码
愚公系列-送书福利社 harmonyos 华为
标题详情作者简介愚公搬代码头衔华为云特约编辑,华为云云享专家,华为开发者专家,华为产品云测专家,CSDN博客专家,CSDN商业化专家,阿里云专家博主,阿里云签约作者,腾讯云优秀博主,腾讯云内容共创官,掘金优秀博主,亚马逊技领云博主,51CTO博客专家等。近期荣誉2022年度博客之星TOP2,2023年度博客之星TOP2,2022年华为云十佳博主,2023年华为云十佳博主,2024年华为云十佳博主等
最新(四)Django学习——模板标签定义及语法:for循环
2301_82243493
程序员 django 学习 状态模式
fromdjango.contribimportadminfromdjango.urlsimportpathfrom.importviewsurlpatterns=[#子路由path(‘test01/’,views.test01),path(‘sing/’,views.sing,{“name”:“小明”,“age”:18},name=“bb”),]②对应的前端html模板文件test02.html
搭建测试用的redis集群 访问失败小记
yinhezhanshen
redis golang
redis运行在virtualbox虚拟机的ubuntu中。golang编写的redis客户端代码运行在windows下。首先在ubuntu下启动redis集群下载redis源码,编译成功后,进入utils/create-cluster目录,运行./create-clusterstart./create-clustercreate在windows下编写访问redis代码packagemainimp
Springboot整合RabbitMQ-MQ交换机、队列工厂初始化工厂
panlupeng
RabbitMQ rabbitmq spring boot java
1.场景案例项目过程中我们应用到的MQ比较多一些例如设备之间的实时通信、后台服务向前端WEB实时传输消息,不过我们在项目初期要定义一些MQ的交换机绑定队列,可以在页面控制台上进行添加,但是我们产品部署现场的时候可不能给甲方进行一步一步的操作所以要做初始化工厂作为数据总线来维护我们项目中的所有MQ管理。2.实例应用-建表操作我们用数据库作为存储,将来WEB端也可以给我们提供页面进行增加删除MQ的控制
clion调整字体打下奥_Clion、IEDA、pycharm的一些简单设置步骤(设置中文菜单、输出中文、字体大小、背景颜色主题)...
轮回道人
clion调整字体打下奥
Clion、IEDA、pycharm的设置及界面是一模一样的,下面我将按照Clion举例,但是在IEDA和pycharm是同样适用,按照方法设置即可一、中文界面clion、ieda、pycharm默认界面为英文界面,可能很多新用户用着不习惯,但现在新版本开始支持中文界面了首先需要将软件更新到2020.1.4版本,以clion为例点击菜单栏上的help选择,点击checkforupdates即可更新
工商管理专业到底值不值得报?
蓑衣客VS索尼克
水文 经验分享 笔记
工商管理专业作为一门综合性学科,涵盖了管理学、经济学、法学等多个领域的知识,培养具备管理、经济、法律及企业管理方面知识和能力的高级专门人才。随着经济的快速发展和企业对管理人才需求的增加,工商管理专业的就业前景广阔,职业发展路径多样。一、就业方向(一)企业管理工商管理专业毕业生可以在各类工商企业、金融机构、政府部门等从事管理相关工作。例如,在中型制造企业担任部门经理,负责部门的日常运营、人员调配、任
Nginx 常用命令和部署详解及案例示范
m0_74825488
面试 学习路线 阿里巴巴 nginx python 大数据
一、Nginx常用命令1.1启动Nginx要启动Nginx服务,可以使用以下命令:sudosystemctlstartnginx1.2停止Nginx如果需要停止Nginx服务,可以使用以下命令:sudosystemctlstopnginx1.3重启Nginx在修改了Nginx配置文件后,需要重启Nginx以使更改生效。可以使用以下命令:sudosystemctlrestartnginx1.4重新加
linux系统服务器下jsp传参数乱码
3213213333332132
java jsp linux windows xml
在一次解决乱码问题中, 发现jsp在windows下用js原生的方法进行编码没有问题,但是到了linux下就有问题, escape,encodeURI,encodeURIComponent等都解决不了问题
但是我想了下既然原生的方法不行,我用el标签的方式对中文参数进行加密解密总该可以吧。于是用了java的java.net.URLDecoder,结果还是乱码,最后在绝望之际,用了下面的方法解决了
Spring 注解区别以及应用
BlueSkator
spring
1. @Autowired
@Autowired是根据类型进行自动装配的。如果当Spring上下文中存在不止一个UserDao类型的bean,或者不存在UserDao类型的bean,会抛出 BeanCreationException异常,这时可以通过在该属性上再加一个@Qualifier注解来声明唯一的id解决问题。
2. @Qualifier
当spring中存在至少一个匹
printf和sprintf的应用
dcj3sjt126com
PHP sprintf printf
<?php
printf('b: %b <br>c: %c <br>d: %d <bf>f: %f', 80,80, 80, 80);
echo '<br />';
printf('%0.2f <br>%+d <br>%0.2f <br>', 8, 8, 1235.456);
printf('th
config.getInitParameter
171815164
parameter
web.xml
<servlet>
<servlet-name>servlet1</servlet-name>
<jsp-file>/index.jsp</jsp-file>
<init-param>
<param-name>str</param-name>
Ant标签详解--基础操作
g21121
ant
Ant的一些核心概念:
build.xml:构建文件是以XML 文件来描述的,默认构建文件名为build.xml。 project:每个构建文
[简单]代码片段_数据合并
53873039oycg
代码
合并规则:删除家长phone为空的记录,若一个家长对应多个孩子,保留一条家长记录,家长id修改为phone,对应关系也要修改。
代码如下:
java 通信技术
云端月影
Java 远程通信技术
在分布式服务框架中,一个最基础的问题就是远程服务是怎么通讯的,在Java领域中有很多可实现远程通讯的技术,例如:RMI、MINA、ESB、Burlap、Hessian、SOAP、EJB和JMS等,这些名词之间到底是些什么关系呢,它们背后到底是基于什么原理实现的呢,了解这些是实现分布式服务框架的基础知识,而如果在性能上有高的要求的话,那深入了解这些技术背后的机制就是必须的了,在这篇blog中我们将来
string与StringBuilder 性能差距到底有多大
aijuans
之前也看过一些对string与StringBuilder的性能分析,总感觉这个应该对整体性能不会产生多大的影响,所以就一直没有关注这块!
由于学程序初期最先接触的string拼接,所以就一直没改变过自己的习惯!
今天碰到 java.util.ConcurrentModificationException 异常
antonyup_2006
java 多线程 工作 IBM
今天改bug,其中有个实现是要对map进行循环,然后有删除操作,代码如下:
Iterator<ListItem> iter = ItemMap.keySet.iterator();
while(iter.hasNext()){
ListItem it = iter.next();
//...一些逻辑操作
ItemMap.remove(it);
}
结果运行报Con
PL/SQL的类型和JDBC操作数据库
百合不是茶
PL/SQL表 标量类型 游标 PL/SQL记录
PL/SQL的标量类型:
字符,数字,时间,布尔,%type五中类型的
--标量:数据库中预定义类型的变量
--定义一个变长字符串
v_ename varchar2(10);
--定义一个小数,范围 -9999.99~9999.99
v_sal number(6,2);
--定义一个小数并给一个初始值为5.4 :=是pl/sql的赋值号
Mockito:一个强大的用于 Java 开发的模拟测试框架实例
bijian1013
mockito 单元测试
Mockito框架:
Mockito是一个基于MIT协议的开源java测试框架。 Mockito区别于其他模拟框架的地方主要是允许开发者在没有建立“预期”时验证被测系统的行为。对于mock对象的一个评价是测试系统的测
精通Oracle10编程SQL(10)处理例外
bijian1013
oracle 数据库 plsql
/*
*处理例外
*/
--例外简介
--处理例外-传递例外
declare
v_ename emp.ename%TYPE;
begin
SELECT ename INTO v_ename FROM emp
where empno=&no;
dbms_output.put_line('雇员名:'||v_ename);
exceptio
【Java】Java执行远程机器上Linux命令
bit1129
linux命令
Java使用ethz通过ssh2执行远程机器Linux上命令,
封装定义Linux机器的环境信息
package com.tom;
import java.io.File;
public class Env {
private String hostaddr; //Linux机器的IP地址
private Integer po
java通信之Socket通信基础
白糖_
java socket 网络协议
正处于网络环境下的两个程序,它们之间通过一个交互的连接来实现数据通信。每一个连接的通信端叫做一个Socket。一个完整的Socket通信程序应该包含以下几个步骤:
①创建Socket;
②打开连接到Socket的输入输出流;
④按照一定的协议对Socket进行读写操作;
④关闭Socket。
Socket通信分两部分:服务器端和客户端。服务器端必须优先启动,然后等待soc
angular.bind
boyitech
AngularJS angular.bind AngularJS API bind
angular.bind 描述: 上下文,函数以及参数动态绑定,返回值为绑定之后的函数. 其中args是可选的动态参数,self在fn中使用this调用。 使用方法: angular.bind(se
java-13个坏人和13个好人站成一圈,数到7就从圈里面踢出一个来,要求把所有坏人都给踢出来,所有好人都留在圈里。请找出初始时坏人站的位置。
bylijinnan
java
import java.util.ArrayList;
import java.util.List;
public class KickOutBadGuys {
/**
* 题目:13个坏人和13个好人站成一圈,数到7就从圈里面踢出一个来,要求把所有坏人都给踢出来,所有好人都留在圈里。请找出初始时坏人站的位置。
* Maybe you can find out
Redis.conf配置文件及相关项说明(自查备用)
Kai_Ge
redis
Redis.conf配置文件及相关项说明
# Redis configuration file example
# Note on units: when memory size is needed, it is possible to specifiy
# it in the usual form of 1k 5GB 4M and so forth:
#
[强人工智能]实现大规模拓扑分析是实现强人工智能的前奏
comsci
人工智能
真不好意思,各位朋友...博客再次更新...
节点数量太少,网络的分析和处理能力肯定不足,在面对机器人控制的需求方面,显得力不从心....
但是,节点数太多,对拓扑数据处理的要求又很高,设计目标也很高,实现起来难度颇大...
记录一些常用的函数
dai_lm
java
public static String convertInputStreamToString(InputStream is) {
StringBuilder result = new StringBuilder();
if (is != null)
try {
InputStreamReader inputReader = new InputStreamRead
Hadoop中小规模集群的并行计算缺陷
datamachine
mapreduce hadoop 并行计算
注:写这篇文章的初衷是因为Hadoop炒得有点太热,很多用户现有数据规模并不适用于Hadoop,但迫于扩容压力和去IOE(Hadoop的廉价扩展的确非常有吸引力)而尝试。尝试永远是件正确的事儿,但有时候不用太突进,可以调优或调需求,发挥现有系统的最大效用为上策。
-----------------------------------------------------------------
小学4年级英语单词背诵第二课
dcj3sjt126com
english word
egg 蛋
twenty 二十
any 任何
well 健康的,好
twelve 十二
farm 农场
every 每一个
back 向后,回
fast 快速的
whose 谁的
much 许多
flower 花
watch 手表
very 非常,很
sport 运动
Chinese 中国的
自己实践了github的webhooks, linux上面的权限需要注意
dcj3sjt126com
github webhook
环境, 阿里云服务器
1. 本地创建项目, push到github服务器上面
2. 生成www用户的密钥
sudo -u www ssh-keygen -t rsa -C "xxx@xx.com"
3. 将密钥添加到github帐号的SSH_KEYS里面
3. 用www用户执行克隆, 源使
Java冒泡排序
蕃薯耀
冒泡排序 Java冒泡排序 Java排序
冒泡排序
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
蕃薯耀 2015年6月23日 10:40:14 星期二
http://fanshuyao.iteye.com/
Excle读取数据转换为实体List【基于apache-poi】
hanqunfeng
apache
1.依赖apache-poi
2.支持xls和xlsx
3.支持按属性名称绑定数据值
4.支持从指定行、列开始读取
5.支持同时读取多个sheet
6.具体使用方式参见org.cpframework.utils.excelreader.CP_ExcelReaderUtilTest.java
比如:
Str
3个处于草稿阶段的Javascript API介绍
jackyrong
JavaScript
原文:
http://www.sitepoint.com/3-new-javascript-apis-may-want-follow/?utm_source=html5weekly&utm_medium=email
本文中,介绍3个仍然处于草稿阶段,但应该值得关注的Javascript API.
1) Web Alarm API
&
6个创建Web应用程序的高效PHP框架
lampcy
Web 框架 PHP
以下是创建Web应用程序的PHP框架,有coder bay网站整理推荐:
1. CakePHP
CakePHP是一个PHP快速开发框架,它提供了一个用于开发、维护和部署应用程序的可扩展体系。CakePHP使用了众所周知的设计模式,如MVC和ORM,降低了开发成本,并减少了开发人员写代码的工作量。
2. CodeIgniter
CodeIgniter是一个非常小且功能强大的PHP框架,适合需
评"救市后中国股市新乱象泛起"谣言
nannan408
首先来看百度百家一位易姓作者的新闻:
三个多星期来股市持续暴跌,跌得投资者及上市公司都处于极度的恐慌和焦虑中,都要寻找自保及规避风险的方式。面对股市之危机,政府突然进入市场救市,希望以此来重建市场信心,以此来扭转股市持续暴跌的预期。而政府进入市场后,由于市场运作方式发生了巨大变化,投资者及上市公司为了自保及为了应对这种变化,中国股市新的乱象也自然产生。
首先,中国股市这两天
页面全屏遮罩的实现 方式
Rainbow702
html css 遮罩 mask
之前做了一个页面,在点击了某个按钮之后,要求页面出现一个全屏遮罩,一开始使用了position:absolute来实现的。当时因为画面大小是固定的,不可以resize的,所以,没有发现问题。
最近用了同样的做法做了一个遮罩,但是画面是可以进行resize的,所以就发现了一个问题,当画面被reisze到浏览器出现了滚动条的时候,就发现,用absolute 的做法是有问题的。后来改成fixed定位就
关于angularjs的点滴
tntxia
AngularJS
angular是一个新兴的JS框架,和以往的框架不同的事,Angularjs更注重于js的建模,管理,同时也提供大量的组件帮助用户组建商业化程序,是一种值得研究的JS框架。
Angularjs使我们可以使用MVC的模式来写JS。Angularjs现在由谷歌来维护。
这里我们来简单的探讨一下它的应用。
首先使用Angularjs我
Nutz--->>反复新建ioc容器的后果
xiaoxiao1992428
DAO mvc IOC nutz
问题:
public class DaoZ {
public static Dao dao() { // 每当需要使用dao的时候就取一次
Ioc ioc = new NutIoc(new JsonLoader("dao.js"));
return ioc.get(