游客 你可以选择到 登录 注册帐号 忘记密码?
  • 服务热线:
    13999268016
您现在的位置:首页主页 > 下载中心 > 文档下载 >
Haisql_memcache最佳实践方案.docx

文件介绍:

                                                         Haisql_memcache的最佳实践方案
一:Haisql_memcache基本设置
1.安装服务器启动所需的库文件
~$ sudo apt install libtcmalloc-minimal4
2.当打开UDP端口时,每次拷贝或覆盖新的版本后,都需先执行以下命令:
sudo setcap cap_net_bind_service=eip /data/guo/haisql_memcache_linux
“/data/guo”:代表服务器haisql_memcache_linux所在目录.
3.启动haisql_memcache服务器
(1):~$./haisql_memcache_linux -x 100000 -s 127.0.0.1 -p 1971 -e 200 -t /data/guo/ -f haisql.pid -o 4 -M 1 -w 3
-x是分配给haisql_memcache的每张数据表的最大使用数量
-s是监听的服务器的IP地址,可以指定多个地址,这里指定服务器IP地址127.0.0.1
-p是设置haisql_Memcache监听的端口,这里设置1971,最好是1024以上的端口
-e选项是最大运行的并发连接数,这里设置200,按照你服务器的负载量来设定
-t设置保存haisql_memcache的pid文件路径,保存路径为:/data/guo/
-f设置保存haisql_memcache的pid文件名,保存文件名为:haisql.pid
-o设置haisql_memcache的并发工作线程数量,这里指定并发线程数为4
-M设置数据表超出空间限制后的处理模式,这里为1,自动删除过期数据并重试
-w设置数据日志工作模式,这里指定为模式3,保存数据日志并每秒刷进硬盘
(2):~$./haisql_memcache_linux
表示:全部以默认参数配置启动服务器。
4.
如果要停止或退出服务器,执行:  "Ctrl_C"
5. 如果要强制结束haisql_memcache进程,执行:
      ~$ Kill 进程号
二.采用一致性hash算法的目的?
    采用hash算法的目的有两个:一是节点变动后其他节点影响尽可能小;二是节点变动后数据重新分配尽可能均衡.
三.什么是haisql_memcache?
    Haisql_memcache是一个高性能的分布式内存的缓存系统,本质上是通用的,但其目的是为了加速动态web应用程序,减轻数据库访问压力而设计的,并且用来提高网站的速度,一个网站一般由大批的web服务器和数据库服务器构成,以此可以为其一百万用户甚至更多用户提供每天上千万次的动态页面访问量,haisql_memcache大大降低了数据库的负担,加快了页面的加载时间,提高了资源利用效率,加快了缓存未命中情况下的数据库访问时间。
四.哪些环境可以运行haisql_memcache?
    随便哪里,只要有空闲的内存就可以,haisql_memcache运行在linux,BSD上,它一般很少占用CPU资源,这样就可以运行在任何有空闲内存的地方了。
五.为什么要运行haisql_memcache?
    如果网站的高流量很大并且大多数的访问会造成数据库高负荷的状况下,使用 haisql_memcache能够减轻数据库的压力。
六.适合haisql_memcache的业务场景
    1)如果网站包含了访问量很大的动态网页,因而数据库的负载将会很高。由于大部分数据库请求都是读操作,那么haisql_memcache可以显著地减小数据库负载.
    2)如果数据库服务器的负载比较低但CPU使用率很高,这时可以缓存计算好的结果(computed objects)和渲染后的网页模板(enderred templates).
    3)利用memcached可以缓存session数据临时数据以减少对他们的数据库写操作.
    4)缓存被频繁访问的文件.
    5)对key和value的长度没有限制(最大4G).
    6)对需要保存的数据可以永久保存.
    7)在系统崩溃/故障等情况下,支持数据的掉电保护,可以保证数据库的一致性.
七.不适合haisql_memcache的业务场景
    1)虚拟主机不让运行haisql_memcache服务,如果应用本身托管在低端的虚拟私有服务器上,想vmware,xen这类虚拟化技术并不适合运行haisql_memcache,haisql_memcache需要接管和控制大块的内存,如果haisql_memcache管理的内存被os或hypervisor交换出去,haisql_memcache的性能将大打折扣.
    2)应用运行在不安全的环境中,haisql_memcache未提供任何安全策略,仅
