SpringBoot整合Redis(单机/哨兵/集群)

pom

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.3.0.RELEASE</version><relativePath/> <!-- lookup parent from repository --></parent><groupId>com.gblfy</groupId><artifactId>springboot2-redis</artifactId><version>0.0.1-SNAPSHOT</version><name>springboot2-redis</name><description>Spring Boot整合redia 单机 哨兵 集群 三种方式</description><properties><java.version>1.8</java.version></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!--redis Start--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency><!-- redis lettuce 依赖commons-pool  --><dependency><groupId>org.apache.commons</groupId><artifactId>commons-pool2</artifactId></dependency><!--redis End--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><!--工具包--><dependency><groupId>org.apache.commons</groupId><artifactId>commons-lang3</artifactId><version>3.9</version></dependency><dependency><groupId>commons-collections</groupId><artifactId>commons-collections</artifactId><version>3.2.2</version></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency><!--序列化--><dependency><groupId>com.google.code.gson</groupId><artifactId>gson</artifactId></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build></project>

application.yml

server:port: 80
spring:profiles:active: alone

#单机模式

spring:redis:host: 192.168.0.114port: 6379### Redis数据库索引(默认为0)database: 0### 连接超时时间(毫秒)timeout: 60000mspassword:lettuce:pool:### 最大连接数(使用负值表示没有限制) 默认8max-active: 8### 最小空闲连接  默认8min-idle: 0### 连接池中的最大空闲连接 默认8max-idle: 8### 连接池最大阻塞等待时间(使用负值表示没有限制)max-wait: -1ms

application.yml集群

#集群
spring:redis:cluster:nodes:- 192.168.0.114:7001- 192.168.0.114:7002- 192.168.0.114:7003- 192.168.0.114:7004- 192.168.0.114:7005- 192.168.0.114:7006lettuce:pool:### 最大连接数(使用负值表示没有限制) 默认8max-active: 8### 最小空闲连接  默认8min-idle: 0### 连接池中的最大空闲连接 默认8max-idle: 8### 连接池最大阻塞等待时间(使用负值表示没有限制)max-wait: -1ms### 连接超时时间(毫秒)timeout: 60000mspassword:

application-sentinel.yml

#哨兵
spring:redis:sentinel:master: mymasternodes:- 192.168.0.114:26379- 192.168.0.114:26380- 192.168.0.114:26381lettuce:pool:### 最大连接数(使用负值表示没有限制) 默认8max-active: 8### 最小空闲连接  默认8min-idle: 0### 连接池中的最大空闲连接 默认8max-idle: 8### 连接池最大阻塞等待时间(使用负值表示没有限制)max-wait: -1ms### 连接超时时间(毫秒)timeout: 60000mspassword:

redis配置

package com.gblfy.config;import com.fasterxml.jackson.annotation.JsonAutoDetect;
import com.fasterxml.jackson.annotation.PropertyAccessor;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;/*** redis配置类** @author gblfy* @date 2020-04-19*/
@Configuration
public class RedisConfig {@Bean@SuppressWarnings("all")public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {RedisTemplate<String, Object> redisTemplate = new RedisTemplate<String, Object>();redisTemplate.setConnectionFactory(redisConnectionFactory);Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);ObjectMapper objectMapper = new ObjectMapper();objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);objectMapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);jackson2JsonRedisSerializer.setObjectMapper(objectMapper);StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();// key采用String的序列化方式redisTemplate.setKeySerializer(stringRedisSerializer);// hash的key也采用String的序列化方式redisTemplate.setHashKeySerializer(stringRedisSerializer);// valuevalue采用jackson序列化方式redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);// hash的value采用jackson序列化方式redisTemplate.setHashValueSerializer(jackson2JsonRedisSerializer);//开启事务支持redisTemplate.setEnableTransactionSupport(true);redisTemplate.afterPropertiesSet();return redisTemplate;}
}

redis工具类

