我們利用java把數據寫入然後利用php讀出,但這樣利用php讀出時發現了在memcache亂碼問題出來了,下面我來給大家介紹memcache亂碼的解決辦法。
java讀取php寫入memcache內容
故事背景:我用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();
}
}
}