仅通过telnet就可以访问到haisql_memcache,如果应用运行在共享的系统
上,需要着重考虑安全问题.
八.能够遍历haisql_memcache中所有的数据?
    可以遍历haisql_memcache中所有数据,这个操作不会阻塞其他的操作,haisql_memcache中的getg命令可以获取查询当前表中的所有数据。
九.Haisql_memcache是怎么工作的?
    Haisql_memcache的高性能源于两端哈希结构,haisql_memcache就像一个巨大的存储了很多<key,value>对的哈希表,通过key,可以存储或查
询任意的数据,客户端可以把数据存储在多台haisql_memcache上,当查询数据时,客户端首先参考节点列表计算出key的哈希值(阶段一哈希),进而选中一个节点;客户端将请求发送给选中的节点,然后haisql_memcache节点通过一个内部的哈希算法(阶段二哈希);查找真正的数据并返回给客户端。
十.Haisql_memcache最大的优势是什么?
    1. Haisql_memcache最大的好处是它有极佳的可扩展性,特别是在一个巨大的系统中。由于客户端自己做了一次哈希,那么我们很容易增加大量haisql_memecache到集群中。Haisql_memcache之间没有互相通信,因此不会增加 haisql_memcache的负载。   
    2.haisql_memcache的性能比Redis和memcached更快,比Memcached更多功能,支持事务,支持微线程,支持pipeling,支持数据日志,支持掉电保护的高性能KV数据库,具有高并发性,性能非常快,并且haisql_memcache兼容memcached指令集,包括返回的内容和错误提示均一致,可作为一个特殊版本的服务器直接与memcached客户端相连接。
十一.haisql_memcache和MySQL的query cache相比,有什么优缺点?
query cache的优点:
    1)MySQL的query cache,可以自动地缓存SQL查询的结果,被缓存的SQL查询可以被反复、快速的执行。
query cache的缺点:
    1)当修改表时,MySQL的query cache会立刻被刷新(flush)。当写操作很频繁时,MySQL的query cache会经常让所有缓存数据都失效。
    2)在多核CPU上,MySQL的query cache会遇到扩展问题(scalability
issues)。在多核CPU上,query cache会增加一个全局锁(global lock), 由于需要刷新更多的缓存数据,速度会变得更慢。
    3)在MySQL的query cache中,是不能存储任意的数据的(只能是SQL查询结果)。利用haisql_memcache,我们可以搭建出各种高效的缓存。比如,可以执行多个独立的查询,构建出一个用户对象(user object),然后将用户对象缓存到haisql_memcache中。而query cache是SQL语句级别的,不可能做到这一点。在小的网站中,query cache会有所帮助,但随着网站规模的增加,query cache的弊将大于利。
    4)query cache能够利用的内存容量受到MySQL服务器空闲内存空间的限制。给数据库服务器增加更多的内存来缓存数据,固然是很好的。但是,有了haisql_memcache,只要您有空闲内存,都可以用来增加haisql_memcache集群的规模,然后您就可以缓存更多的数据。
十二.Haisql_memcache和服务器的local cache(比如PHP的APC、mmap文件等)相比,有什么优缺点?
    1)首先,local cache面临着严重的内存限制,能够利用的内存容量受到(单台)服务器空闲内存空间的限制,而haisql_memcache则不受内存的限制。
    2)local cache缺少集体失效(group invalidation)的特性。在haisql_memcache集群中,删除或更新一个key会让所有的观察者觉察到。但是在local cache中, 我们只能通知所有的服务器刷新cache(很慢,不具扩展性)或者仅仅依赖缓存超时失效机制。