package com.gblfy.utils;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;
import org.springframework.util.CollectionUtils;import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.TimeUnit;/*** Redis工具类** @author gblfy* @date 2020-04-19*/
@Component
public final class RedisUtils {@Autowiredprivate RedisTemplate<String, Object> redisTemplate;// =============================common============================/*** 指定缓存失效时间** @param key  键* @param time 时间(秒)* @return*/public boolean expire(String key, long time) {try {if (time > 0) {redisTemplate.expire(key, time, TimeUnit.SECONDS);}return true;} catch (Exception e) {e.printStackTrace();return false;}}/*** 根据key 获取过期时间** @param key 键 不能为null* @return 时间(秒) 返回0代表为永久有效*/public long getExpire(String key) {return redisTemplate.getExpire(key, TimeUnit.SECONDS);}/*** 判断key是否存在** @param key 键* @return true 存在 false不存在*/public boolean hasKey(String key) {try {return redisTemplate.hasKey(key);} catch (Exception e) {e.printStackTrace();return false;}}/*** 删除缓存** @param key 可以传一个值 或多个*/@SuppressWarnings("unchecked")public void del(String... key) {if (key != null && key.length > 0) {if (key.length == 1) {redisTemplate.delete(key[0]);} else {redisTemplate.delete(CollectionUtils.arrayToList(key));}}}// ============================String=============================/*** 普通缓存获取** @param key 键* @return 值*/public Object get(String key) {return key == null ? null : redisTemplate.opsForValue().get(key);}/*** 普通缓存放入** @param key   键* @param value 值* @return true成功 false失败*/public boolean set(String key, Object value) {try {redisTemplate.opsForValue().set(key, value);return true;} catch (Exception e) {e.printStackTrace();return false;}}/*** 普通缓存放入并设置时间** @param key   键* @param value 值* @param time  时间(秒) time要大于0 如果time小于等于0 将设置无限期* @return true成功 false 失败*/public boolean set(String key, Object value, long time) {try {if (time > 0) {redisTemplate.opsForValue().set(key, value, time, TimeUnit.SECONDS);} else {set(key, value);}return true;} catch (Exception e) {e.printStackTrace();return false;}}/*** 递增** @param key   键* @param delta 要增加几(大于0)* @return*/public long incr(String key, long delta) {if (delta < 0) {throw new RuntimeException("递增因子必须大于0");}return redisTemplate.opsForValue().increment(key, delta);}/*** 递减** @param key   键* @param delta 要减少几(小于0)* @return*/public long decr(String key, long delta) {if (delta < 0) {throw new RuntimeException("递减因子必须大于0");}return redisTemplate.opsForValue().increment(key, -delta);}// ================================Map=================================/*** HashGet** @param key  键 不能为null* @param item 项 不能为null* @return 值*/public Object hget(String key, String item) {return redisTemplate.opsForHash().get(key, item);}/*** 获取hashKey对应的所有键值** @param key 键* @return 对应的多个键值*/public Map<Object, Object> hmget(String key) {return redisTemplate.opsForHash().entries(key);}/*** HashSet** @param key 键* @param map 对应多个键值* @return true 成功 false 失败*/public boolean hmset(String key, Map<String, Object> map) {try {redisTemplate.opsForHash().putAll(key, map);return true;} catch (Exception e) {e.printStackTrace();return false;}}/*** HashSet 并设置时间** @param key  键* @param map  对应多个键值* @param time 时间(秒)* @return true成功 false失败*/public boolean hmset(String key, Map<String, Object> map, long time) {try {redisTemplate.opsForHash().putAll(key, map);if (time > 0) {expire(key, time);}return true;} catch (Exception e) {e.printStackTrace();return false;}}/*** 向一张hash表中放入数据,如果不存在将创建** @param key   键* @param item  项* @param value 值* @return true 成功 false失败*/public boolean hset(String key, String item, Object value) {try {redisTemplate.opsForHash().put(key, item, value);return true;} catch (Exception e) {e.printStackTrace();return false;}}/*** 向一张hash表中放入数据,如果不存在将创建** @param key   键* @param item  项* @param value 值* @param time  时间(秒) 注意:如果已存在的hash表有时间,这里将会替换原有的时间* @return true 成功 false失败*/public boolean hset(String key, String item, Object value, long time) {try {redisTemplate.opsForHash().put(key, item, value);if (time > 0) {expire(key, time);}return true;} catch (Exception e) {e.printStackTrace();return false;}}/*** 删除hash表中的值** @param key  键 不能为null* @param item 项 可以使多个 不能为null*/public void hdel(String key, Object... item) {redisTemplate.opsForHash().delete(key, item);}/*** 判断hash表中是否有该项的值** @param key  键 不能为null* @param item 项 不能为null* @return true 存在 false不存在*/public boolean hHasKey(String key, String item) {return redisTemplate.opsForHash().hasKey(key, item);}/*** hash递增 如果不存在,就会创建一个 并把新增后的值返回** @param key  键* @param item 项* @param by   要增加几(大于0)* @return*/public double hincr(String key, String item, double by) {return redisTemplate.opsForHash().increment(key, item, by);}/*** hash递减** @param key  键* @param item 项* @param by   要减少记(小于0)* @return*/public double hdecr(String key, String item, double by) {return redisTemplate.opsForHash().increment(key, item, -by);}// ============================set=============================/*** 根据key获取Set中的所有值** @param key 键* @return*/public Set<Object> sGet(String key) {try {return redisTemplate.opsForSet().members(key);} catch (Exception e) {e.printStackTrace();return null;}}/*** 根据value从一个set中查询,是否存在** @param key   键* @param value 值* @return true 存在 false不存在*/public boolean sHasKey(String key, Object value) {try {return redisTemplate.opsForSet().isMember(key, value);} catch (Exception e) {e.printStackTrace();return false;}}/*** 将数据放入set缓存** @param key    键* @param values 值 可以是多个* @return 成功个数*/public long sSet(String key, Object... values) {try {return redisTemplate.opsForSet().add(key, values);} catch (Exception e) {e.printStackTrace();return 0;}}/*** 将set数据放入缓存** @param key    键* @param time   时间(秒)* @param values 值 可以是多个* @return 成功个数*/public long sSetAndTime(String key, long time, Object... values) {try {Long count = redisTemplate.opsForSet().add(key, values);if (time > 0)expire(key, time);return count;} catch (Exception e) {e.printStackTrace();return 0;}}/*** 获取set缓存的长度** @param key 键* @return*/public long sGetSetSize(String key) {try {return redisTemplate.opsForSet().size(key);} catch (Exception e) {e.printStackTrace();return 0;}}/*** 移除值为value的** @param key    键* @param values 值 可以是多个* @return 移除的个数*/public long setRemove(String key, Object... values) {try {Long count = redisTemplate.opsForSet().remove(key, values);return count;} catch (Exception e) {e.printStackTrace();return 0;}}// ===============================list=================================/*** 获取list缓存的内容** @param key   键* @param start 开始* @param end   结束 0 到 -1代表所有值* @return*/public List<Object> lGet(String key, long start, long end) {try {return redisTemplate.opsForList().range(key, start, end);} catch (Exception e) {e.printStackTrace();return null;}}/*** 获取list缓存的长度** @param key 键* @return*/public long lGetListSize(String key) {try {return redisTemplate.opsForList().size(key);} catch (Exception e) {e.printStackTrace();return 0;}}/*** 通过索引 获取list中的值** @param key   键* @param index 索引 index>=0时, 0 表头,1 第二个元素,依次类推;index<0时,-1,表尾,-2倒数第二个元素,依次类推* @return*/public Object lGetIndex(String key, long index) {try {return redisTemplate.opsForList().index(key, index);} catch (Exception e) {e.printStackTrace();return null;}}/*** 将list放入缓存** @param key   键* @param value 值* @param time  时间(秒)* @return*/public boolean lSet(String key, Object value) {try {redisTemplate.opsForList().rightPush(key, value);return true;} catch (Exception e) {e.printStackTrace();return false;}}/*** 将list放入缓存** @param key   键* @param value 值* @param time  时间(秒)* @return*/public boolean lSet(String key, Object value, long time) {try {redisTemplate.opsForList().rightPush(key, value);if (time > 0)expire(key, time);return true;} catch (Exception e) {e.printStackTrace();return false;}}/*** 将list放入缓存** @param key   键* @param value 值* @param time  时间(秒)* @return*/public boolean lSet(String key, List<Object> value) {try {redisTemplate.opsForList().rightPushAll(key, value);return true;} catch (Exception e) {e.printStackTrace();return false;}}/*** 将list放入缓存** @param key   键* @param value 值* @param time  时间(秒)* @return*/public boolean lSet(String key, List<Object> value, long time) {try {redisTemplate.opsForList().rightPushAll(key, value);if (time > 0)expire(key, time);return true;} catch (Exception e) {e.printStackTrace();return false;}}/*** 根据索引修改list中的某条数据** @param key   键* @param index 索引* @param value 值* @return*/public boolean lUpdateIndex(String key, long index, Object value) {try {redisTemplate.opsForList().set(key, index, value);return true;} catch (Exception e) {e.printStackTrace();return false;}}/*** 移除N个值为value** @param key   键* @param count 移除多少个* @param value 值* @return 移除的个数*/public long lRemove(String key, long count, Object value) {try {Long remove = redisTemplate.opsForList().remove(key, count, value);return remove;} catch (Exception e) {e.printStackTrace();return 0;}}
}

