当前位置: 首页 > news >正文

redis的学习(四)

13. 渐进式遍历

        通过渐进式遍历能够获取当前所有的key,又不会讲当前的服务器卡死。不是一个命令将所有的key获取,而是每执行一次命令,只获取到其中的一部分。所以想要获取到所有的key就需要多次遍历,即化整为零的思想。

        渐进式遍历其实是一组命令,其命令的使用方法是一样的。代表命令式scan。

 

 化整为零的渐进式遍历:

        count这里的数值不一定每一次都是一样的,渐进式遍历在遍历过程中,不会在服务器中存储任何的状态信息,且此处的遍历是随时可以终止的,不会对服务器产生任何的副作用。

        渐进性遍历scan虽然解决了阻塞的问题,但如果在遍历期间键有所变化(增加、修改、删 除),可能导致遍历时键的重复遍历或者遗漏。在遍历的时候进行修改/新增/删除,会导致迭代器失效。

14. 数据库管理

        redis中的database是现成的,用户不能创建新的,也不能删除已有的数据库。redis默认提供了16个数据库0~15,这些数据库中的数据是隔离的,默认使用的数据库是0号。

        select dbIndex,切换数据库。

        dbsize:获取当前库中存在的key的个数。

 15. redis客户端介绍

        工作中,是使用redis的api,来实现定制化的redis客户端程序,进一步操作redis服务器。即使用程序来操作服务器。

        关于编写一个自定义的redis客户端:

        主要是因为能够从redis官网获取redis服务器应用层的协议如下:

         resp协议:

        优点:1、简单好实现;2、快速进行解析;3、肉眼可读。

        传输层这里基于tcp,但是和tcp没有进行强耦合。请求和响应之间是一问一答的模式机制。

 

        simple string只能用来传输简单的文本,bulk string可以传输二进制数据。因此redis客户端服务器的工作就是:1、按照上述的格式,构造出字符串,往socket中写入。2、从socket中读取字符串,按照上述格式进行解析。

        java生态中,开发代码高度依赖windows(idea),所以需要通过云服务器的外网ip来访问到linux服务器。redis在云服务器上的端口是6379,一般是被云服务器的防火墙保护起来的。redis的端口不能直接在防火墙上放开。

        不能开发redis端口,邮箱能够通过外网访问方案:

        1、直接让java程序也在linux上运行,即将java代码打包成可执行的jar包,然后将jar包拷贝到linux服务器上执行。

        2、配置ssh端口转发,把云服务器的redis端口映射到本地主机。

下面描述云服务器的端口映射到本地主机:

        windows(本地主机)的终端(类似于xsehll)通过ssh协议访问到云服务器。ssh既是协议也是程序,默认走22端口。ssh其中一个功能是能够支持端口转发,通过走ssh的22端口来传递去其他端口的数据信息。

        即使用本地主机访问云服务器的6379端口,本地先构造一个ssh数据报,将访问redis的请求放到数据报里面,这个数据报会通过22端口发往服务器,服务器的ssh服务器程序就能解析出上述的数据报,将其交给6379端口的程序。一个linux主机上,存在很多的服务器,ssh肯呢个需要给多个端口传递数据,此时为了区分不同的端口,往往会把服务器的端口在本地用另外一个端口来表示。

        所以把服务器的6379端口使用ssh进行端口映射,映射到本地8888端口。则本地的客户端程序访问127.0.0.1:8888,就相当于访问云服务器上的6379。

        下图ssh端口转发隧道:

当ssh连接上之后端口转发才有效,把ssh连接断开之后,端口转发自然就消失了。 连接完成之后使用netstat命令来查看本地的8888端口监听情况。

 15.1 创建java项目

1、使用jedis来操作redis

引入依赖:

</dependency>
<!-- https://mvnrepository.com/artifact/redis.clients/jedis -->
<dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId><version>4.3.2</version>
</dependency>
public class RedisDemo {public static void main(String[] args) {//连接redis服务器JedisPool jedisPool = new JedisPool("tcp://127.0.0.1:8888");// 后续记得cloas,只是放回到池里,并不是直接关闭tcp连接try(Jedis jedis = jedisPool.getResource()){String pong = jedis.ping();System.out.println(pong);}}
}

运行结果如下:

        程序运行成功除了ssh映射配置成功之外,还有就是最开始安装redis服务器的时候要配置绑定的ip以及关闭保护模式。 

15.2 get和set

public class RedisDemo {public static void main(String[] args) {//连接redis服务器JedisPool jedisPool = new JedisPool("tcp://127.0.0.1:8888");// 后续记得cloas,只是放回到池里,并不是直接关闭tcp连接try(Jedis jedis = jedisPool.getResource()){
//           String pong = jedis.ping();
//            System.out.println(pong);test1(jedis);}}public static void test1(Jedis jedis){System.out.println("get和set的使用");//清空数据库
//        jedis.flushAll();jedis.set("k11","11");jedis.set("k12","12");String value = jedis.get("k11");System.out.println("value="+value);}
}

运行结果:

15.2 exists 和 del

         del可以删除多个key,以变⻓参数列表的⽅式体现.返回值是实际删除的key的个数.

 boolean ret = jedis.exists("key1");System.out.println(ret);n = jedis.del("key2", "key3");System.out.println(n);

 15.3 keys的使用

 public static void test3(Jedis jedis) {jedis.set("key1", "value1");jedis.set("key2", "value2");jedis.set("key3", "value3");jedis.set("myKey", "value4");Set<String> keys = jedis.keys("*");System.out.println(keys);}

运行结果如下:

15.4 expire和ttl

 public static void test4(Jedis jedis) {System.out.println("expire和ttl的使用");jedis.set("key1", "value1");String type = jedis.type("key")jedis.expire("k1",10);long time = jedis.ttl("key1");}

15.5 type