十三.Haisql_memcache和memcached相比有什么优缺点?
    (1)memcached采用单表的方式存储,而haisql_memcache存储的方式是采用多表并且全部数据内存存储的方式,查询数据不涉及硬盘IO,因此,性能比memcached快很多,各操作平均花费是数十微秒。支持多数据表并发, 也支持单数据表并发,内部将数据库单数据表分为256个组,使用256把独立的锁分别负责每组数据的并发问题,减少了数据存取时的锁冲突。将工作线程数量与CPU数量一致,减少了线程切换,提供了更高的性能和更低的锁冲突,利用hash检索的方法,实现了O(1)级别的检索复杂度,因此具备极高的性能。
    (2)memcached的缓存区大小为固定值,当要存储的数据很少时,会造成许多内存资源的浪费,并且当内存存满数据时,会自动覆盖原来的数据,这样便又会导致许多重要数据的丢失。而haisql_memcache则会根据要存储的数据的大小自动进行内存的分配,当要保存大量的数据信息时,haisql_memcache便会自动扩展内存,而当要保存的数据很少时,会自动减少内存空间的分配,这样便大大减少了内存的占用率.
    (3)与memcached相比,haisql_memcache的处理性能更高高,因为haisql_memcache的网络层使用了keep_live进行自动循环检测,定时扫描,每秒进行1次扫描有没有拆掉的线程。为保证不会造成数据的丢失,和普通的简单的网络层处理流程相比,我们最主要的区别体现在close上,是通过一系列的复杂流程close:通过向客户端发送shutdown状态,让客户端检测到并主动发起拆线请求,使服务器端在正常拆线后不会出现time_wait的情况,并要让time_wait留在客户端,除非客户端响应超时的极少数情况time_wait状态会留在服务器端,这样极大的提高了服务器端的处理性能。
    (4)Memcached对Value和key大小长度有限制,Key字符串的长度不能超过255个字符;Value字符串的长度不能超过1024 * 1024个字符, 即存储数据不能超过1M,而haisql_memcache对value和key的大小长度均无限制,可以为任意长度。
    (5)memcached对网络层的并发数量有限制,而haisql_memcache的并发数量在内存足够的情况下没有上限。 Haisql_memcache的网络层具有高并发的性能,在内存足够的情况下,单机并发数量是没有上限的,理论上可以支持百万以上连接同时并发(需要设置系统的最大打开文件句柄数量,需要设置TCP socket数量等限制)。  
    (6)haisql_memcache支持全局数据查询,使用命令集getg<group_number>*\r\n,表示获取<group_number>组的全部数据,当不带参数时,表示获取当前表的全部数据,执行全表扫描和输出全部数据,而memcached不支持数据的全局查询。
    (7)Haisql_memcache支持类似于like的指令集getl,而memcached不支持。在haisql_memecach服务器监听端口1971中输入命令getl,将会读取前面与X匹配的数据,即从当前数据表中获取键值为字符串<x>开头的多条数据.
十四.Haisql_memcache和memcached的性能测试对比情况?
1.测试方法:
    当需要打开的的文件句柄数大于108万时,web服务器如果存在高并发下大量连接被拆除的问题,那么可能是如下原因:
    linux的socket 在内部使用了文件句柄来获取操作系统资源,因此,如果需要同时并发10万个连接,需要设置最大打开文件句柄数为11万,才能进行测试和使用。在/etc/security/limits.conf文件中设置最大打开文件句柄数,添加如下这2行:
    * soft nofile 110000 
    * hard nofile 110000 
运行服务器
1) 运行 memcached, 需要指定8192M内存, 以便可以测试百万以上的数据量, 指定端口号是1983,命令如下:
memcached -m 8192 -p 1983
2) 我们的程序是动态申请内存,因此,不需要指定预先分配的内存量, 直接运行就可以了,启动运行服务器命令如下:
./haisql_memcache_chinese
我们的软件默认运行端口是1971
每次测试后需要清理运行环境, memcached直接ctrl_C退出就可以了.
我们的软件因为退出时默认自动保存内存数据, 因此,需要在退出程序后,执行 rm *.txt;sync;sync 清理掉自动保存的数据, 相当于清空全部数据,这样下次启动时就是空数据表了.
2.使用 memcslap的测试情况
1)先测试 读性能
  测试软件自动写入1万条记录, 然后测试读取900万次, 我们的软件执行时间是23.631秒, memcache执行时间是38.828秒, 我们的软件比memcache快64%.
   我们的软件读性能如下: 读4.1Kbyte的数据包大小, 4核8线程3.4G主频DDR3内存, 读900万次数据, 900并发, 花费时间 23.631秒, 读性能38万QPS。
读性能 测试结果:
第1次是memcached的测试结果, 第2次是我们的软件测试结果
guo@guo-desktop:~$ memcslap --concurrency=900  --servers=127.0.0.1:1983 --test=get
    Threads connecting to servers 900
    Took 38.828 seconds to read data
guo@guo-desktop:~$ memcslap --concurrency=900  --servers=127.0.0.1:1971 --test=get
    Threads connecting to servers 900
    Took 23.631 seconds to read data