实体

package com.gblfy.entity;import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;import java.io.Serializable;@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class User implements Serializable {private static final long serialVersionUID = 1L;private Long id;private String name;
}

测试

package com.gblfy;import com.gblfy.entity.User;
import com.gblfy.utils.RedisUtils;
import com.google.gson.Gson;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections.MapUtils;
import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.TimeUnit;@Slf4j
@SpringBootTest
@RunWith(SpringRunner.class)
public class RedisApplicationTests {@Autowiredprivate RedisUtils redisUtils;@Testpublic void contextLoads() {System.out.println("测试单元测试是否可用!");}//测试 存key string
//            value string/*** 存储String类型 key value*/@Testpublic void testStr() {redisUtils.set("String1", "str");log.info("String1: {}", redisUtils.get("String1"));}/*** 指定key的过期时间*/@Testpublic void testStrExpTimeout() {redisUtils.set("String2", "str2", 60 * 2);log.info("String2: {}", redisUtils.get("String2"));}/*** map*/@Testpublic void testMap() {Map<String, Object> map = new HashMap<String, Object>();map.put("int1", 1);map.put("int2", 2);map.put("int3", 3);redisUtils.set("map1", map, 60 * 2);log.info("map1: {}", redisUtils.get("map1"));}/*** 存储对象+list*/@Testpublic void testmap() {User u = new User();u.setId(1l);u.setName("雨昕");redisUtils.set("u", u, 60 * 2);log.info("u: {}", new Gson().toJson(redisUtils.get("u")));User u1 = (User) redisUtils.get("u");log.info("u1: {}", u1);User u2 = new User();u2.setId(1l);u2.setName("雨泽");List<User> userList = new ArrayList<User>();userList.add(u);userList.add(u2);redisUtils.set("userList", userList, 60 * 2);log.info("userList: {}", new Gson().toJson(redisUtils.get("userList")));}//-----------------------------------------------------------------------------------@Testpublic void testHget() throws Exception {redisUtils.hset("testHget", "testHget", "testHget");Assert.assertEquals("testHget", redisUtils.hget("testHget", "testHget"));redisUtils.hset("testHgetKey", "testHget", "testHgetValue");Assert.assertEquals("testHgetValue", redisUtils.hget("testHgetKey", "testHget"));}@Testpublic void testHmget() throws Exception {redisUtils.hset("testHmget", "testHmget1", "testHmget1");redisUtils.hset("testHmget", "testHmget2", "testHmget2");Map<Object, Object> map = redisUtils.hmget("testHmget");if (MapUtils.isNotEmpty(map)) {for (Map.Entry<Object, Object> e : map.entrySet()) {System.err.println(e.getKey() + "===" + e.getValue());}}}/*** 设置缓存过期时间*/@Testpublic void testExpire() throws Exception {redisUtils.set("aaaKey", "aaaValue");redisUtils.expire("aaaKey", 10);Assert.assertEquals(redisUtils.get("aaaKey"), "aaaValue");TimeUnit.SECONDS.sleep(10);Assert.assertNotEquals(redisUtils.get("aaaKey"), "aaaValue");}@Testpublic void testGetExpire() throws Exception {redisUtils.set("aaaKey", "aaaValue");redisUtils.expire("aaaKey", 10);// 设置了缓存就会及时的生效,所以缓存时间小于最初设置的时间Assert.assertTrue(redisUtils.getExpire("aaaKey") < 10L);}@Testpublic void testHasKey() throws Exception {redisUtils.set("aaaKey", "aaaValue");// 存在的Assert.assertTrue(redisUtils.hasKey("aaaKey"));// 不存在的Assert.assertFalse(redisUtils.hasKey("bbbKey"));}@Testpublic void testDel() throws Exception {redisUtils.set("aaaKey", "aaaValue");// 存在的Assert.assertTrue(redisUtils.hasKey("aaaKey"));redisUtils.del("aaaKey");Assert.assertFalse(redisUtils.hasKey("bbbKey"));}
}

