【山外笔记-数据库】Memcached详解教程
本文打印版文档下载地址
【山外笔记-数据库】Memcached详解教程-打印版.pdf
一、Memcached数据库概述
1、Memcached简介
(1)Memcached是一个自由开源的,高性能,分布式内存对象缓存系统,通过在内存里维护一个统一的巨大的hash表来存储各种格式的数据。
(2)Memcached本质上是一个基于内存的key-value存储系统,用来存储小块的任意数据(字符串、对象)。
(3)Memcached的守护进程(daemon )用C语言编写,但是客户端可以用任何语言来编写,并通过memcached协议与守护进程通信。
(4)Memcached是以守护程序(监听)方式运行于一个或者多个服务器中,随时会接受客户端的连接和操作。
(5)Memcached客户端有各种语言的版本,包括java,c,php,.net等等。
(6)Memcached通过在内存中缓存数据和对象来减少读取数据库的次数,提高动态、数据库驱动网站的速度,减轻数据库负载。
(7)Memcached的API兼容大部分流行的开发语言,其中包括Perl、PHP、Python、RubyC#、C/C++、Lua等。
2、Memcached的特点
(1)协议简单
(2)基于libevent的事件处理
libevent是一个将Linux的epoll、BSD类操作系统的kqueue等事件处理功能封装成统一接口的程序库。
(3)内置内存存储方式
memcached中保存的数据都存储在memcached内置的内存存储空间中。
由于数据仅存在于内存中,因此重启memcached、重启操作系统会导致全部数据消失。
内存容量达到指定值之后,就基于LRU(Least Recently Used)算法自动删除不使用的缓存。
memcached本身是为缓存而设计的服务器,因此并没有过多考虑数据的永久性问题。
(4)分布式memcached互不通信
memcached尽管是分布式缓存服务器,但服务器端并没有分布式功能。
各个memcached不会互相通信以共享信息。
3、Memcached的工作原理:缓存式的Web应用程序架构
(1)在传统的app层和db层之间加入cache层, 每个app服务器都可以绑定一个mc(memcached)。
(2)每次数据的读取都可以从ms(内置分配内存的组件)中取得,如果没有,再从db层读取。
(3)当ms的hash表满了之后,新的插入数据会替代老的数据,更新的策略是LRU(最近最少使用)+ 到期失效策略,失效数据首先被替换,然后再替换到最近未使用的数据。。
(4)当数据要进行更新时,除了要发送update的 sql给db层,同时也要将更新的数据发给,让mc去更新ms中的数据。
4、Memcached的安装
(1)Linux Memcached安装
Ubuntu/Debian在线安装
sudo apt-get install libevent ibevent-dev
sudo apt-get install memcached
Redhat/Fedora/Centos在线安装
yum install libevent libevent-devel
yum install memcached
源代码安装
wget http://memcached.org/latest 下载最新版本
tar -zxvf memcached-1.x.x.tar.gz 解压源码
cd memcached-1.x.x 进入目录
./configure --prefix=/usr/local/memcached 配置
make && make test 编译
sudo make install 安装
(2)Windows Memcached安装
在 1.4.5 版本以前 Memcached可以作为一个服务安装,而在 1.4.5 及之后的版本删除了该功能。因此需要采用不同的安装方式。
Memcached安装包下载地址:https://github.com/memcached/memcached/releases
Memcached 1.4.5 以前的版本
解压下载的安装包到指定目录。
memcached 可以作为一个服务安装,cmd窗口执行
c:\memcached\memcached.exe -d install
启动和关闭 memcached 服务
c:\memcached\memcached.exe -d start
c:\memcached\memcached.exe -d stop
修改 memcached 的缓存配置项
c:\memcached\memcached.exe -d runservice -m 512
查看memcached 的的帮助信息
c:\memcached\memcached.exe -h
卸载memcached
c:\memcached\memcached.exe -d uninstall
Memcached 1.4.5 以后的版本
解压下载的安装包到指定目录。
memcached 不能作为服务来运行,需要使用任务计划中来开启一个普通的进程,设置开机自动启动。
schtasks /create /sc onstart /tn memcached /tr "'c:\memcached\memcached.exe' -m 512"
删除 memcached 的任务计划
schtasks /delete /tn memcached
5、Memcached的运行
(1)Linux自动安装 memcached 命令位于 /usr/local/bin/memcached。
(2)查看Memcached命令的帮助:memcached -h
- -d选项:启动一个守护进程;
- -m选项:分配给Memcached使用的内存数量,单位是MB;
- -u选项:运行Memcached的用户;
- -l选项:监听的服务器IP地址,可以有多个地址;
- -p选项:设置Memcached监听的端口,最好是1024以上的端口;
- -c选项:最大运行的并发连接数,默认是1024;
- -P选项:设置保存Memcached的pid文件。
(3)启动Memcached服务
memcached -d -m 64M -u root -l 192.168.0.120 -p 11211 -c 256 -P /tmp/memcached.pid
(4)关闭Memcached服务
ps -ef|grep memcached
kill -9 memcached_pid
6、Memcached的连接
(1)通过 telnet 命令并指定主机ip和端口来连接 Memcached 服务。
(2)语法:telnet HOST PORT
二、Memcached 存储命令
1、Memcached set 命令
(1)Memcached set 命令:用于将 value(数据值) 存储在指定的 key(键) 中。
(2)如果set的key已经存在,该命令可以更新该key所对应的原来的数据,也就是实现更新的作用。
(3)set 命令的基本语法格式:
set key flags exptime bytes [noreply]
value
(4)参数说明:
- key:键值 key-value 结构中的 key,用于查找缓存值。
- flags:可以包括键值对的整型参数,客户机使用它存储关于键值对的额外信息 。
- exptime:在缓存中保存键值对的时间长度(以秒为单位,0 表示永远)
- bytes:在缓存中存储的字节数
- noreply(可选): 该参数告知服务器不需要返回数据
- value:存储的值(始终位于第二行)(可直接理解为key-value结构中的value)
(4)输出信息:
- STORED:保存成功后输出。
- ERROR:在保存失败后输出。
2、Memcached add 命令
(1)Memcached add 命令:用于将 value(数据值) 存储在指定的 key(键) 中。
(2)如果 add 的 key 已经存在,则不会更新数据(过期的 key 会更新),之前的值将仍然保持不变,并且获得响应 NOT_STORED。
(3)add 命令的基本语法格式:
add key flags exptime bytes [noreply]
value
(4)参数说明和输出信息同set命令。
3、Memcached replace 命令
(1)Memcached replace 命令:用于替换已存在的 key(键) 的 value(数据值)。
(2)如果 key 不存在,则替换失败,并且获得响应 NOT_STORED。
(3)replace 命令的基本语法格式:
replace key flags exptime bytes [noreply]
value
(4)参数说明和输出信息同set命令。
(5) set 、add 、replace 三个命令的区别
add命令:用于向 memcache 服务器添加一个要缓存的数据,如果 key 存在则返回 false。
replace命令:用于向 memcache 服务器替换一个指定 key 的缓存内容,如果 key 不存在则返回 false。
set 命令:用于设置一个指定 key 的缓存内容,是 add 方法和 replace 方法的集合体。
4、Memcached append 命令
(1)Memcached append 命令:用于向已存在 key(键) 的 value(数据值) 后面追加数据(字符串相加) 。
(2)append 命令的基本语法格式:
append key flags exptime bytes [noreply]
value
(3)参数说明同set命令。
(4)输出信息
- STORED:保存成功后输出。
- NOT_STORED:该键在 Memcached 上不存在。
- CLIENT_ERROR:执行错误。
5、Memcached prepend 命令
(1)Memcached prepend 命令用于向已存在 key(键) 的 value(数据值) 前面追加数据 。
(2)prepend 命令的基本语法格式:
prepend key flags exptime bytes [noreply]
value
(3)参数说明同set命令。
(4)输出信息同append命令。
6、Memcached CAS 命令
(1)Memcached CAS(Check-And-Set 或 Compare-And-Swap) 命令:用于执行一个"检查并设置"的操作。
Memcached CAS命令仅在当前客户端最后一次取值后,该key 对应的值没有被其他客户端修改的情况下, 才能够将值写入。
检查是通过cas_token参数进行的, 这个参数是Memcach指定给已经存在的元素的一个唯一的64位值。
使用 CAS 命令,需要从 Memcached 服务商通过 gets 命令获取令牌(token)。
(2)CAS 命令的基本语法格式:
cas key flags exptime bytes unique_cas_token [noreply]
value
(3)参数说明:
- unique_cas_token选项:通过 gets 命令获取的一个唯一的64位值。
- 其他参数说明同set命令。
(4)输出信息:
- STORED:保存成功后输出。
- ERROR:保存出错或语法错误。
- EXISTS:在最后一次取值后另外一个用户也在更新该数据。
- NOT_FOUND:Memcached 服务上不存在该键值。
三、Memcached查找命令
1、Memcached get 命令
(1)Memcached get 命令:获取存储在 key(键) 中的 value(数据值) ,如果 key 不存在,则返回空。
(2)get 命令的基本语法格式如下:
get key
get key1 key2 key3 #多个 key 使用空格隔开
(3)参数key:键值 key-value 结构中的 key,用于查找缓存值。
2、Memcached gets 命令
(1)Memcached gets 命令获取带有 CAS 令牌存 的 value(数据值) ,如果 key 不存在,则返回空。
(2)gets 命令的基本语法格式如下:
gets key
gets key1 key2 key3 #多个 key 使用空格隔开
3、Memcached delete 命令
(1)Memcached delete 命令:用于删除已存在的 key(键)。
(2)delete 命令的基本语法格式:delete key [noreply]
(3)参数说明:
- key:键值 key-value 结构中的 key,用于查找缓存值。
- noreply(可选): 该参数告知服务器不需要返回数据
(4)输出信息说明:
- DELETED:删除成功。
- ERROR:语法错误或删除失败。
- NOT_FOUND:key 不存在。
4、Memcached incr 命令
(1)Memcached incr 与 decr 命令用于对已存在的 key(键) 的数字值进行自增操作。
incr 与 decr 命令操作的数据必须是十进制的32位无符号整数。
如果 key 不存在返回 NOT_FOUND,如果键的值不为数字,则返回 CLIENT_ERROR,其他错误返回 ERROR。
(2)incr 命令的基本语法格式:incr key increment_value
(3)参数说明:
- key:键值 key-value 结构中的 key,用于查找缓存值。
- increment_value: 增加的数值。
(4)输出信息说明:
- NOT_FOUND:key 不存在。
- CLIENT_ERROR:自增值不是对象。
- ERROR其他错误,如语法错误等。
5、Memcached decr 命令
(1)Memcached incr 与 decr 命令用于对已存在的 key(键) 的数字值进行自减操作。
decr 命令操作的数据必须是十进制的32位无符号整数。
如果 key 不存在返回 NOT_FOUND,如果键的值不为数字,则返回 CLIENT_ERROR,其他错误返回 ERROR。
(2)decr 命令的基本语法格式:decr key decrement_value
(3)参数说明:
- key:键值 key-value 结构中的 key,用于查找缓存值。
- decrement_value: 减少的数值。
(4)输出信息说明:
- NOT_FOUND:key 不存在。
- CLIENT_ERROR:自增值不是对象。
- ERROR其他错误,如语法错误等。
四、Memcached 统计命令
1、Memcached stats 命令
(1)Memcached stats 命令用于返回统计信息例如 PID(进程号)、版本号、连接数等。
(2)stats 命令的基本语法格式:stats
stats
STAT pid 1162
STAT uptime 5022
STAT time 1415208270
STAT version 1.4.14
STAT libevent 2.0.19-stable
STAT pointer_size 64
STAT rusage_user 0.096006
STAT rusage_system 0.152009
STAT curr_connections 5
STAT total_connections 6
STAT connection_structures 6
STAT reserved_fds 20
STAT cmd_get 6
STAT cmd_set 4
STAT cmd_flush 0
STAT cmd_touch 0
STAT get_hits 4
STAT get_misses 2
STAT delete_misses 1
STAT delete_hits 1
STAT incr_misses 2
STAT incr_hits 1
STAT decr_misses 0
STAT decr_hits 1
STAT cas_misses 0
STAT cas_hits 0
STAT cas_badval 0
STAT touch_hits 0
STAT touch_misses 0
STAT auth_cmds 0
STAT auth_errors 0
STAT bytes_read 262
STAT bytes_written 313
STAT limit_maxbytes 67108864
STAT accepting_conns 1
STAT listen_disabled_num 0
STAT threads 4
STAT conn_yields 0
STAT hash_power_level 16
STAT hash_bytes 524288
STAT hash_is_expanding 0
STAT expired_unfetched 1
STAT evicted_unfetched 0
STAT bytes 142
STAT curr_items 2
STAT total_items 6
STAT evictions 0
STAT reclaimed 1
END
(3)状态项说明:
- pid: memcache服务器进程ID
- uptime:服务器已运行秒数
- time:服务器当前Unix时间戳
- version:memcache版本
- pointer_size:操作系统指针大小
- rusage_user:进程累计用户时间
- rusage_system:进程累计系统时间
- curr_connections:当前连接数量
- total_connections:Memcached运行以来连接总数
- connection_structures:Memcached分配的连接结构数量
- cmd_get:get命令请求次数
- cmd_set:set命令请求次数
- cmd_flush:flush命令请求次数
- get_hits:get命令命中次数
- get_misses:get命令未命中次数
- delete_misses:delete命令未命中次数
- delete_hits:delete命令命中次数
- incr_misses:incr命令未命中次数
- incr_hits:incr命令命中次数
- decr_misses:decr命令未命中次数
- decr_hits:decr命令命中次数
- cas_misses:cas命令未命中次数
- cas_hits:cas命令命中次数
- cas_badval:使用擦拭次数
- auth_cmds:认证命令处理的次数
- auth_errors:认证失败数目
- bytes_read:读取总字节数
- bytes_written:发送总字节数
- limit_maxbytes:分配的内存总大小(字节)
- accepting_conns:服务器是否达到过最大连接(0/1)
- listen_disabled_num:失效的监听数
- threads:当前线程数
- conn_yields:连接操作主动放弃数目
- bytes:当前存储占用的字节数
- curr_items:当前存储的数据总数
- total_items:启动以来存储的数据总数
- evictions:LRU释放的对象数目
- reclaimed:已过期的数据条目来存储新数据的数目
2、Memcached stats items 命令
(1)Memcached stats items 命令用于显示各个 slab 中 item 的数目和存储时长(最后一次访问距离现在的秒数)。
(2)stats items 命令的基本语法格式:stats items
3、Memcached stats slabs 命令
(1)Memcached stats slabs 命令用于显示各个slab的信息,包括chunk的大小、数目、使用情况等。
(2)stats slabs 命令的基本语法格式:stats slabs
4、Memcached stats sizes 命令
(1)Memcached stats sizes 命令:用于显示所有item的大小和个数。
(2)该信息返回两列,第一列是 item 的大小,第二列是 item 的个数。
(3)stats sizes 命令的基本语法格式:stats sizes
5、Memcached flush_all 命令
(1)Memcached flush_all 命令:用于清理缓存中的所有 key=>value(键=>值) 对。
(2)Memcached flush_all 命令提供了一个可选参数 time,用于在制定的时间后执行清理缓存操作。
(3)flush_all 命令的基本语法格式:flush_all [time] [noreply]
五、Memcached 应用
1、Java 连接 Memcached 服务
使用 Java 程序连接 Memcached,需要在 classpath 中添加 Memcached jar 包。
本站 jar 包下载地址:spymemcached-2.10.3.jar。
以下程序假定 Memcached 服务的主机为 127.0.0.1,端口为 11211。
import net.spy.memcached.MemcachedClient;
import java.net.*;
public class MemcachedJava {
public static void main(String[] args) {
try{
MemcachedClient mcc = new MemcachedClient(new InetSocketAddress("127.0.0.1", 11211));
System.out.println("Connection to server sucessful."); // 本地连接 Memcached 服务
Future fo = mcc.set("mentest", 900, "Free Education"); // 存储数据
System.out.println("set status:" + fo.get()); // 查看存储状态
System.out.println("mentest value in cache - " + mcc.get("mentest"));
fo = mcc.add("mentest", 900, "memcached"); // 添加
System.out.println("add status:" + fo.get()); // 打印状态
fo = mcc.add("codingground", 900, "All Free Compilers"); // 添加新key
System.out.println("add status:" + fo.get()); // 打印状态
System.out.println("codingground value in cache - " + mcc.get("codingground"));
fo = mcc.replace("mentest", 900, "Tutorials' Library"); // 添加新的 key
System.out.println("replace status:" + fo.get()); // 打印状态
System.out.println("mentest value in cache - " + mcc.get("mentest"));
fo = mcc.append("mentest", 900, " for All"); // 对存在的key进行数据添加操作
System.out.println("append status:" + fo.get()); // 打印状态
System.out.println("mentest value in cache - " + mcc.get("codingground"));
fo = mcc.prepend("mentest", 900, "Free "); // 对存在的key进行数据添加操作
System.out.println("prepend status:" + fo.get()); // 打印状态
System.out.println("mentest value in cache - " + mcc.get("codingground"));
CASValue casValue = mcc.gets("mentest"); // 通过 gets 方法获取 CAS token(令牌)
System.out.println("CAS token - " + casValue); // 输出 CAS token(令牌) 值
CASResponse casresp = mcc.cas("mentest", casValue.getCas(), 900, "Tutorials-Library");
System.out.println("CAS Response - " + casresp); // 输出 CAS 响应信息
System.out.println("mentest value in cache - " + mcc.get("mentest"));
fo = mcc.delete("mentest"); // 对存在的key进行数据添加操作
System.out.println("delete status:" + fo.get()); // 打印状态
System.out.println("mentest value in cache - " + mcc.get("codingground"));
System.out.println("value in cache after increment - " + mcc.incr("number", 111));
System.out.println("value in cache after decrement - " + mcc.decr("number", 112));
mcc.shutdown(); // 关闭连接
}catch(Exception ex){
System.out.println( ex.getMessage() );
}
}
}
(1)连接操作:程序中使用 InetSocketAddress 连接 IP 为 127.0.0.1 端口 为 11211 的 memcached 服务。
(2)set 操作:mcc.set("mentest", 900, "Free Education")
(3)add 操作:mcc.add("mentest", 900, "memcached")
(4)replace 操作:mcc.replace("mentest", 900, "Tutorials' Library")
(5)append 操作:append("mentest", 900, " for All")
(6)prepend 操作:mcc.prepend("mentest", 900, "Free ")
(7)CAS 操作:mcc.cas("mentest", casValue.getCas(), 900, "Tutorials-Library")
(8)get 操作:mcc.get("mentest")
(9)gets 操作:mcc.gets("mentest")
(10)delete 操作:mcc.delete("mentest")
(11)Incr/Decr 操作:mcc.incr("number", 111)
、mcc.decr("number", 112)
2、PHP 连接 Memcached 服务
(1)PHP Memcache 扩展安装
离线安装
wget http://pecl.php.net/get/memcache-2.2.7.tgz
tar -zxvf memcache-2.2.7.tgz
cd memcache-2.2.7
/usr/local/php/bin/phpize
./configure --with-php-config=/usr/local/php/bin/php-config
make && make install
在线安装
yum install -y php-memcached
systemctl start httpd //开启apache
systemctl start memcached //开启memcached
setenforce 0
(2)检查安装结果:/usr/local/php/bin/php -m | grep memcache
(3) Memcache类
- Memcache::add:增加一个条目到缓存服务器
- Memcache::addServer:向连接池中添加一个memcache服务器
- Memcache::close:关闭memcache连接
- Memcache::connect :打开一个memcached服务端连接
- Memcache::decrement :减小元素的值
- Memcache::delete :从服务端删除一个元素
- Memcache::flush :清洗(删除)已经存储的所有的元素
- Memcache::get :从服务端检回一个元素
- Memcache::getExtendedStats :缓存服务器池中所有服务器统计信息
- Memcache::getServerStatus :用于获取一个服务器的在线/离线状态
- Memcache::getStats :获取服务器统计信息
- Memcache::getVersion :返回服务器版本信息
- Memcache::increment:增加一个元素的值
- Memcache::pconnect:打开一个到服务器的持久化连接
- Memcache::replace :替换已经存在的元素的值
- Memcache::set :Store data at the server
- Memcache::setCompressThreshold :开启大值自动压缩
- Memcache::setServerParams :运行时修改服务器参数和状态
(4)Memcache 函数:
- memcache_debug:转换调试输出的开/关
六、参考资料
【山外笔记-数据库】Memcached详解教程的更多相关文章
- Jmeter(七) - 从入门到精通 - 建立数据库测试计划实战<MySQL数据库>(详解教程)
1.简介 在实际工作中,我们经常会听到数据库的性能和稳定性等等,这些有时候也需要测试工程师去评估和测试,上一篇文章宏哥主要介绍了jmeter连接和创建数据库测试计划的过程,宏哥在文中通过示例和代码非常 ...
- Jmeter(十六) - 从入门到精通 - JMeter前置处理器(详解教程)
1.简介 前置处理器是在发出“取样器请求”之前执行一些操作.如果将前置处理器附加到取样器元件,则它将在该取样器元件运行之前执行.前置处理器最常用于在取样器请求运行前修改其设置,或更新未从响应文本中提取 ...
- Jmeter(十八) - 从入门到精通 - JMeter后置处理器 -下篇(详解教程)
1.简介 后置处理器是在发出“取样器请求”之后执行一些操作.取样器用来模拟用户请求,有时候服务器的响应数据在后续请求中需要用到,我们的势必要对这些响应数据进行处理,后置处理器就是来完成这项工作的.例如 ...
- 【山外笔记-工具框架】iperf3网络性能测试工具详解教程
[山外笔记-工具框架]iperf3网络性能测试工具详解教程 本文下载链接 [学习笔记]iperf3网络性能测试工具.pdf 网络性能评估主要是监测网络带宽的使用率,将网络带宽利用最大化是保证网络性 ...
- 【山外笔记-SVN命令】svnlook命令详解
本文打印版问文件下载地址 [山外笔记-SVN命令]svnlook命令详解-打印版.pdf 一.命令简介 svnlook是检验Subversion版本库不同方面的命令行工具,不会对版本库有任何修改,只是 ...
- 【山外笔记-SVN命令】svn命令详解
本文打印版文件下载地址 [山外笔记-SVN命令]svn命令详解-打印版.pdf 一.命令简介 svn命令用于Subversion命令行客户端,执行svn相关的操作. 二.命令语法 1.svn语法: ( ...
- 《手把手教你》系列技巧篇(三十一)-java+ selenium自动化测试- Actions的相关操作-番外篇(详解教程)
1.简介 上一篇中,宏哥说的宏哥在最后提到网站的反爬虫机制,那么宏哥在自己本地做一个网页,没有那个反爬虫的机制,谷歌浏览器是不是就可以验证成功了,宏哥就想验证一下自己想法,于是写了这一篇文章,另外也是 ...
- 《手把手教你》系列技巧篇(三十六)-java+ selenium自动化测试-单选和多选按钮操作-番外篇(详解教程)
1.简介 前边几篇文章是宏哥自己在本地弄了一个单选和多选的demo,然后又找了网上相关联的例子给小伙伴或童鞋们演示了一下如何自动化测试,这一篇宏哥在网上找了一个问卷调查,给小伙伴或童鞋们来演示一下.上 ...
- 《手把手教你》系列基础篇(八十)-java+ selenium自动化测试-框架设计基础-TestNG依赖测试-番外篇(详解教程)
1.简介 经过前边几篇知识点的介绍,今天宏哥就在实际测试中应用一下前边所学的依赖测试.这一篇主要介绍在TestNG中一个类中有多个测试方法的时候,多个测试方法的执行顺序或者依赖关系的问题.如果不用de ...
随机推荐
- git 分支的创建与合并
首先我们需要先创建一个新的dev分支,然后切换到dev分支: $ git checkout -b dev //命令语句 Switched to a new branch 'dev' //成功执行输出语 ...
- 正则表达式(R&Python)
regular expression 1.R,strongly recommend this blog The table_info examples are following: du_mtime_ ...
- Nginx Configure
1.主配置/etc/nginx.conf #/etc/nginx/nginx.conf user nginx; worker_processes auto; error_log /var/log/ng ...
- swagger2 接口文档,整个微服务接口文档
1,因为整个微服务会有好多服务,比如会员服务,支付服务,订单服务,每个服务都集成了swagger 我们在访问的时候,不可能每个服务输入一个url 去访问,看起来很麻烦,所以我们需要在一个页面上集成整个 ...
- 读者来信-5 | 如果你家HBase集群Region太多请点进来看看,这个问题你可能会遇到
前言:<读者来信>是HBase老店开设的一个问答专栏,旨在能为更多的小伙伴解决工作中常遇到的HBase相关的问题.老店会尽力帮大家解决这些问题或帮你发出求救贴,老店希望这会是一个互帮互助的 ...
- python数据分析工具 | matplotlib
不论是数据挖掘还是数学建模,都免不了数据可视化的问题.对于 Python 来说,matplotlib 是最著名的绘图库,它主要用于二维绘图,当然也可以进行简单的三维绘图.它不但提供了一整套和 Matl ...
- 《Three.js 入门指南》2- 照相机
2.1 什么是照相机 我们使用Three.js创建的场景是三维的,而通常情况下显示屏是二维的,那么三维的场景如何显示到二维的显示屏上呢?照相机就是这样一个抽象,它定义了三维空间到二维屏幕的投影方式,用 ...
- 1053 Path of Equal Weight (30分)(并查集)
Given a non-empty tree with root R, and with weight Wi assigned to each tree node Ti. The weig ...
- VMwareWorkstation如何设置共享文件夹
首先需要安装VMware Tools 这个嘛,应该是需要安装的,之前没有安装好像就没有设置成功. 没有安装的参考如何安装VMware Tools 然后在虚拟机设置里面设置共享路径 右键虚拟机名称,打开 ...
- flaks-自定义url转换器
flaks-自定义url转换器 from flask import Flask, url_for from werkzeug.routing import BaseConverter app = Fl ...