2)测试 写性能
   测试软件测试写入100万条记录, 我们的软件执行时间是3.136秒, memcache执行时间是4.078秒, 我们的软件比memcache快30%.
   我们的软件写性能如下: 写4.1Kbyte的数据包大小, 4核8线程3.4G主频DDR3内存, 写100万次数据, 100并发, 花费时间3.136秒, 写性能32万TPS.
写性能 测试结果:
第1次是memcached的测试结果, 第2次是我们的软件测试结果
guo@guo-desktop:~$ memcslap --concurrency=100  --servers=127.0.0.1:1983
    Threads connecting to servers 100
    Took 4.078 seconds to load data 
guo@guo-desktop:~$ memcslap --concurrency=100  --servers=127.0.0.1:1971
    Threads connecting to servers 100
    Took 3.136 seconds to load data
十五.Haiqsl_memcache的cache机制是怎样的?
    Haisql_Memcache主要的cache机制是超时失效。当您存数据到haisql_memcache中,可以自行指定该数据在缓存中的过期时间。
    在haisql_memcache中,当设置数据的过期时间为0时,表示数据会永久保存,因此当释放内存空间时,就会根据数据过期的时间进行释放,永远都不会造成数据的丢失,大大保障了数据信息的安全性。同时haisql_memcache采用动态空间分配的方式,将数据库分为32个表,再将数据库的这32个表分为多个块区,保存的数据会存储在其中一个区块里,并且会根据要存储的数据的大小自动进行内存的分配,当要保存大量的数据信息时,haisql_memcache便会自动扩展内存,而当要保存的数据很少时,会自动减少内存空间的分配,这样便大大减少了内存的占用率。
十六.Haisql_memcache如何实现冗余机制?
    没有冗余机制。因为haisql_memcache是应用的缓存层,在设计上没有任何的数据冗余的概念。如果一个节点丢失了它的数据,可以重新从数据源获取所有数据,并且应用能够在丢失haisql_memcache实例的情况下继续运行,这一点非常重要。
十七.如何将haisql_memcache中的数据批量导入导出?
    Haisql_memcache数据库不适合数据的批量导入导出。
十八.Haisql_memcache是如何做身份验证的?
hasiql_memcache是没有身份认证机制!Hasiql_memcache是运行在应用下层的软件(身份验证应该是应用上层的职责)。Haisql_memcache的客户端和服务器端之所以是轻量级的,部分原因就是完全没有实现身份验证机制。这样,haisql_memcache可以很快地创建新连接,服务器端也无需任何配置。如果您希望限制访问,您可以使用防火墙,或者让haisql_memcache监听unix domain socket。
十九.Haisql_memcache的微线程是什么?
Haisql_memcache对于微线程的主要思路是实现stackless 用户态微线程,通过C++函数对象, 使得一些状态可以保存到成员变中. C++的函数对象,既可以像普通函数那样调用, 又可以像通常的对象那样携带成员变量. 因此通过将变量置于对象而不是栈上, 并且通过用户态的任务队列,C++就可以实现无栈用户态微线程. 微线程的开销不过就是一个函数对象, 通常大小不过几个字节到几KB字节. 因此无栈用户态微线程无需当心内存开销,也没有CPU线程切换的开销,性能非常好。
微线程的优点:
     (1)消耗小,切换快,一个进程可以创建成千上万个微线程.
     (2)小任务顺序编程很符合人的思维方式, 规避纯异步编程中状态机的复杂性. 使得使用微线程写的程序将更加的直观,逻辑描述方便, 简化编程.纤程用于化异步为同步,你可以进行一个异步操作以后就切换纤程,等到异步操作完成以后在切换回来,这样,在逻辑上相关的代码就可以写到一个函数里面,而不用人为的分到多个回调函数中.
     (3)每个CPU只绑定一个线程,每个线程处理多个微线程的TCP/IP数据包,形成一个N个CPU:M个连接的架构,这样就完全避免了线程的切换,极大的提高了网络层的并发量.
二十.Haisql_memcache能接受的key的最大长度是多少?
    haisql_memcache对key的大小长度均无限制,可以为任意长度(最大32位)。
二十一.Haisql_memcache能接受的value的最大长度是多少?
    haisql_memcache对value的大小长度均无限制,可以为任意长度(最大32位)。
二十二.Haisql_memcache对数据的过期时间有什么限制?
    haisql_memcache对数据的过期时间没有限制,用户可以自行设置数据的过期时间,当设置过期时间为0时,表示数据会永久保存,因此当释放内存空间时,就会根据数据老化的时间进行释放,永远都不会造成数据的丢失,大大保障了数据信息的安全性。
