『壹』 java怎么样用memcache缓存一张表的数据
其实就相当于在应用程序和数据库之间开了一块内存区域,将一些高频访问的数版据放在其权中,避免每次都请求数据库。至于之所以用memcached和redis,而不是自己在程序里开个hashmap,是因为这块区域可以共享且容易管理,在集群环境下更方便使用。
有些做法是直接将数据序列化后存在redis的string或是memcached中,也有些其他做法是利用redis特有的数据结构存储一些关系,例如用sorted set存排行榜,string用来计数,set做一些倒排索引、用户好友关系之类的。我觉得这些都可以称之为缓存。
『贰』 java下 iso app登录服务器,如何保持服务器session
app登录服务器Session的保持实现方式:
1 ) 使用Cookie来实现
服务器给每个Session分配一个唯一的jsESSIONID,并通过Cookie发送给客户端。
当客户端发起新的请求的时候,将在Cookie头中携带这个JSESSIONID。这样服务器能够找到这个客户端对应的Session。
2 )使用URL回显来实现
URL回写是指服务器在发送给浏览器页面的所有链接中都携带JSESSIONID的参数,这样客户端点击任何一个链接都会把JSESSIONID带给服务器。
如果直接在浏览器中输入url来请求资源,Session是匹配不到的。
Tomcat对 Session的实现,是一开始同时使用Cookie和URL回写机制,如果发现客户端支持Cookie,就继续使用Cookie,停止使用URL回写。如果发现Cookie被禁用,就一直使用URL回写。jsp开发处理到Session的时候,对页面中的链接记得使用 response.encodeURL() 。
一般手机端与服务器交互没有实现在同一session下:
因为手机端在访问web服务器时,没有给http请求头部设置sessionID,而使用web浏览器作为客户端访问服务器时,在客户端每次发起请求的时候,都会将交互中的sessionID:JSESSIONID设置在Cookie头中携带过去,服务器根据这个sessionID获取对应的Session,而不是重新创建一个新Session(除了这个Session失效)。
『叁』 Java游戏开发要学什么
Java游戏开发要学什么?所谓的游戏开发编程语言其实有很多,基本上任何一种语言都可以作为游戏服务器的编程语言。这需要根据自己游戏的类型和要求加以选择。比如C++,Java,Erlang,go等等。目前我用过的只有C++和Java.但是以Java为主。所以接下来就以自己的经验,谈谈以Java为核心的游戏服务器开发技术体系。
Java目前作为游戏服务器开发语言已经很是普遍。但是大多数是作为页游或手游的服务器,而端游戏一般选择C++,因为端游对服务器的性能要求相对比较高一些。两种语言各有利弊。C++效率高,但是掌握度难些。没有Java易于掌握。而目前对于追求快速上线率的页游和手游来说,Java成了一个不错的选择。
一、Java的技术系统
需要学习的技术:
(1)Java基础知识
(2)JavaNIO编程
(3)Netty,Mina网络框架精通一种,其它作为了解。
(4)一种缓存框架:Redis;memcache熟悉使用一个。
(5)SQL语言,用于数据库:mysql数据库
(6)springmvc主要用于http协议的服务器
(7)多线程编程,明白线程安全的重要性。
(8)Java并发集合的掌握。
(9)linux常用的基本命令及shell脚本。
(10)数据库操作,比如mybatis。
以Java为服务器编程语言来说,掌握Java的基本知识就不必说了,是必不可少的。可以参考《Java编程思想》,《Java核心技术》等书。根据游戏通信协议的不同,大致有两种实现方式:Socket和http。先说简单些的http协议,这个协议已经很成熟的应用到了网站上。而Java语言也可以用于网站开发,所以相当就简单些。现在有很多开源的服务器软件,比如:tomcat,resin等。游戏前端不管是页游flash,还是手游的Android,IOS都支持http协议,只要把游戏的逻辑数据按post方法向服务器发出请求即可了。
二、学习流程
当然了,学习这些东西并不是一蹴而就的。需要根据实践循环渐进,这里推荐一个学习流程:
(1)对于初学Java的人来说,如果自学能力好些,可以买些书自己练习,而现在又更的多选择参加Java培训机构,以快速的掌握Java的知识。
(2)掌握了Java知识之后,要多写代码实践。这个时候可以结合mysql学习SQL语言,掌握数据库的操作。比如用springmvc写一个小网站,用mybatis实现网站数据的增,删,改,查等功能。
(3)完成上步之后,可以在服务器程序和数据库之间加一个缓存,学习redis或memcache。
(4)把程序部署到linux服务器上,练习linux的基本命令及shell脚
免责声明:内容来源于公开网络,若涉及侵权联系尽快删除!
『肆』 java中memcache怎么用
1. memcached client for java客户端API: client for java
引入jar包:java-memcached-2.6.2.jar
package com.pcitc.memcached;
import com.danga.MemCached.*;
public class TestMemcached {
public static void main(String[] args) {
/* 初始化SockIOPool,管理memcached的连接池 */
String[] servers = { "192.168.1.111:11211" };
SockIOPool pool = SockIOPool.getInstance();
pool.setServers(servers);
pool.setFailover(true);
pool.setInitConn(10);
pool.setMinConn(5);
pool.setMaxConn(250);
pool.setMaintSleep(30);
pool.setNagle(false);
pool.setSocketTO(3000);
pool.setAliveCheck(true);
pool.initialize();
/* 建立MemcachedClient实例 */
MemCachedClient memCachedClient = new MemCachedClient();
for (int i = 0; i < 10; i++) {
/* 将对象加入到memcached缓存 */
boolean success = memCachedClient.set("" + i, "Hello!");
/* 从memcached缓存中按key值取对象 */
String result = (String) memCachedClient.get("" + i);
System.out.println(String.format("set( %d ): %s", i, success));
System.out.println(String.format("get( %d ): %s", i, result));
}
}
}
2. spymemcached客户端API:spymemcached client
引入jar包:spymemcached-2.10.3.jar
package com.pcitc.memcached;
import java.net.InetSocketAddress;
import java.util.concurrent.Future;
import net.spy.memcached.MemcachedClient;
public class MClient {
public static void main(String[] args) {
setValue();
getValue();
}
// 用spymemcached将对象存入缓存
public static void setValue() {
try {
/* 建立MemcachedClient 实例,并指定memcached服务的IP地址和端口号 */
MemcachedClient mc = new MemcachedClient(new InetSocketAddress(
"192.168.1.111", 11211));
Future<Boolean> b = null;
/* 将key值,过期时间(秒)和要缓存的对象set到memcached中 */
b = mc.set("neead", 900, "someObject");
if (b.get().booleanValue() == true) {
mc.shutdown();
}
} catch (Exception ex) {
ex.printStackTrace();
}
}
// 用spymemcached从缓存中取得对象
public static void getValue() {
try {
/* 建立MemcachedClient 实例,并指定memcached服务的IP地址和端口号 */
MemcachedClient mc = new MemcachedClient(new InetSocketAddress(
"192.168.1.111", 11211));
/* 按照key值从memcached中查找缓存,不存在则返回null */
Object b = mc.get("neead");
mc.shutdown();
} catch (Exception ex) {
ex.printStackTrace();
}
}
}
3.两种API比较
memcached client for java:较早推出的memcached JAVA客户端API,应用广泛,运行比较稳定。
spymemcached:A simple, asynchronous, single-threaded memcached client written in java. 支持异步,单线程的memcached客户端,用到了java1.5版本的concurrent和nio,存取速度会高于前者,但是稳定性不好,测试中常报timeOut等相关异常。
由于memcached client for java发布了新版本,性能上有所提高,并且运行稳定,所以建议使用memcached client for java
『伍』 php java 使用memcache 有何不同
通过telnet memcache服务及memcache协议发现flag不一致,进一步分析源码,得到以下不同:
.NET
internal enum SerializedType : ushort
{
ByteArray = 0,
Object = 1,
String = 2,
Datetime = 3,
Bool = 4,
//SByte = 5, //Makes no sense.
Byte = 6,
Short = 7,
UShort = 8,
Int = 9,
UInt = 10,
Long = 11,
ULong = 12,
Float = 13,
Double = 14,
CompressedByteArray = 255,
CompressedObject = 256,
CompressedString = 257,
}
JAVA:
public static final int MARKER_BYTE = 1;
public static final int MARKER_BOOLEAN = 8192;
public static final int MARKER_INTEGER = 4;
public static final int MARKER_LONG = 16384;
public static final int MARKER_CHARACTER = 16;
public static final int MARKER_STRING = 32;
public static final int MARKER_STRINGBUFFER = 64;
public static final int MARKER_FLOAT = 128;
public static final int MARKER_SHORT = 256;
public static final int MARKER_DOUBLE = 512;
public static final int MARKER_DATE = 1024;
public static final int MARKER_STRINGBUILDER = 2048;
public static final int MARKER_BYTEARR = 4096;
public static final int F_COMPRESSED = 2;
public static final int F_SERIALIZED = 8;
修改了.NET中部分flag定义,考虑到每种语言的不同性,所以只保证简单的字符串能够在各语言中通用,把 String = 2,改为 String = 32,
这样也能保证php中没问题。php在$mem->set(key,value,32expire);这个32是必须的(表示字符串)。对象的话可以转为json再存到memcache中去,(这是使用pecl中memcache这个客户端的情况)
另外关于hash算法的,考虑到通用,使用crc32来做hash算法,需要修改ServerPool中
internal ServerPool(string[] hosts) {
List<SocketPool> pools = new List<SocketPool>();
foreach(string host in hosts) {
SocketPool pool = new SocketPool(this, host.Trim());
pools.Add(pool);
}
hostList = pools.ToArray();
}
internal SocketPool GetSocketPool(uint hash) {
if (hostList.Length == 1) {
return hostList[0];
}
return hostList[hash % hostList.Length];
}
及MemcachedClient中hash方法的代码为使用crc32
写到这问题并没有完全解决,当使用http://pecl.php.net/package/memcache做php客户端的情况,这个客户端不支持选择自己需要的hash算法,并且此客户端已经很久没有更新了。
首推使用http://pecl.php.net/package/memcached做php客户端,问题还没完,进过测试发现这样的情况:
java写入,php、.net均可正常读取
.net写入,php、java均可正常读取
php写入,java无法正常读取,.net可正常读取,
分析源代码发现,这个php客户端写入数据的时候,flag总设置为0,没有设置成我们需要的,为了保证三大语言均能正常读取写入,我们可以更改源代码php_memcached.c中的static void php_memc_store_impl(INTERNAL_FUNCTION_PARAMETERS, int op, zend_bool by_key)方法,在switch(op)增加一行代码 flags = 32;这样设置后,phpize、./configure、make、make install。
这样设置有个前提,所有存入memcache中的对象均需序列号,数据读取出来后再反序列化即可,当然,其它简单数据类型也需要转换成字符串才能存入到memcache中去。
『陆』 java web 开发 如何实现 输入密码三次错误 后 锁定账户功能。
锁定是很简单的,只要在用户表中加上失败次数,锁定标志,锁定时间(可选)。专
每次登录时,已属经锁定直接禁止登录。
没有锁定就判定,如果失败就把失败次数+1,如果成功就重新置0。
失败次数+1后判断失败次数是否是3,是3的话将锁定标志置为真,并设上时间。
其实比较烦的是解锁。如果手工解锁还好,在管理员界面修改锁定标志即可。如果要自动解锁。需要定时运行代码,判断是否解锁,这时就需要锁定时间这个字段了。
由于是选择高质量答案,现在才看到题目中有不用数据库和cookie的要求。那么办法就只有使用memcache或静态Map。细节和上面的说法类似,就不细说了。唯一问题memcache不能保证持久性,所以有一定的可能会提前解锁(几率不大)。而静态map可能会被一些优化工具判断为内存泄漏。
『柒』 memcache 用java语言编写客户端 如何在客户端获取所有的value值呢 用stats cachemp只能获取几十条数据
memcache 是一个缓存吧。不是配置到hibernate里。
查询缓存中你使用就行了。不是根据所有的identify 储存的么。
你使用 list() 或者是 iterator();都会获取所有的信息啊。
但是小心出现N+1问题。