Redis学习笔记:数据结构和命令

2023-11-06

本文是自己的学习笔记。主要参考资料如下:
马士兵

4、Redis的五大数据类型

Redis 是一个开源(BSD许可)的,内存中的数据结构存储系统,它可以用作数据库缓存消息中间件。 它支持多种类型的数据结构,如 字符串(strings), 散列(hashes), 列表(lists), 集合(sets), 有序集合(sorted sets) 与范围查询, bitmaps, hyperloglogs 和 地理空间(geospatial) 索引半径查询。 Redis 内置了 复制(replication),LUA脚本(Lua scripting), LRU驱动事件(LRU eviction),事务(transactions) 和不同级别的 磁盘持久化(persistence), 并通过Redis哨兵(Sentinel)和自动分区(Cluster)提供高可用性(high availability)。

1.1、String

1.1.1、String 类型的命令

  1. 对value追加字符串:append key value。比如说,原有key -> “v”,append key hello,则key -> “vhello”。
  2. 获取字符串的长度:strlen key
  3. 获取字符串的某一部分:getrange key start end,start和end都是闭区间。比如"hello’',执行命令getrange key 0 3可以得到"hell"。
  4. 对替换字符串某个字符替换成指定字符串:setrange key start value。比如"hello",执行setrange key 1 xx可以得到"hxxllo"。

1.1.2、存储对象

使用json格式存储对象,比如set user1 {name:name1 age:1}

或者使用多个key存储对象的属性,比如mset user1:name name1 user1:age 1

后者与其前者相比,省略了取值后解析的逻辑。

1.2、List

redis中没有空链表的概念,如果一个链表的元素被清空,那么这个链表和对应的key也跟着消失。

redis中List的结构是链表不是数组,所以对于表头和表尾操作要比表中间的操作快很多。因为redis提供了链表和链尾的push和pop操作,所以我们可以将其当做栈或者队列使用。

List的命令支持链尾和链头操作,链头的有关命令带有l,比如在链头push一个元素lpush list value;链尾有关的命令带有r,比如链尾push一个元素rpush list value。所以链表的命令有l就多半有r,下面就只介绍其中一种,不重复介绍了。

1.2.1、List基本命令

  • 存储:lpush list value,向list左端中存入value,这里可以一次性存入多个值;rpush list value,向list右端存入value,可以一次性存入多个值。
  • 读取链表中的一段:和存储不一样,这个只有从链表左边开始读取的命令lrange list start end。注意是从链表左边开始读取,我们可以看示例。
    在这里插入图片描述
  • 通过下标获取链表中的某个值:读取第index个元素的值。lindex list index
  • 获取链表长度:llen list
  • 移除链表中队尾或队头的元素:移除操作有左右之分,可以移除左边第一个元素,也可以移除右边第一个元素。lpoprpop
  • 移除链表中值为value的元素:lrem list count value,移除链表中值为value的元素,count是移除的个数。移除过程是从左往右移除元素,不是从右往左。下面是示例。

在这里插入图片描述

  • 裁剪链表:ltrim list start end只保留链表中start到end中的元素,两者都是闭区间。

在这里插入图片描述

  • 将一个列表的队尾元素移除,并将该值加入到另一个列表的队头:rpoplpush source dest

  • 将列表中的下标为index的元素的值替换成value:lset list index value,如果index越界,或者list不存在该命令报错。

  • 判断列表是否存在:exists list,存在返回1,不存在返回0。redis没有空链表的概念,链表元素被排空了,该链表则是不存在的状态
    在这里插入图片描述

  • 向某个元素的之前/之后插入一个元素:linsert list before/after pivot value,向值为pivot的元素之前或者之后插入一个置为value的元素。redis会从左往右查找,在第一个值为pivot的元素附件插入。