 private static void testType(Jedis jedis) {jedis.set("key1", "value");System.out.println(jedis.type("key1"));jedis.lpush("key2", "a", "b", "c");System.out.println(jedis.type("key2"));jedis.hset("key3", "name", "zhangsan");System.out.println(jedis.type("key3"));jedis.sadd("key4", "111", "222", "333");System.out.println(jedis.type("key4"));jedis.zadd("key5", 1, "aaa");System.out.println(jedis.type("key5"));
}

15.6 string相关的命令

System.out.println("mget 和 mset");
jedis.flushAll();
jedis.mset("key1", "111", "key2", "222", "key3", "333");
List<String> values = jedis.mget("key1", "key2", "key100", "key3");
//返回的结果只和传递的参数有关,没有也会返回null
System.out.println("values: " + values);System.out.println("getrange 和 setrange");
jedis.flushAll();
jedis.set("key", "abcdefghijk");
String result = jedis.getrange("key", 2, 5);
System.out.println("result: " + result);
jedis.setrange("key", 2, "xyz");
String value = jedis.get("key");
System.out.println("value: " + value);System.out.println("append");
jedis.flushAll();
jedis.set("key", "abcdef");
jedis.append("key", "ghij");
String value = jedis.get("key");
System.out.println("value: " + value);System.out.println("incr 和 decr");
jedis.flushAll();
jedis.set("key", "100");
long result = jedis.incr("key");
System.out.println("result: " + result);
result = jedis.decr("key");
System.out.println("result: " + result);
value = jedis.get("key");
System.out.println("value: " + value);

15.7 list相关的命令

System.out.println("lpush 和 lrange");
jedis.flushAll();
jedis.lpush("key", "111", "222", "333");
List<String> result = jedis.lrange("key", 0, -1);
System.out.println(result);System.out.println("rpush");
jedis.flushAll();
jedis.rpush("key", "111", "222", "333");
List<String> result = jedis.lrange("key", 0, -1);
System.out.println("result: " + result);System.out.println("lpop");
jedis.flushAll();
jedis.rpush("key", "111", "222", "333");
String result = jedis.lpop("key");
System.out.println("result: " + result);
result = jedis.lpop("key");
System.out.println("result: " + result);
result = jedis.lpop("key");
System.out.println("result: " + result);
result = jedis.lpop("key");
System.out.println("result: " + result);System.out.println("blpop");
jedis.flushAll();
// 返回结果是一个 "二元组", 一个是从哪个 key 对应的list中删除的, 一个是删除的元素是什么.
List<String> results = jedis.blpop(100, "key");
System.out.println("results[0]: " + results.get(0));
System.out.println("results[1]: " + results.get(1));System.out.println("llen");
jedis.flushAll();
jedis.rpush("key", "111", "222", "333");
long len = jedis.llen("key");
System.out.println("len: " + len);

15.8 关于set相关的命令

System.out.println("sadd 和 smembers");jedis.flushAll();jedis.sadd("key", "111", "222", "333");Set<String> result = jedis.smembers("key");System.out.println("result: " + result);System.out.println("sismember");jedis.flushAll();jedis.sadd("key", "111", "222", "333");boolean result = jedis.sismember("key", "100");System.out.println("result: " + result);System.out.println("scard");jedis.flushAll();jedis.sadd("key", "111", "222", "333");long result = jedis.scard("key");System.out.println("result: " + result);System.out.println("spop");jedis.flushAll();jedis.sadd("key", "111", "222", "333", "444", "555");String result = jedis.spop("key");System.out.println("result: " + result);System.out.println("sinter");jedis.flushAll();jedis.sadd("key", "111", "222", "333");jedis.sadd("key2", "111", "222", "444");Set<String> result = jedis.sinter("key", "key2");System.out.println("result: " + result);System.out.println("sinterstore");jedis.flushAll();jedis.sadd("key", "111", "222", "333");jedis.sadd("key2", "111", "222", "444");long len = jedis.sinterstore("key3", "key", "key2");System.out.println("len: " + len);Set<String> result = jedis.smembers("key3");System.out.println("result: " + result);

15.9 关于hash的指令

System.out.println("hset 和 hget");jedis.flushAll();jedis.hset("key", "f1", "111");Map<String, String> fields = new HashMap<>();fields.put("f2", "222");fields.put("f3", "333");jedis.hset("key", fields);String result = jedis.hget("key", "f1");System.out.println("result: " + result);result = jedis.hget("key", "f2");System.out.println("result: " + result);result = jedis.hget("key", "f100");System.out.println("result: " + result);System.out.println("hexists");jedis.flushAll();jedis.hset("key", "f1", "111");jedis.hset("key", "f2", "111");jedis.hset("key", "f3", "111");boolean result = jedis.hexists("key", "f1");System.out.println("result: " + result);result = jedis.hexists("key", "f100");System.out.println("result: " + result);System.out.println("hdel");jedis.flushAll();jedis.hset("key", "f1", "111");jedis.hset("key", "f2", "111");jedis.hset("key", "f3", "111");long result = jedis.hdel("key", "f1", "f2");System.out.println("result: " + result);boolean exists = jedis.hexists("key", "f1");System.out.println("exists: " + exists);exists = jedis.hexists("key", "f2");System.out.println("exists: " + exists);System.out.println("hkeys 和 hvals");jedis.flushAll();jedis.hset("key", "f1", "111");jedis.hset("key", "f2", "111");jedis.hset("key", "f3", "111");Set<String> fields = jedis.hkeys("key");List<String> vals = jedis.hvals("key");System.out.println("fields: " + fields);System.out.println("vals: " + vals);System.out.println("hmget 和 hmset");jedis.flushAll();Map<String, String> map = new HashMap<>();map.put("f1", "111");map.put("f2", "222");map.put("f3", "333");jedis.hmset("key", map);List<String> values = jedis.hmget("key", "f2", "f1", "f3");System.out.println("values: " + values);

15.10 关于zset的指令

System.out.println("zadd 和 zrange");jedis.flushAll();jedis.zadd("key", 10, "zhangsan");Map<String, Double> map = new HashMap<>();map.put("lisi", 20.0);map.put("wangwu", 30.0);jedis.zadd("key", map);List<String> members = jedis.zrange("key", 0, -1);System.out.println("members: " + members);List<Tuple> membersWithScore = jedis.zrangeWithScores("key", 0, -1);System.out.println("membersWithScore: " + membersWithScore);String member = membersWithScore.get(0).getElement();double score = membersWithScore.get(0).getScore();System.out.println("member: " + member + ", score: " + score);System.out.println("zcard");jedis.flushAll();jedis.zadd("key", 10, "zhangsan");jedis.zadd("key", 20, "lisi");jedis.zadd("key", 30, "wangwu");long len = jedis.zcard("key");System.out.println("len: " + len);System.out.println("zrem");jedis.flushAll();jedis.zadd("key", 10, "zhangsan");jedis.zadd("key", 20, "lisi");jedis.zadd("key", 30, "wangwu");long n = jedis.zrem("key", "zhangsan", "lisi");System.out.println("n: " + n);List<Tuple> result = jedis.zrangeWithScores("key", 0, -1);System.out.println("result: " + result);System.out.println("zscore");jedis.flushAll();jedis.zadd("key", 10, "zhangsan");jedis.zadd("key", 20, "lisi");jedis.zadd("key", 30, "wangwu");Double score = jedis.zscore("key", "zhangsan2");System.out.println("score: " + score);System.out.println("zrank");jedis.flushAll();jedis.zadd("key", 10, "zhangsan");jedis.zadd("key", 20, "lisi");jedis.zadd("key", 30, "wangwu");Long rank = jedis.zrank("key", "zhangsan2");System.out.println("rank: " + rank);

jedis库的本质就是针对各种redis指令进行了包装,调用某个方法,就相当于在redis客户端中输入对应的命令。

2、在spring中操作redis

配置.yml文件,添加相关依赖。

// 后续 redis 测试的各种方法, 都通过这个 Controller 提供的 http 接口来触发.
@RestController
public class MyController {@Autowiredprivate StringRedisTemplate redisTemplate;//这里spring中是通过stringredisTemplate来操作redis//stringredisTemplate是redisTemplate的子类,专门来处理文本数据@GetMapping("/testString")@ResponseBodypublic String testString() {redisTemplate.execute((RedisConnection connection) -> {// execute 要求回调方法中必须写 return 语句. 返回个东西.// 这个回调返回的对象, 就会作为 execute 本身的返回值.connection.flushAll();return null;});redisTemplate.opsForValue().set("key", "111");redisTemplate.opsForValue().set("key2", "222");redisTemplate.opsForValue().set("key3", "333");String value = redisTemplate.opsForValue().get("key");System.out.println("value: " + value);return "OK";}@GetMapping("/testList")@ResponseBodypublic String testList() {// 先清除之前的数据.//使用lambda表达式来写函数式接口redisTemplate.execute((RedisConnection connection) -> {// execute 要求回调方法中必须写 return 语句. 返回个东西.// 这个回调返回的对象, 就会作为 execute 本身的返回值.//RedisConnection,代表了redis连接,对标jedisconnection.flushAll();return null;});redisTemplate.opsForList().leftPush("key", "111");redisTemplate.opsForList().leftPush("key", "222");redisTemplate.opsForList().leftPush("key", "333");String value = redisTemplate.opsForList().rightPop("key");System.out.println("value: " + value);value = redisTemplate.opsForList().rightPop("key");System.out.println("value: " + value);value = redisTemplate.opsForList().rightPop("key");System.out.println("value: " + value);return "OK";}@GetMapping("/testSet")@ResponseBodypublic String testSet() {redisTemplate.execute((RedisConnection connection) -> {connection.flushAll();return null;});redisTemplate.opsForSet().add("key", "111", "222", "333");Set<String> result = redisTemplate.opsForSet().members("key");System.out.println("result: " + result);Boolean exists = redisTemplate.opsForSet().isMember("key", "111");System.out.println("exists: " + exists);Long count = redisTemplate.opsForSet().size("key");System.out.println("count: " + count);redisTemplate.opsForSet().remove("key", "111", "222");result = redisTemplate.opsForSet().members("key");System.out.println("result: " + result);return "OK";}@GetMapping("/testHash")@ResponseBodypublic String testHash() {redisTemplate.execute((RedisConnection connection) -> {connection.flushAll();return null;});redisTemplate.opsForHash().put("key", "f1", "111");redisTemplate.opsForHash().put("key", "f2", "222");redisTemplate.opsForHash().put("key", "f3", "333");String value = (String) redisTemplate.opsForHash().get("key", "f1");System.out.println("value: " + value);Boolean exists = redisTemplate.opsForHash().hasKey("key", "f1");System.out.println("exists: " + exists);redisTemplate.opsForHash().delete("key", "f1", "f2");Long size = redisTemplate.opsForHash().size("key");System.out.println("size: " + size);return "OK";}@GetMapping("/testZSet")@ResponseBodypublic String testZSet() {redisTemplate.execute((RedisConnection connection) -> {connection.flushAll();return null;});redisTemplate.opsForZSet().add("key", "zhangsan", 10);redisTemplate.opsForZSet().add("key", "lisi", 20);redisTemplate.opsForZSet().add("key", "wangwu", 30);Set<String> members = redisTemplate.opsForZSet().range("key", 0, -1);System.out.println("members: " + members);Set<ZSetOperations.TypedTuple<String>> membersWithScore = redisTemplate.opsForZSet().rangeWithScores("key", 0, -1);System.out.println("membersWithScore: " + membersWithScore);Double score = redisTemplate.opsForZSet().score("key", "zhangsan");System.out.println("score: " + score);redisTemplate.opsForZSet().remove("key", "zhangsan");Long size = redisTemplate.opsForZSet().size("key");System.out.println("size: " + size);Long rank = redisTemplate.opsForZSet().rank("key", "lisi");System.out.println("rank: " + rank);return "OK";}
}