二十三. 可以在不同的haisql_memcache节点上使用大小不等的缓存空间吗?如果这么做之后,haisql_memcache能够更有效地使用内存吗?
    Hasiql_Memcache客户端仅根据哈希算法来决定将某个key存储在哪个节点上,而不考虑节点的内存大小。因此,可以在不同的节点上使用大小不等的内存作为缓存空间。一般这样做:拥有较多内存的节点上可以运行多个haisql_memcache实例,每个实例使用的内存跟其他节点上的实例相同。
二十四. Haisql_memcache的内存分配器是如何工作的?为什么不使用slabs
    haisql_memcache的内存分配器是采用动态空间分配的方式,将数据库分为32个表,再将数据库的这32个表分为多个块区,保存的数据会存储在其中一个区块里,同时会根据要存储的数据的大小自动进行内存的分配,当要保存大量的数据信息时,haisql_memcache便会自动扩展内存,而当要保存的数据很少时,会自动减少内存空间的分配,这样便大大减少了内存的占用率。同时haisql_memcache中,用户可以设置数据老化的时间,当设置老化时间为0时,表示数据会永久保存,因此当释放内存空间时,就会根据数据老化的时间进行释放,永远都不会造成数据的丢失,大大保障了数据信息的安全性。
    不使用slabs分配器是因为,如果item的大小与被选择存放它的slab不是很合适,就会十分浪费内存。
二十五. Haisql_memcache是原子的吗?
    所有的被发送到haisql_memcache的单个命令是完全原子的。如果针对同一份数据同时发送了一个set命令和一个get命令,它们不会影响对方。它们将被串行化、先后执行。即使在多线程模式,所有的命令都是原子的。但是,命令序列不是原子的。如果首先通过get命令获取了一个value,修改了它,然后再把它set回haisql_memcache,系统不保证这个value没有被其他进程(process,未必是操作系统中的进程)操作过。Haisql_memcached 提供了gets和cas命令,它们可以解决上面的问题。如果使用gets命令查询某个key的value,haisql_memcache会返回该value值的唯一标识。如果客户端程序覆写了这个value并想把它写回到haisql_memcache中,可以通过cas命令把那个唯一标识一起发送给hasiql_memcache。如果该value存放在haisql_memcache中的唯一标识与您提供的一致,写操作将会成功。如果另一个进程在这期间也修改了这个value,那么该value存放在haisql_memcache中的唯一标识将会改变,写操作就会失败。
二十六. Haisql_memcache比memcached的性能快,体现在哪里?
    1)有一个快速的网络层,基于Boost::asio基础上二次封装优化改进后的网络库,网络层总行数超过4000行。
 2)比std::unordered_map快70%的基于环形队列的新型hash_map/ set库,比std::unordered_map更快,rehash性能抖动小的自主研发的高性能circular_hash_map 库。环形队列大小自动收缩扩展。
 3)log日志单独线程处理,因此, 有更快的速度,有更多的合并写,极大提高了日志的写性能。
 4)wait_free_mpsc_queue 多生产者单消费者无等待队列的应用, 极大的提高了多线程的并发性能。 多线程写日志就是通过此队列传递给log单线程实现。
 自主研发的多生产者单消费者无等待队列,性能非常好,比boost库中最快的wait_free_spsc_queue快很多, 时延更小,可以支持任意对象放入到队列中(boost库中的那个只支持普通POD数据,最大长度8字节),支持双向数据传送(boost库只支持单向,我们的版本支持pop处理后的push线程的callback回调数据的传送),支持无任务自动休眠,支持push,自动pop处理, 自动调用after_pop_all,自动call_back调用.  内部主要是基于std::atomic和memory_order相关的命令来实现,有一定的技术难度。使用时,预先设置各function函数,主程序只要push数据,其他过程都是自动完成的。
 5)性能快且线程安全的 shared_ptr,与现有shared_ptr/ weak_ptr/enable_shared_from_this/make_shared 在写法上完全兼容,可以简单无缝切换std/boost 库的相关对象.新的 shared_ptr 具备单写多读的线程安全特性,大大方便了多线程程序的开发,使用创建一个新shared_ptr,赋值给旧的 shared_ptr,这整个过程都是无锁的,没有读并发冲突,大大提高了性能.
    6)各种高性能外围库的实现,重写了很多std库。 例如:常用的二进制和十进制互转,常规std库一般是循环将二进制除10来实现的, 我们的库是使用了 5的魔术数字的 乘法+移位来实现的,性能提高了很多。类似std::to_string(T&)之类的库, 性能都有了几倍的提高。
 7)各类锁,很多公司和产品都有提供自己写的锁,以便提供比std:;mutex更好的性能,例如:mysql中的自旋锁, 与很多公司此类库直接使用cas指令不同,我们主要是用std::atomic来实现,兼容性更好,参考了C++标准化委员会的建议代码,增加了锁冲突后yield()的机制,无其他任务可执行时候每次spin检查延迟时间只有0.1微秒,有其他任务可执行时将切换线程释放CPU,标准锁class大小只有1个字节, 兼容所有操作系统和所有CPU。
 库中已经实现的锁包括:标准锁,读写锁(写优先锁), 读写锁(读优先锁),可重入锁。所有的锁在用法上与std库兼容, 因此,可以直接使用std::lock_guard等各类上锁的标准std操作。
 性能指标是测试 KV 数据包大小4.1Kbyte, 4核8线程3.4G主频DDR3内存,读900万次数据,900并发,读性能38万QPS;写100万次数据, 100并发,写性能32万TPS。