本文源码:https://gitee.com/gb_90/SpringBoot2_Practical_Column

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

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

相关文章

阿里SaaS性能测试平台PTS最佳实践

摘要&#xff1a; PTS&#xff08;Performance Testing Service&#xff09;是web化的卓越的SaaS性能测试平台&#xff0c;具备强大的分布式压测能力&#xff0c;可方便的模拟海量用户的真实业务场景。PTS铂金版在功能上强调页面可视化编排&#xff0c;目前也在快速迭代中&…

go 根据输入类型执行对应的方法_安全很重要:Go项目的安全评估技术

在今年夏天我们对Kubernetes的评估成功之后&#xff0c;我们收到了大量Go项目的安全评估需求。为此&#xff0c;我们将在其他编译语言中使用过的安全评估技术和策略调整适配到多个Go项目中。我们从了解语言的设计开始&#xff0c;识别出开发人员可能无法完全理解语言语义特性的…

计算机科学是对描述和变换,对计算机科学发展的思考

对计算机科学发展的思考从类型上讲,计算主要有两大类:数值计算和符号推导。数值计算包括实数和函数的加减乘除、幂运算、开方运算、方程的(本文共1页)阅读全文>>本文阐述了计算机科学发展以及对各个领域产生了重要的影响,随着计算机的普及,在...(本文共1页)阅读全文>&…