1.2.2、List高级命令

  • 阻塞式pop:blpop list timeout,对listpop操作,但如果当前列表为空(链表不存在也当它是一个空链表),或者其他的原因导致没有元素pop,那该操作会阻塞线程timeout秒,中途有元素可pop就pop元素提前结束阻塞。timeout设为0则无限阻塞线程。
    下面就在一个空链表链表中阻塞式pop,然后开启另一个线程在链表中pop一个元素,最后可以看到阻塞提前终止。
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述




1.3、Set

1.3.1、Set基本命令

  • 存储:sadd set value,可以向一个set中一次存储多个value,操作不具有原子性,可以一些失败一些成功。
  • 读取一个set的所有元素:smembers set
  • 判断set中是否有这个值:sismember set value,返回1存在,返回0不存在。
  • 获取set的大小:scard set
  • 删除元素:srem set value,可一次性删除多个值,也不具有原子性。
  • 随机从集合中拿出n个元素:srandmember set n
  • 随机从集合中删除一个元素:spop set
  • 将集合中的一个元素移动到另一个集合:smove source dest value,非原子性,只要从souce中取出了元素,哪怕没有dest没有添加成功,也返回1。
  • 集合的交集、并集和差集:sdiff set1 set2sunion set1 set2sinter set1 set2,上面三个指令都可以有多个参数
  • 将交集、并集和差集存储:上面的命令指示返回计算结果,这个命令是将结果存入指定的key。在以上的命令后加一个store即可。比如sdiffstore newKey set1 set2
    在这里插入图片描述



1.4、HashMap

redis里的HashMap其实Java里面的Map<String, Map<String, String>>。key String类型,但是对应的value是Map类型。