二十七.
常规无等待(Wait-Free)(非集居数无关)如何?

    如果随着线程数增加,操作数的增长非常平缓,那么性能可能会扩展和增加。
如果随着线程数增加,操作数成二次方地增长,该算法不会比一个无锁(Lock-Free)算法好很多(甚至可能更差)。基本上,非集居数无关无等待算法和数据结构处于无锁(Lock-Free)和集居数无关无等待(WFPO)之间。如下图所示:
         
     如上图:无锁(Lock-Free)算法和数据结构固有的可扩展性上限,在某个点,无论使用多少线程/核都不会提高整体性能,由于高争用实际上可能还会降低性能。

     在一定程度上增加更多线程执行无锁(Lock-Free)算法是好事,但是对于某些算法和数据结构这个限制点很低。如果有长远考虑,或者你的应用打算在大量线程/核上运行,需要选择集居数无关无等待(WFPO)算法,否则不会走太远。
二十八. 使用不同的客户端库,可以访问到haisql_memcache中相同的数据吗?
从技术上说,是可以的。但是可能会遇到下面三个问题:
    1)不同的库采用不同的方式序列化数据。而haisql_memcache采用的序列化方式与其他语言的客户端库采用的方式很可能不同,就会不能读取这种格式的数据。如果您要存储复杂的数据并且想被多种客户端库读取,那么应该以简单的string格式来存储,并且这种格式可以被JSON、XML等外部库解析。
    2)从某个客户端来的数据被压缩了,从另一个客户端来的却没被压缩。
    3)各个客户端库可能使用不同的哈希算法(阶段一哈希)。在连接到多个hasiql_memcache服务端的情况下,客户端库根据自身实现的哈希算法把key
映射到某台hasiql_memcache上。正是因为不同的客户端库使用不同的哈希算法,所以被Perl客户端库映射到haisql_memcache A的key,可能又会被Python客户端库映射到hasiql_memcache B,等等。Perl客户端库还允许为每台haisql_memcache指定不同的权重(weight),这也是导致这个问题的一个因素。
二十九. 什么时候失效的数据项会从缓存中删除
    Haisql_memcache是通过给数据设置过期时间,来管理缓存的数据,当检测到数据过期时,即数据老化,会自动删除这些老化了的数据,从而来管理数据库内部存储的数据,在重启电脑时,也会删除缓存的的数据。    
三十. 在设计应用时,可以通过haisql_Memcache缓存些内容?
    1) 缓存简单的查询结果:查询缓存存储了给定查询语句对应的整个结果集,最合适缓存那些经常被用到,但不会改变的 SQL 语句对查询到的结果集,比如载入特定的过滤内容。
    2) 缓存简单的基于行的查询结果:基于行的缓存会检查缓存数据key的列表,那些在缓存中的行可以直接被取出,不在缓存中的行将会从数据库中取出并以唯一的键为标识缓存起来,最后加入到最终的数据集中返回。随着时间的推移,大多数数据都会被缓存,这也意味着相比与数据库,查询语句会更多地从 haisql_memcache中得到数据行。如果数据是相当静态的,我们可以设置一个较长的缓存时间.
    3) 缓存的不只是 SQL 数据,可以缓存最终完成的部分显示页面,以节省CPU计算时间,例如:
    例如正在制作一张显示用户信息的页面,你可能得到一段关于用户的信息(姓名,生日,家庭住址,简介),然后你可能会将XML格式的简介信息转化为 HTML 格式或做其他的一些工作。相比单独存储这些属性,你可能更愿意存储经过渲染的数据块。那时你就可以简单地取出被预处理后的 HTML 直接填充在页面中,这样节省了宝贵的 CPU 时间.