云化要求下,数据库架构如何演进?

戳蓝字“CSDN云计算”关注我们哦&#xff01;作者简介&#xff1a;王涛SequoiaDB联合创始人&CTO如今&#xff0c;大型企业如金融企业和银行等&#xff0c;在下一代的微服务架构转型要求下&#xff0c;需要基础软件和数据平台能够实现原生的云化&#xff0c;以满足微服务架构…

Springboot2学习博客

重点推荐&#xff1a; 知了一笑https://gitee.com/cicadasmile/middle-ware-parent江南一点雨http://www.javaboy.org/2019/0826/springboot-guide.html

看阿里云如何为直播用户营造临场沉浸感?

摘要&#xff1a; 2016年可以说是VR元年&#xff0c;从Facebook的Oculus&#xff0c;HTC的Vive到Sony的PS VR&#xff0c;层出不穷的VR设备和VR内容让用户逐步开始体验到了虚拟现实的魅力。VR视频和VR直播俨然已经成为了展览会议、活动赛事的标配&#xff0c;甚至向婚庆、新闻、…

html计时器组件,vue 计时器组件的实现代码

整理文档&#xff0c;搜刮出一个vue 计时器组件的代码&#xff0c;稍微整理精简一下做下分享。:sendSync"sendSync":autoStart"autoStart":defaultVal"defaultVal">{{countString}}export default {data() {return {isStart: false,globalTim…

苹果遭集体诉讼;华为或年底推出鸿蒙系统中低端智能手机;Facebook雇人记录用户语音通话以改善AI技术……...

戳蓝字“CSDN云计算”关注我们哦&#xff01;嗨&#xff0c;大家好&#xff0c;重磅君带来的【云重磅】特别栏目&#xff0c;如期而至&#xff0c;每周五第一时间为大家带来重磅新闻。把握技术风向标&#xff0c;了解行业应用与实践&#xff0c;就交给我重磅君吧&#xff01;重…

Beetl 模板引擎学习

名称链接Beetl官网http://ibeetl.com/Beetl 文档http://ibeetl.com/guide/#/beetl/BeetlSQL 文档http://ibeetl.com/guide/#/beetlsql/Beetl-BBS 论坛http://bbs.ibeetl.com/bbs/bbs/index/1.htmlGavin-King 博客https://my.oschina.net/gkingb站视频链接https://www.bilibili.…

map语法获取index_复习Elasticsearch的基础语法(一)

之前实践过的Elasticsearch到现在基本上的语法我都回忆不起来了&#xff0c;所以准备写篇文章帮助自己复习一下&#xff0c;没有什么技术含量的分享&#xff0c;但是也分享给想初步了解的朋友们。就不介绍Elasticsearch了&#xff0c;直接进入正文(手动分割线0.0)-------------…