1.4.1、HashMap基本命令

  • 存储:hset map key value

  • 获取:hget map key

  • 获取或读取多个键值对:hmset map key valuehmget map key

  • 获取一个map里的所有键值对:hgetall map

  • 删除map里的键值对:hdel map key,可以删除多个key,非原子操作。

  • 获取map的长度:hlen map

  • 判断某个键值对是否存在:hexists map key

  • 获取map中所有的key,或者所有的value:hkeys maphvals map

  • 给一个value增加数字:
    map key increment。比如有这样一个map,map1 -> key1:1我们可以对key1```的值自增。
    在这里插入图片描述

  • 与setex和setnx功能一样的指令:hsetex map key valuehsetnx map key value



1.5、ZSet(有序集合)

有序集合是在集合的一个升级。其他部分和集合一样,但是value部分多加了一个score用于排序。


1.5.3、ZSet的指令

  • 存储:zadd set score key,score是分数,系统根据这个值给key排序。
  • 按默认顺序获取多个值:zrange set start end,闭区间。
  • 按默认排序获取score在一定区间的值:zrangebyscore set min max [withscore],获取set中,score在[min, max]中的元素,默认是闭区间,可以写成(min来代表开区间。我们可以使用-inf和+inf分别代表负无穷大和正无穷大。如果带上后面的参数withscore,那返回结果不止返回key,还返回对应的score。

在这里插入图片描述

  • 按逆序获取元素:与zrangebyscorezrange一样,只要将range换成revrange即可。
  • 删除元素:zrem set key,可以删除多个key,非原子操作。
  • 查看长度:zcard set
  • 查看score在某个区间的值:zcount set min max,默认闭区间,同样可以使用(min表示开区间。
  • 查看keyscorezscore zset key
  • 查看key的的名次:查看默认排序下的名次,zrank zset key;查看倒序下的名词,revrank zset key
  • keyscore自增或自减:zincrby zset increment key
  • 集合的计算:和set的交集,并集,差集计算一样,只不过指令由s变成z,比如sunionstore set1 set2对应zunionstore zset1 zset2



1.6、BitMap

1.6.1、BitMap的数据结构

BitMap有些类似于HashMap,但它只能存储某个元素是0还是1,这个数据结构的优点是极大地节省空间。

列举一个应用场景,用一个数据结构记录这节课哪些人到,哪些人没到。

此时对于一个人来说要么到要么不到,不到就可以是0表示,到就是1表示。这种场景就适合BitMap。假设这个班有8个人,那么对应的BitMap就是一个bit[8]的空间。如下图所示。
在这里插入图片描述


1.6.2、BitMap的命令

  • set:setbit key offset valuevalue只能是0或1,其他值会报错。offset相当于是index
  • get: getbit key offset
  • 统计value为1的个数:bitcount key start endstartend是闭区间,忽略startend则不计范围。这个命令关于范围的参数非常容易让人误解。比如bitcount bitmap 0 2很容易让人以为是统计bitmap[0]bitmap[2]总计三个比特位上,值为1的个数,但其实这个错误的。
    这里的0 2的单位是byte不是bit,一个byte是8个bit,所以这命令的含义是统计bitmap[0]bitmap[23]总计3个byte位,24bit位上值为1的个数,下面可看例子。
    我将0, 1, 8位设为1,bitcount bitmap 0 0统计前8位,即[0-7],所以返回结果为2;
    bitcount bitmap 0 1统计前16位,即[0 15],所以返回结果为3。
    在这里插入图片描述

1.6.3、布隆过滤器(Bloom Filter)

BitMap还能引申出一个新的数据模型叫布隆过滤器(Bloom Filter),他可以用来模糊判断一个元素是否在集合中。

之所以说是模糊判断是因为如果布隆过滤器告诉你一个元素不在集合中,那这个元素肯定不在,但如果布隆过滤器告诉你在,那么就可能在可能不在。

那为什么不用set呢,能明确知道在还是不在。布隆过滤器的优势就是极小的存储空间,更适合一些场景。下面来看看数据结构。

1.6.3.1、数据结构

BitMap类似,它是一个bit类型的数组。如果bloomFilter[4] = 1,那表示哈希值为4的元素存在于集合中。

但是元素之间可能存在哈希冲突,比如说下图。CD的哈希值一样,他们指向着同一个位置。那么bloomFilter[5] = 1只能说明哈希值为5的元素在集合中,可能是C可能是D,可能都存在,反正至少存在一个。

但是不能明确知道C或者D在不在集合中。

但如果bloomFilter[5] = 0,那CD一定不在集合中。
请添加图片描述

1.6.3.2、应用场景

所以布隆过滤器可以快速判定一个元素不在元素中,并且空间极小。

他可以应用在缓存穿透中。

一般的模型当中,一次查询会优先到redis中查询,如果没有查询到才进行mysql查询。但如果mysql中也没有对应数据,那这两次查询就无功而返。

在这里插入图片描述
一般情况下以上查询没什么问题。但在高并发的场景下,如果有大量请求想查询同一字段,而这一字段又不存在,那就会在短时间内进行大量的mysql查询,造成数据库崩溃,这就是缓存穿透。

我们可以在查询前加入布隆过滤器。如果布隆过滤器查询没有数据,那就不用麻烦缓存和数据库了;如果有,那才继续查询缓存和数据库。

在这里插入图片描述


1.7、HyperLogLog

1.7.1、应用场景

一个大型网站需要统计每天的UV数据(UV,Unique-Visitor),即每天的用户访问量,但是得去重,同一个用户的多次访问只能算成一次。

HyperLogLog就是这种数据量很大,可以去重的数据结构。虽然它的去重有误差,不是百分百的去重,标准误差是0.81%,但这样的精准度已经能满足需求了。比如说实际值是100.81万,而统计值是100W,在百万数量级前,0.81万是可以忽略的。

最重要的一点是,相比于使用set来统计数据,它所需要的空间几乎可以忽略不计。

下面是对比图。

在这里插入图片描述

1.7.2、命令

  • 添加:pfadd key element,可以一次性添加多个。
  • 计数:pfcount key
  • 合并集合:pfmerge destKey sourceKey

1.7.3、原理

HyperLogLog基于概率论的伯努利实验,并结合极大似然估算方法,并做了分桶优化,所以占用空间才这么小。


1.8、GEO

GEO 3.2以后提供了GEO(地理信息定位)功能,支持存储地理信息用来实现诸如摇一摇附近位置等基于地理信息的功能。

地理信息使用二维的的经纬度表示。经度范围(-180,180),维度范围(-90,90)。

业界比较通用的地理距离计算排序算法是GeoHash算法,redis也是用该算法。


1.8.1、命令

  • 添加:geoadd key longtitude latitude location。在一个key当中添加经度和纬度,然后是地名。比如geoadd map 123.43 39.42 Beijinggeoadd map 132.49 49.29 Hebei
  • 获取位置:geopos key location,可一次性获取多个location的经纬度。请添加图片描述
  • 经纬度信息转成hash:geohash key location,可一次性转换多个。
  • 请添加图片描述



2、Redis全局命令

2.1、获取数据库大小

有一个命令是keys *,后面的*可以换成其他的正则表达式。这个命令用来显示符合正则表达式的所有键值对。请添加图片描述
但是不推荐使用这个命令,因为键值对很多的时候,这个命令会打印很多数据。比如说有十万条数据,那就要打印十万行数据,这个非常消耗内存。如果想知道数据库大小,可以使用dbsize命令,它是直接读取计数器,时间是O(1)。

请添加图片描述

2.2、设置有效时间

有下面三种设置有效时间的方式。

给指定key设置过期时间:expire key seconds,seconds秒后指定key失效。也可以指定时间单位是毫秒,pexpire key millionseconds.

另外就是设置key在什么时候失效expireat key timestamp.

查看当前key还剩多少有效时间:ttl key。如果正数,表示还有x秒后就过期;返回-1,表示永远不会过期;返回-2表示已经过期。

2.2.1、设置有效时间需要注意的坑

当对一个键值对设置时间后,不要去修改它的value(可以用rename修改key)。一旦修改后之前设置的过期时间会自动失效。

比如下面就是对一个键值对设置过期时间,然后改变它的value,最后会发现过期时间失效了。
请添加图片描述

2.1、存储与读取键值对

  1. 存储和读取:get和set。
  2. 批量读取和批量设值:mget和mset,比如mset key1 value key2 value2,这里就是设置了两个键值对,key1 -> value1key2 -> value2
  3. 先读取后写入:getset key value。该指令返回key原有的值,如果这个key为null或者value为null,那指令会返回null。之后key的value会刷新成新的值。
  4. 清除指定键值对:move key
  5. 查询当前数据库是否存有指定的key:exists key,返回1存在,返回0则不存在。
  6. 列出当前数据库中的所有key:key *
  7. 查看当前key的存储的数据类型:type key
  8. 重命名key:rename key newKey、需要注意的是,如果新的key是已经存在的,那他会覆盖已经存在的那个key。所以重命名最好使用renamenx key newkey,如果newkey没有被使用,那修改成功返回1;如果newkey已经被使用,修改失败,返回0。

2.1.1、高级的set和get

  1. 如果key存在(一个键值对过期了也算是不存在)则set(并且可以设置过期时间),不存在就不set:setex key n value。n是过期时间,单位是秒。

  2. 如果key不存在才set,存在就set失败:setnx key n value

  3. 批量的msetexmsetnx:他们是原子性的操作,只要有一个key没设值成功,那所有的key都不会设值成功。

  4. 自增和自减:incr keydecr key。key类型可以是字符串。

  5. 加减n:incrby key ndecrby key n

  6. 先get,然后立刻set新值:getset key value。 这个效果和set一样,不同的是该命令会返回以前的值。

  7. 清空当前数据库的所有数据:flushdb

  8. 清空所有数据库的所有数据:flushall

  9. 查看当前数据库的大小:dbsize,这是查看当前数据库,不是查看所有数据库。

  10. 选择数据库:select n,选择第几个数据库,从0开始编号,默认选择第0个数据库,总共有16个数据库。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Redis学习笔记:数据结构和命令 的相关文章

  • Redis多插入问题

    我尝试多次插入 但它给了我错误 http pastie org 7337421 http pastie org 7337421 cat mass insert txt 3 r n 3 r nSET r n 3 r nkey r n 5 r
  • 如何清理redis中不活跃的玩家?

    我正在制作一个使用 redis 来存储游戏状态的游戏 它可以很好地跟踪位置和玩家 但我没有一个好的方法来清理不活跃的玩家 每当玩家移动时 这是一个半慢速移动游戏 想想每秒 1 5 帧 我就会用新位置更新哈希并删除旧位置键 跟踪活跃玩家的最佳
  • Laravel - 缓存 Eloquent 并频繁更新

    是否可以对经常修改的对象使用缓存 例如 假设我们有一个 BlogPost 对象 并且有一个经常更改的 num of views 列 以及其他列 是否可以更新缓存和数据库中的 num of views 字段 而不破坏缓存对象并重新创建它 我可
  • Node.js 上通过套接字连接 Redis

    由于共享托管 目标主机上的我的 redis 服务器不在端口上运行 而是在非常特定的套接字上运行 可以通过套接字文件连接到该套接字 只有我的用户可以访问 但是 我还没有找到如何通过套接字指定连接node redis and connect r
  • 保护节点 Redis

    我正在尝试保护 Node Redis IPC 服务器以使用私钥 公钥 我已经关注了本教程 http bencane com 2014 02 18 sending redis traffic through an ssl tunnel wit
  • 仅当尚未设置时才进行原子设置

    仅当尚未在 Redis 中设置时 是否有办法执行原子设置 具体来说 我正在创建一个像 myapp user user email 这样的用户 并且希望 Redis 在 user email 已被占用时返回错误 而不是默默地替换旧值 比如声明
  • PooledRedisClientManager 未释放连接

    我将 json 数据列表存储在 redis 中并使用 ServiceStack c 客户端访问它 我本质上是在管理自己的外键 我在其中存储zrangeid 我使用应用程序内部的接口从zrange然后从 Redis 获取底层 json 对象并
  • 库存管理系统的 SQL 与 NoSQL

    我正在开发一个基于 JAVA 的网络应用程序 主要目的是拥有在多个称为渠道的网站上销售的产品的库存 我们将担任所有这些渠道的管理者 我们需要的是 用于管理每个渠道的库存更新的队列 库存表 其中包含每个通道上分配的正确快照 将会话 ID 和其
  • 是否有可嵌入的 Java 替代 Redis?

    根据这个线程 https stackoverflow com questions 3047010 best redis library for java 如果我想从Java中使用Redis Jedis是最好的选择 然而 我想知道是否有任何库
  • Caffeine Expiry 中如何设置多个过期标准?

    我正在使用 Caffeine v2 8 5 我想创建一个具有可变到期时间的缓存 基于 值的创建 更新以及 该值的最后一次访问 读取 无论先发生什么都应该触发该条目的删除 缓存将成为三层值解析的一部分 The key is present i
  • SignalR 无法连接到 SSL 上的 Azure Redis

    我目前在 Azure 上托管我的 redis 缓存服务器 并让 signalR 依赖它作为骨干 使用以下内容 GlobalHost DependencyResolver UseRedis 服务器 端口 密码 eventKey 这可以在端口
  • 使用 Redis 命令 incr 和 expire 时的竞争条件

    根据redis文档 http redis io commands incr http redis io commands incr 在段落模式 速率限制器 2 较短的版本代码 value INCR ip IF value 1 THEN EX
  • 如何在Redis中进行持久化存储?

    关闭redis服务器后 使用set存储的值被破坏 在这里我找到了使用持久性存储的方法 有人帮助我 如何使用javascript实现这一点 我想将客户端的一些值存储在 redis 数据库中 并且必须在其他客户端中使用该值 您需要配置 Redi
  • Redis发布/订阅:查看当前订阅了哪些频道

    我目前有兴趣查看我拥有的 Redis 发布 订阅应用程序中订阅了哪些频道 当客户端连接到我们的服务器时 我们将它们注册到如下所示的通道 user user id 这样做的原因是我希望能够看到谁 在线 目前 我在不知道客户端是否在线的情况下盲
  • Node Js:Redis 作业在完成其任务后未完成

    希望你们做得很好 我在我的 Nodejs 项目中实现了 BullMQ Bull 的下一个主要版本 来安排发送电子邮件的作业 例如 发送忘记密码请求的电子邮件 所以 我编写了如下所示的代码 用户服务 await resetPasswordJo
  • Lua中按字符分割字符串

    我有像这样的字符串 ABC DEF 我需要将它们分开 字符并将两个部分分别分配给一个变量 在 Ruby 中 我会这样做 a b ABC DEF split 显然Lua没有这么简单的方法 经过一番挖掘后 我找不到一种简短的方法来实现我所追求的
  • Redis是如何实现高吞吐量和高性能的?

    我知道这是一个非常普遍的问题 但是 我想了解允许 Redis 或 MemCached Cassandra 等缓存 以惊人的性能极限工作的主要架构决策是什么 如何维持连接 连接是 TCP 还是 HTTP 我知道它完全是用C写的 内存是如何管理
  • StackExchange.Redis的正确使用方法

    这个想法是使用更少的连接和更好的性能 连接会随时过期吗 对于另一个问题 redis GetDatabase 打开新连接 private static ConnectionMultiplexer redis private static ID
  • Scala 使用的 Redis 客户端库建议

    我正在计划使用 Scala 中的 Redis 实例进行一些工作 并正在寻找有关使用哪些客户端库的建议 理想情况下 如果存在一个好的库 我希望有一个为 Scala 而不是 Java 设计的库 但如果现在这是更好的方法 那么仅使用 Java 客
  • 如何在Redis中只保存一个数据库?

    我是 Redis 新手 有一个与备份相关的问题 目前 我有一个实例在 Windows 服务器上运行 在这个实例中 我当前有一项 工作 将数据存储在一个数据库中 我不想备份这些数据 我必须创造一份新工作 我的第一个想法是将数据存储在另一个数据

随机推荐

  • C#辗转相除法求最大公约数与最小公倍数

    class Program static void Main string args int num1 num2 mm Console WriteLine 请输入第一个数 num1 Convert ToInt32 Console ReadL
  • 【Flutter 1-6】Flutter项目目录结构

    文章首发地址 Flutter项目结构 了解Flutter的目录结构 可以帮助我们更好的管理和开发项目 这样我们在开发的过程中就会很清楚的知道 iOS代码该放在那里 Android代码该放在那里 Flutter代码该放在哪里 测试代码放在哪里
  • Linux操作系统加固

    如何尽可能地加强Linux的安全性和隐私性 以下列出的所有命令都将需要root特权 以 符号开头的单词表示一个变量 不同终端之间可能会有所不同 一 选择正确的Linux发行版 选择一个好的Linux发行版有很多因素 避免分发冻结程序包 因为
  • ubuntu16.04重新编译linux内核

    首先的首先 如果用的是虚拟机 那硬盘至少要分个40G 硬盘太小的后果 你可以试试 一 下载内核 首先到kernel官网获取linux源代码包 我用的ubuntu版本是16 04 因此下载的包可以采用4 x 如果从官网下载速度过慢 我这下载需
  • 日志注入 ctf.show_web4

    使用php input 不行 使用日志注入 查看日志的默认目录 得到了日志文件 url var log nginx access log 进行日志注入 使用蚁剑连接得到flag
  • Acwing 1264. 动态求连续区间和(树状数组版)

    lowbit x x x 返回2 k k为x的二进制表示中末尾0的个数 c x 存的是 x lowbit x x 之间这些数的和 include
  • Django电商项目(四)用户中心、FastDFS

    Django电商项目 用户中心逻辑 登录装饰器和登录后跳转 判断用户是否已登录 退出登录 用户中心 地址页 模型管理器类方法封装 用户中心 个人信息 分布式图片服务器FastDFS 什么是FastDFS 文件上传流程 文件下载流程 简易Fa
  • 区块链在物联网中的应用态势分析

    摘 要 目的 物联网是物体之间共享资源和交流信息的平台 其上的数据价值不断被挖掘显现 而区块链作为一种新型的数据存储管理模式 在体系去中心化 数据溯源和防篡改等方面拥有良好的效果 近来 不少研究都探索了区块链在物联网中的应用 方法 利用文献
  • PaddleHub人体姿态检测模型pose_resnet50_mpii

    姿态检测还是挺有意思的 在 paddlehub 上有直接可以拿来用的模型 pose resnet50 mpii 随便网上找了张图片试了一下效果还行 代码非常简单 import paddlehub as hub module hub Modu
  • Android逆向之旅---爆破一款资讯类应用「最右」防抓包策略原理分析

    一 逆向分析 首先感谢王同学提供的样本 因为王同学那天找到我咨询我说有一个应用Fiddler抓包失败 其实对于这类问题 我一般都会这么回答 第一你是否安装Fiddler证书了 他说他安装了 第二你是否用了我之前说的那个Xposed框架Jus
  • JAVA list加锁_list类里面的东西加锁 (手动加锁方法)

    package privateclass import java util Collection import java util Iterator import java util List import java util ListIt
  • 【计算机组成原理】——原码,反码,补码,移码怎样计算

    机器数与真值 把符号 数字化 的数称为机器数 而把带 或 的数称为真值 正负号用二进制的0 1表示 0 1 x 001 机器数 第一位表示符号 x 1 x 101 真值 直接用 表示 x 5 原码 反码 补码 移码的计算 正数的原码 反码
  • Pycharm绘图时显示额外的“figure”浮窗

    如图所示 不想图片显示在右边 而是单独的一个窗口 这样可以进行点击交互 1 File gt Settings gt 2 找到Tools gt Python Scientific 找到 Python Scientific 去除右边候选框中的勾
  • SpringCache使用

    SpringCache使用 1 引入依赖 引入springcache依赖
  • three.js坐标轴辅助器AxesHelper

    一 效果图 二 添加坐标轴辅助器 使用three js 通过以下代码可以添加坐标轴辅助器 创建坐标轴辅助器 var axesHelper new THREE AxesHelper 5 添加到场景中 scene add axesHelper
  • 私有云平台管理

    更改主机名 controller hostnamectl set hostname controller compute hostnamectl set hostname compute 更改hosts文件 vi etc hosts 插入以
  • Java NIO通信编程

    NIO即非同步非阻塞式IO 有如下几个特点 1 创建一个线程负责处理IO事件和IO事件的分发 2 事件驱动机制 事件到达之后触发 3 线程之间通过wait notify等方式通信 减少线程间切换 NIO客户端和服务端需都维护一个管理通道的对
  • flutter加载不同分辨率本地图片

    flutter移动开发怎么加载本地图片 首先在该项目根目录也就是和ios android同级创建一个images文件夹用来存放图片资源 然后放入需要加载的图片资源例如ic phone png 然后在项目目录下找到pubspec yaml文件
  • 【定量分析、量化金融与统计学】统计推断基础 番外(1)---T table与Z table的值

    目录 一 前言 二 T table 三 Z table 一 前言 为了方便之后的例题讲解 这里放上T tabel和Z table的值 怎么查表 本篇中会直接讲 所以这里就只看表格就行 本篇为工具篇 二 T table 我们给两个版本 适合用
  • Redis学习笔记:数据结构和命令

    本文是自己的学习笔记 主要参考资料如下 马士兵 4 Redis的五大数据类型 1 1 String 1 1 1 String 类型的命令 1 1 2 存储对象 1 2 List 1 2 1 List基本命令 1 2 2 List高级命令 1