 ps:redis的简单学习就到这里了,谢谢观看。

相关文章:

redis的学习(四)

13. 渐进式遍历 通过渐进式遍历能够获取当前所有的key&#xff0c;又不会讲当前的服务器卡死。不是一个命令将所有的key获取&#xff0c;而是每执行一次命令&#xff0c;只获取到其中的一部分。所以想要获取到所有的key就需要多次遍历&#xff0c;即化整为零的思想。 渐进式遍历…...

C# winform 多线程 UI更新数据 报错:无法访问已释放的对象。

System.ObjectDisposedException HResult0x80131622 Message无法访问已释放的对象。 ObjectDisposed_ObjectName_Name SourceSystem.Windows.Forms StackTrace: at System.Windows.Forms.Control.MarshaledInvoke(Control caller, Delegate method, Object[] args, …...

error: linker `link.exe` not found

开始学习rust&#xff0c;安装好rust的环境&#xff0c;开始从hello world开始&#xff0c;结果用在win10环境下&#xff0c;使用vs code或cmd窗口编译rust报错&#xff1a; PS E:\study_codes\rust-demo\chart01> rustc hello.rs error: linker link.exe not found| note:…...

Vue.js组件开发-如何使用moment.js

在Vue.js组件开发中&#xff0c;需要处理日期和时间&#xff0c;moment.js 是一个非常有用的库。moment.js 提供了丰富的API来解析、验证、操作和显示日期和时间。 步骤&#xff1a; 1. 安装moment.js 首先&#xff0c;需要通过npm或yarn安装moment.js。在项目根目录下运行以…...

Linux第二课:LinuxC高级 学习记录day01

0、大纲 0.1、Linux 软件安装&#xff0c;用户管理&#xff0c;进程管理&#xff0c;shell 命令&#xff0c;硬链接和软连接&#xff0c;解压和压缩&#xff0c;功能性语句&#xff0c;结构性语句&#xff0c;分文件&#xff0c;make工具&#xff0c;shell脚本 0.2、C高级 …...

《DOM NodeList》

《DOM NodeList》 介绍 DOM&#xff08;文档对象模型&#xff09;是HTML和XML文档的编程接口&#xff0c;它允许开发者在JavaScript等编程语言中操作文档的结构、样式和内容。在DOM中&#xff0c;NodeList是一个重要的接口&#xff0c;它表示一个包含节点&#xff08;如元素、…...

Nginx代理同域名前后端分离项目的完整步骤

前后端分离项目&#xff0c;前后端共用一个域名。通过域名后的 url 前缀来区别前后端项目。 以 vue php 项目为例。直接上 server 模块的 nginx 配置。 server{ listen 80; #listen [::]:80 default_server ipv6onlyon; server_name demo.com;#二配置项目域名 index index.ht…...

uniapp页面高度设置(铺满可视区域、顶部状态栏高度、底部导航栏高度)

这里说几种在uniapp开发中,关于页面设置高度的几种情况。宽度就不说了哈,宽度设置百分比都会生效。 首先我们要知道平时开发中,如果说没在uniapp做特殊处理,即正常情况下,所有的页面(.vue文件)中都是没有高度的(和vue一样),也就是说给最外层的的view标签设置高度为1…...

解锁 RAG 技术:从原理、论文研读走向实战应用RAG

亲爱的小伙伴们&#x1f618;&#xff0c;在求知的漫漫旅途中&#xff0c;若你对深度学习的奥秘、Java 与 Python 的奇妙世界&#xff0c;亦或是读研论文的撰写攻略有所探寻&#x1f9d0;&#xff0c;那不妨给我一个小小的关注吧&#x1f970;。我会精心筹备&#xff0c;在未来…...

HTML5实现好看的中秋节网页源码

HTML5实现好看的中秋节网页源码 前言一、设计来源1.1 网站首页界面1.2 登录注册界面1.3 节日由来界面1.4 节日习俗界面1.5 节日文化界面1.6 节日美食界面1.7 节日故事界面1.8 节日民谣界面1.9 联系我们界面 二、效果和源码2.1 动态效果2.2 源代码 源码下载结束语 HTML5实现好看…...

数字孪生笔记 1 工业数字孪生的意义

什么是工业数字孪生&#xff1f; 很多在做这个工作研究的同学最开始都想问的一个问题。到底什么才是数字孪生&#xff1f;我在五年前做数字孪生的时候也在思考这个问题。五年时间从数字孪生兴起&#xff0c;到元宇宙爆发&#xff0c;再到数字孪生和元宇宙没人提起&#xff0c;…...

013:深度学习之神经网络

本文为合集收录&#xff0c;欢迎查看合集/专栏链接进行全部合集的系统学习。 合集完整版请参考这里。 深度学习是机器学习中重要的一个学科分支&#xff0c;它的特点就在于需要构建多层且“深度”的神经网络。 人们在探索人工智能初期&#xff0c;就曾设想构建一个用数学方式…...

计算机网络(四)网络层

4.1、网络层概述 简介 网络层的主要任务是实现网络互连&#xff0c;进而实现数据包在各网络之间的传输 这些异构型网络N1~N7如果只是需要各自内部通信&#xff0c;他们只要实现各自的物理层和数据链路层即可 但是如果要将这些异构型网络互连起来&#xff0c;形成一个更大的互…...

【ArcGIS微课1000例】0138:ArcGIS栅格数据每个像元值转为Excel文本进行统计分析、做图表

本文讲述在ArcGIS中,以globeland30数据为例,将栅格数据每个像元值转为Excel文本,便于在Excel中进行统计分析。 文章目录 一、加载globeland30数据二、栅格转点三、像元值提取至点四、Excel打开一、加载globeland30数据 打开配套实验数据包中的0138.rar中的tif格式栅格土地覆…...

Linux 中统计进程的线程数 | 查看进程的线程

注&#xff1a;本文为 “Linux 线程” 相关文章合辑。 在 Linux 中统计一个进程的线程数 作者&#xff1a;Dan Nanni 译者&#xff1a; LCTT struggling | 2015-09-17 10:29 在 Linux 中一个程序在运行时会派生出多个线程。检查每个进程的线程数&#xff0c;有以下几种方法可…...

【深度学习 】训练过程中loss出现nan

[toc]【深度学习 】训练过程中loss出现nan 训练过程中loss出现nan 在深度学习中&#xff0c;loss 出现 NaN 通常是由数值不稳定或计算错误引起的。 1. 学习率过高 原因: 学习率过大可能导致权重更新幅度过大&#xff0c;引发数值不稳定。 解决方法: 降低学习率&#xff0c;…...

Linux - 什么是线程和线程的操作

线程概念 什么是线程: 线程&#xff08;Thread&#xff09;是操作系统能够进行运算调度的最小单位. 它被包含在进程之中, 是进程中的实际运作单位. 一个进程可以包含多个线程. 进程 : 线程 1 : n (n > 1). 进程是系统分配资源的基本单位. 线程则是系统调度的基本单位. 在…...

windows及linux 安装 Yarn 4.x 版本

1. 确保系统环境准备 a. 安装 Node.js Yarn 依赖于 Node.js,所以需要先安装 Node.js。前往 Node.js 官网 下载并安装适合你的 Windows 版本的 Node.js(推荐 LTS 版本)。安装完成后,打开命令提示符(CMD)或 PowerShell,验证安装:node -v npm -v如果显示版本号,则表示安…...

如何设计一个 RPC 框架?需要考虑哪些点?

面试官&#xff1a;如何设计一个 RPC 框架&#xff1f;需要考虑哪些点&#xff1f; 设计一个远程过程调用&#xff08;RPC&#xff09;框架是一个复杂的系统工程&#xff0c;涉及多个方面的考虑。一个好的 RPC 框架应具备可扩展性、灵活性、易用性和高性能。下面是设计 RPC 框…...

初学stm32 --- DAC输出三角波和正弦波

输出三角波实验简要&#xff1a; 1&#xff0c;功能描述 通过DAC1通道1(PA4)输出三角波&#xff0c;然后通过DS100示波器查看波形 2&#xff0c;关闭通道1触发(即自动) TEN1位置0 3&#xff0c;关闭输出缓冲 BOFF1位置1 4&#xff0c;使用12位右对齐模式 将数字量写入DAC_…...

手游刚开服就被攻击怎么办?如何防御DDoS?

开服初期是手游最脆弱的阶段&#xff0c;极易成为DDoS攻击的目标。一旦遭遇攻击&#xff0c;可能导致服务器瘫痪、玩家流失&#xff0c;甚至造成巨大经济损失。本文为开发者提供一套简洁有效的应急与防御方案&#xff0c;帮助快速应对并构建长期防护体系。 一、遭遇攻击的紧急应…...

使用VSCode开发Django指南

使用VSCode开发Django指南 一、概述 Django 是一个高级 Python 框架&#xff0c;专为快速、安全和可扩展的 Web 开发而设计。Django 包含对 URL 路由、页面模板和数据处理的丰富支持。 本文将创建一个简单的 Django 应用&#xff0c;其中包含三个使用通用基本模板的页面。在此…...

SCAU期末笔记 - 数据分析与数据挖掘题库解析

这门怎么题库答案不全啊日 来简单学一下子来 一、选择题&#xff08;可多选&#xff09; 将原始数据进行集成、变换、维度规约、数值规约是在以下哪个步骤的任务?(C) A. 频繁模式挖掘 B.分类和预测 C.数据预处理 D.数据流挖掘 A. 频繁模式挖掘&#xff1a;专注于发现数据中…...

MMaDA: Multimodal Large Diffusion Language Models

CODE &#xff1a; https://github.com/Gen-Verse/MMaDA Abstract 我们介绍了一种新型的多模态扩散基础模型MMaDA&#xff0c;它被设计用于在文本推理、多模态理解和文本到图像生成等不同领域实现卓越的性能。该方法的特点是三个关键创新:(i) MMaDA采用统一的扩散架构&#xf…...

Unit 1 深度强化学习简介

Deep RL Course ——Unit 1 Introduction 从理论和实践层面深入学习深度强化学习。学会使用知名的深度强化学习库&#xff0c;例如 Stable Baselines3、RL Baselines3 Zoo、Sample Factory 和 CleanRL。在独特的环境中训练智能体&#xff0c;比如 SnowballFight、Huggy the Do…...

JVM 内存结构 详解

内存结构 运行时数据区&#xff1a; Java虚拟机在运行Java程序过程中管理的内存区域。 程序计数器&#xff1a; ​ 线程私有&#xff0c;程序控制流的指示器&#xff0c;分支、循环、跳转、异常处理、线程恢复等基础功能都依赖这个计数器完成。 ​ 每个线程都有一个程序计数…...

Java毕业设计:WML信息查询与后端信息发布系统开发

JAVAWML信息查询与后端信息发布系统实现 一、系统概述 本系统基于Java和WML(无线标记语言)技术开发&#xff0c;实现了移动设备上的信息查询与后端信息发布功能。系统采用B/S架构&#xff0c;服务器端使用Java Servlet处理请求&#xff0c;数据库采用MySQL存储信息&#xff0…...

Golang——9、反射和文件操作

反射和文件操作 1、反射1.1、reflect.TypeOf()获取任意值的类型对象1.2、reflect.ValueOf()1.3、结构体反射 2、文件操作2.1、os.Open()打开文件2.2、方式一&#xff1a;使用Read()读取文件2.3、方式二&#xff1a;bufio读取文件2.4、方式三&#xff1a;os.ReadFile读取2.5、写…...

Oracle11g安装包

Oracle 11g安装包 适用于windows系统&#xff0c;64位 下载路径 oracle 11g 安装包...

Docker拉取MySQL后数据库连接失败的解决方案

在使用Docker部署MySQL时&#xff0c;拉取并启动容器后&#xff0c;有时可能会遇到数据库连接失败的问题。这种问题可能由多种原因导致&#xff0c;包括配置错误、网络设置问题、权限问题等。本文将分析可能的原因&#xff0c;并提供解决方案。 一、确认MySQL容器的运行状态 …...