知识图谱数据构建的“硬骨头”,阿里工程师如何拿下?

摘要&#xff1a; 背景简介 为了不断提升搜索体验&#xff0c;神马搜索的知识图谱与应用团队&#xff0c;一直在不断探索和完善图谱的构建技术。其中&#xff0c;开放信息抽取&#xff08;Open Information Extraction&#xff09;&#xff0c;或称通用信息抽取&#xff0c;旨在…

如何通过Dataworks禁止MaxCompute 子账号跨Project访问

摘要&#xff1a; 之前有很多DataWorks用户问MaxCompute访问权限问题&#xff0c;比如子账号为什么可以增删查别人在别的项目创建的表&#xff0c;即使这个子账号并没有加入那个项目 。 今天手把手教大家实现子账号授权并关闭跨Project的数据访问权限。 原文链接&#xff1a;ht…

填补服务机器人市场空白,九号机器人提供智能服务场景解决方案!

现如今&#xff0c;随着社会化和城市化进程的不断加快&#xff0c;快递、外卖等行业日益成熟&#xff0c;然而人工成本高、管理难度大等一系列问题成为该领域不得不思考的问题。那么&#xff0c;如何释放出更强大的服务信号&#xff0c;让“最后一公里”的窘境有一个全新的转变…

武汉大学计算机学院的李明,李明副研究员

个人简介&#xff1a;李明&#xff0c;武汉大学&#xff0c;计算机学院&#xff0c;副研究员&#xff0c;德国KIT的MRT实验室访问学者&#xff0c;在Audi无人驾驶项目中负责定位和地图部分&#xff0c;主要研究方向是多传感器集成、激光雷达数据处理、行驶环境感知方向的工作&a…

sun.misc.BASE64Encoder 不建议使用java.sun自带包中的内容

import sun.misc.BASE64Encoder; import sun.misc.BASE64Decoder; 在项目中&#xff0c;设计到64位编码的。有时开发会用到JDK中自带的BASE64工具。但sun公司是建议不这样做的。尤其是更新了JDK版本&#xff0c;项目甚至还存在保存的信息。可引用 import org.apache.commons.…

eureka集群只注册一个_一、Spring Cloud Eureka服务注册中心

Sping bootEureka是服务中心&#xff0c;管理各种服务功能包括服务的注册、发现、熔断、负载、降级等。Spring Cloud Eureka 是对Netflix公司的Eureka的二次封装。在dubbo的使用中我们通常使用zookeeper作为注册中心。在这里spring cloud使用Eureka&#xff0c; 用一个标准的sp…

基于阿里云数加MaxCompute的企业大数据仓库架构建设思路

摘要&#xff1a; 数加大数据直播系列课程主要以基于阿里云数加MaxCompute的企业大数据仓库架构建设思路为主题分享阿里巴巴的大数据是怎么演变以及怎样利用大数据技术构建企业级大数据平台。 本次分享嘉宾是来自阿里云大数据的技术专家祎休 背景与总体思路 数据仓库是一个面向…

拿来就能用!行,这本 Python 书彻底火了!

戳蓝字“CSDN云计算”关注我们哦&#xff01;Python越来越牛了&#xff1f;自从连续半年拿下TOP1编程语言后&#xff0c;无论是薪资还是招聘需求&#xff0c;都越来越多了&#xff01;同时&#xff0c;作为CSDN的编程小姐姐&#xff0c;我发现只要我推送Python相关的文章&#…

easyui datagrid url不请求请求_Go Web编程--深入学习解析HTTP请求

之前这个系列的文章一直在讲用Go语言怎么编写HTTP服务器来提供服务&#xff0c;如何给服务器配置路由来匹配请求到对应的处理程序&#xff0c;如何添加中间件把一些通用的处理任务从具体的Handler中解耦出来&#xff0c;以及如何更规范地在项目中应用数据库。不过一直漏掉了一个…

MaxCompute JOIN优化小结

摘要&#xff1a; Join是MaxCompute中最基本的语法&#xff0c;但由于数据量和倾斜问题&#xff0c;非常容易出现性能问题。一般情况下&#xff0c;join产生的问题有两大类&#xff1a; 数据倾斜问题&#xff1a;join会将key相同的数据分发到同一个instance上处理&#xff0c;如…