故事背景:我用java插入一條數字記錄,用php讀取無法正確讀取,今天發現如果使用MemCachedClient來插入一條數字,或者java的對象,那么在php調出來就是亂碼,對象可以理解,簡單的數字也會亂碼,如:mcc.set("a",25);php中出來的是亂碼,同時如果采用telnet的方式來進行查詢 get a 出來問號。
翻了一圈說要改類包,最后發現個問題,如果改用字符串,那么java和php就能通用了,代碼如下:mcc.set("a","25″);
而且telnet 192.168.0.1 11211進入進行get也能得出正確的數字了,本來我要對a這個值進行加法運算,覺得采用int會方便一些,居然和php讀取memcache的時候有沖突。還是來回進行變量類型轉換吧。
如果你也在使用java寫入memcache,php讀出memcache,通用一個字符串存儲,就可以避免很多問題了,不是java的類包不行。
java讀取php寫入memcache內容
當前需求:php將key為"my_key",value為"my_value"寫入到memcache中,然后用java連接memcache讀取my_key的值my_value,php端的代碼為:
- <?php
- $mem=new Memcache;
- $mem->connect("192.168.1.20",27688);
- $mem->set("my_key","my_value",FALSE , 86400);
- $my_v=$mem->get("my_key");
- var_dump($my_v);
- $mem->close();
- ?>
經檢測,php寫入后,用php和在memcache命令行都能獲取的很好,但是,用下面的java代碼獲取,卻獲取到null
- import com.danga.MemCached.MemCachedClient;
- import com.danga.MemCached.SockIOPool;
- public class CacheReader {
- static private MemCachedClient client =new MemCachedClient();
- static{
- String[] servers = { "192.168.1.20:27688"};
- SockIOPool pool = SockIOPool.getInstance();
- pool.setServers(servers);
- pool.initialize();
- }
- public void get(String name){
- System.out.println(client.get(name));
- }
- public static void main(String[] args) {
- new CacheReader().get("my_key");
- }
- }
一開始,我還以為是我的編碼的問題,或者是某些參數設置的問題。后來,我想可能是各種memcache的客戶端的尋址方式不太一樣吧。幾經周折,還是間接的解決了這個問題:我更換了java端的memcache的客戶端,采用net.spy.memcached.MemcachedClient就可以了,代碼如下:
- import java.io.IOException;
- import java.net.InetSocketAddress;
- import net.spy.memcached.MemcachedClient;
- public class SpyMem {
- public static void main(String[] args) {
- try {
- MemcachedClient c=new MemcachedClient(new InetSocketAddress("192.168.1.20",27688));
- System.out.println(c.get("my_key"));
- c.shutdown();
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- }
新聞熱點
疑難解答