【山外笔记-数据库】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 ...
随机推荐
- 构建安全可靠的微服务 | Nacos 在颜铺 SaaS 平台的应用实践
作者 | 殷铭 颜铺科技架构师 本文整理自架构师成长系列 3 月 19 日直播课程. 关注"阿里巴巴云原生"公众号,回复 "319",即可获取对应直播回放链接 ...
- 基于Doc2vec训练句子向量
目录 一.Doc2vec原理 二.代码实现 三.总结 一.Doc2vec原理 前文总结了Word2vec训练词向量的细节,讲解了一个词是如何通过word2vec模型训练出唯一的向量来表示的.那接着 ...
- SVN: Cleanup failed update报错 文件被锁定lock办法,cleanup 失效报错。
按照如下办法即可解决: 下载文件链接: https://pan.baidu.com/s/1Ump1BFihbX8izyAA4by5dA 提取码: ftsd 复制这段内容后打开百度网盘手机App,操作更 ...
- 在EF中使用SQL执行简单高效的增删查操作
随着平台数据的积累,对于数据访问的速度要求愈来愈高.优化后台访问性能,将是之后的一个重点任务. 但是,后台在项目开发初期采用的是Abp(Lite DDD)框架,集成EnityFramework.因为之 ...
- 《java编程思想》多态与接口
向上转型 定义:把某个对象的引用视为对其基类类型的引用的做法被称为向上转型方法调用绑定 将一个方法调用同一个方法主体关联起来被称作绑定. 前期绑定:程序执行前进行的绑定叫做前期绑定,前期绑定也是jav ...
- 使用Spring管理数据库事务
在整个JavaWeb项目开发中,事务是用来开发可靠性网络应用程序的最关键部分.当应用程序与后端资源进行交互时,就会用到事务,这里的后端资源包括数据库.MQ.ERP等.而数据库事务是最常见的类型,而我们 ...
- AutoCompleteTextView的简单使用
1.AutoCompleteTextView功能 自动完成文本框,由EditText派生而来,是一个文本编辑框,相较普通的文本编辑框多了提示功能,即用户输入一定数量的字符后,自动完成文本框会弹出一个下 ...
- 使用 Visual Studio 开发、测试和部署 Azure Functions(一)开发
1,什么是Azure functions Azure Functions 是 Microsoft Azure 提供的完全托管的 PaaS 服务,用于实现无服务器体系结构. Azure Function ...
- Spring Boot整合Servlet,Filter,Listener,访问静态资源
目录 Spring Boot整合Servlet(两种方式) 第一种方式(通过注解扫描方式完成Servlet组件的注册): 第二种方式(通过方法完成Servlet组件的注册) Springboot整合F ...
- 多线程学习笔记(五)---- 在JDK文档的使用
1.前言 我们经常在JDK文档中见到一些类上的介绍说,该类是"安全的"."不安全"."效率高"."效率低"的词眼.这里, ...