三十一. 使用分层的缓存
Haisql_memcache 可以高速处理大量的缓存数据,但是还是要根据系统的情况考虑维护多层的缓存结构。例如除了Haisql_memcache缓存之外,还可以通过本地缓存(如ehcache、oscache等)建立起多级缓存。例如,可以采用本地缓存缓存一些基本数据,例如少量但访问频繁的数据(如产品分类,连接信息,服务器状态变量,应用配置变量等),缓存这些数据并让他们尽可能的接近处理器是有意义的 , 这样可以帮助减少生成页面的时间,并且在 Haisql_memcache 失效的情况下可以增加可靠性。
三十二. 当数据更新时需要更新缓存
    用户编辑了自己的信息,当保存信息到数据库时,需要更新缓存中的数据或是简单地删除老的数据。如果马上更新数据,要防止从数据库读取那些刚刚更新过的数据。当用户习惯性地重新载入自己的用户信息来确认是否修改成功时,数据将从缓存中直接取出,这时他们获得了最新的数据.
三十三. 怎样理解“并发数量无上限”?
    "并发数量无上限"主要是由网络层的架构比较先进,不是过去那种每个连接1个线程,然后一般不超1000--几千个线程,连接数受限于线程数的模型。我们的网络层架构是属于比较新的 N个线程:M个连接的架构,网络层工作线程数量=CPU数量,每个线程处理多个连接,这样在高并发的情况下,基本没有线程切换的开销,每个CPU都能跑到最大效能。这种网络层架构下,服务器可以接受的最大并发数量理论上只受限于内存的数量,即使同时并发上万个连接,也会有比较好的性能。
    Haisql_memcache在普通4核8线程3.4G主频CPU下,网络层每秒新建连接的能力大约是 每秒新建4万个连接, 每秒Echo Server包转发能力超过百万QPS, 测试工具是ab(apache benmark), 这个性能指标是超越Apache http和Nginx的。
三十四. 不需要预热缓存
    haisql_Memcache不需要进行预热缓存,当电脑突然断电或关闭服务器时,所有的数据会自动保存到硬件上,当服务器启动时,会自动加载所有数据,所以不需要进行预热缓存。
三十五. Value的组织问题?
    主要涉及被缓存的数据的颗粒度,比如要保存一个数据表,是一行数据保存在一个键值还是统一保存为一个键值。如果数据保存的粒度很小的话最好是在获取的时候能够批量获取,在保存的时候也能够批量保存,也就是说对于跨网络的调用次数越少越好。
三十六. 缓存更新策略
    缓存里的数据是根据过期时间来判断是否失效的。当有数据更新的时候,客户端先查询haisql_memcache,如果命中,返回结果,如果没命中(没有数据或者数据已经过期),则从数据库中加载最新数据,并写回到haisql_memcache中,最后返回结果。
三十七.haisql_memcache的单个套接字连续读写次数该如何设置
    haisql_memcache的单个套接字连续读写次数最大为65535,如果为了降低时延,可适当减小单个套接字的连续读写次数;如果为了追求性能,可适当增加单个套接字的连续读写次数,当设置为200时,性能达到最大。

下载地址:

  • 本地下载
  •  
     上一篇:haisql_memcache_1.0.35性能测试报告
     下一篇:网页加速必备高性能数据库HaiSQL_memcache介绍
    咨询热线:13999268016
    地址:新疆维吾尔自治区乌鲁木齐市水磨沟区南湖东路77号新疆上海科技合作基地八层801室 固话:6583723
    返回首页 | 网站地图 | 联系我们
    技术支持:创世网络
    乌鲁木齐云山云海信息技术有限责任公司 版权所有 备案号:新ICP备17001390号
    新公网安备 65010502000200号
    网站访问人数: