发表于: 2020-09-03 21:49:18
1 1301
memcached缓存工具
Memcached是一款开源、高性能、分布式内存对象缓存系统,可应用各种需要缓存的场景,其主要目的是通过降低对Database的访问来加速web应用程序。它是一个基于内存的“键值对”存储,用于存储数据库调用、API调用或页面引用结果的直接数据,如字符串、对象等。
- memcached分为俩部分
- (1)独立运行的memcached服务实例
- (2)用于访问这些服务实例的客户端
服务实例会消耗非常少的CPU ,但会占用大量的内存。
客户端和实例的关系
在需要访问具有特定键值的数据时,该客户端内部会根据所需要读取的数据的键值,如“foo”,以及当前Memcached缓存服务的配置来计算相应的哈希值,以决定到底是哪个Memcached实例记录了用户所需要访问的信息。在决定记录了所需要信息的Memcached实例之后, Memcached客户端将从配置中读取该Memcached服务实例所在地址,并向该Memcached实例发送数据访问请求,以从该Memcached实例中读取具有键值“foo”的信息。在各个论坛的讨论中,这被称为是Memcached的两阶段哈希(Two-stage hash)
而对数据的记录也使用了类似的流程:假设用户希望通过服务端缓存记录数据“bar”,并为其指定键值“foo”。那么Memcached客户端将首先对用户所赋予的键值“foo”及当前服务端缓存所记录的可用服务实例个数执行哈希计算,并根据哈希计算结果来决定存储该数据的Memcached服务实例。接下来,客户端就会向该实例发送请求,以在其中记录具有键值“foo”的数据“bar”。
这样做的好处则在于,每个Memcached服务实例都是独立的,而彼此之间并没有任何交互。在这种情况下,我们可以省略很多复杂的功能逻辑,如各个节点之间的数据同步以及结点之间消息的广播等等。这种轻量级的架构可以简化很多操作。如在一个节点失效的时候,我们仅仅需要使用一个新的Memcached节点替代老节点即可。而在对缓存进行扩容的时候,我们也只需要添加额外的服务并修改客户端配置。
这些记录在服务端缓存中的数据是全局可见的。也就是说,一旦在Memcached服务端缓存中成功添加了一 条新的记录,那么其它使用该缓存服务的应用实例将同样可以访问该记录。
在Memcached中,每条记录都由四部分组成:记录的键,有效期,一系列可选的标记以及表示记录内容的数据。由于记录内容的数据中并不包含任何数据结构,因此我们在Memcached中所记录的数据需要是经过序列化之后的表示
然后按 ctrl+] 进入回显
然后再按下回车 进入输入页面
set语法说明
value
语法详解:
value:存储的值(始终位于第二行)(可直接理解为key-value结构中的value)
其他命令:
Memcached add 命令用于将 value(数据值) 存储在指定的 key(键) 中。
如果 add 的 key 已经存在,则不会更新数据(过期的 key 会更新),之前的值将仍然保持相同,并且您将获得响应 NOT_STORED。
Memcached replace 命令用于替换已存在的 key(键) 的 value(数据值)。
如果 key 不存在,则替换失败,并且您将获得响应 NOT_STORED。
Memcached append 命令用于向已存在 key(键) 的 value(数据值) 后面追加数据 。
Memcached prepend 命令用于向已存在 key(键) 的 value(数据值) 前面追加数据 。
memcached.properties文件
#服务器地址
memcache.server=127.0.0.1:11211
#初始连接数
memcache.initConn=20
memcache.minConn=10
memcache.maxConn=50
#设置连接池维护线程的睡眠时间(3s)
memcache.maintSleep=3000
#设置是否使用Nagle算法(Socket的参数),如果是true在写数据时不缓冲,立即发送出去
memcache.nagle=false
#设置socket的读取等待超时时间(3s)
memcache.socketTO=3000
spring配置文件添加
<!--spring 集成缓存服务器(memcached) -->
<bean id="memcachedPool" class="com.danga.MemCached.SockIOPool"
factory-method="getInstance" init-method="initialize"
destroy-method="shutDown">
<constructor-arg>
<value>memCachedPool</value>
</constructor-arg>
<property name="servers">
<list>
<value>${memcache.server}</value>
</list>
</property>
<property name="initConn">
<value>${memcache.initConn}</value>
</property>
<property name="minConn">
<value>${memcache.minConn}</value>
</property>
<property name="maxConn">
<value>${memcache.maxConn}</value>
</property>
<property name="maintSleep">
<value>${memcache.maintSleep}</value>
</property>
<property name="nagle">
<value>${memcache.nagle}</value>
</property>
<property name="socketTO">
<value>${memcache.socketTO}</value>
</property>
</bean>
<bean id="memCachedClient" class="com.danga.MemCached.MemCachedClient">
<constructor-arg>
<value>memCachedPool</value>
</constructor-arg>
</bean>
</beans>
测试
@Controller
public class MemcachedController {
@Autowired
private MemCachedClient memCachedClient;
@RequestMapping("/memcached")
public void setMemcachedServer(){
Boolean target=memCachedClient.set("1", "123456");
System.out.println("memcached 加载是否成功:"+target);
String result =(String)memCachedClient.get("1");
System.out.println("memcached 获取的结果:"+result);
memCachedClient.delete("1");
}
}
跑一下 测试成功
明天计划的事情:
任务6
今日问题 暂无
评论