PHP+memcache的简单使用

初始化一个Memcache的对象:
$mem = new Memcache;

连接到我们的Memcache服务器端,第一个参数是服务器的IP地址,也可以是主机名,第二个参数是Memcache的开放的端口:
$mem->connect(“192.168.0.200”12000);

保存一个数据到Memcache服务器上,第一个参数是数据的key,用来定位一个数据,第二个参数是需要保存的数据内容,这里是一个字符串,第三个参数是一个标记,一般设置为0或者MEMCACHE_COMPRESSED就行了,第四个参数是数据的有效期,就是说数据在这个时间内是有效的,如果过去这个时间,那么会被Memcache服务器端清除掉这个数据,单位是秒,如果设置为0,则是永远有效,我们这里设置了60,就是一分钟有效时间:
$mem->set(‘key1‘, ‘This is first value’060);

从Memcache服务器端获取一条数据,它只有一个参数,就是需要获取数据的key,我们这里是上一步设置的key1,现在获取这个数据后输出输出:
$val = $mem->get(‘key1′);
echo “Get key1 value: “ . $val;

现在是使用replace方法来替换掉上面key1的值,replace方法的参数跟set是一样的,不过第一个参数key1是必须是要替换数据内容的key,最后输出了:
$mem->replace(‘key1’‘This is replace value’060);
$val = $mem->get(‘key1’);
echo “Get key1 value: ” . $val;

同样的,Memcache也是可以保存数组的,下面是在Memcache上面保存了一个数组,然后获取回来并输出
$arr = array(‘aaa’, ‘bbb’, ‘ccc’‘ddd’);
$mem->set(‘key2’$arr060);
$val2 = $mem->get(‘key2’);
print_r($val2);

现在删除一个数据,使用delte接口,参数就是一个key,然后就能够把Memcache服务器这个key的数据删除,最后输出的时候没有结果
$mem->delete(‘key1’);
$val = $mem->get(‘key1’);
echo “Get key1 value: ” . $val . “<br>”;

最后我们把所有的保存在Memcache服务器上的数据都清除,会发现数据都没有了,最后输出key2的数据为空,最后关闭连接
$mem->flush();
$val2 = $mem->get(‘key2’);
echo “Get key2 value: “;
print_r($val2);
echo “<br>”;

更多内容参考:http://us1.php.net/memcache

memcache和redis的区别

1、Redis和Memcache都是将数据存放在内存中,都是内存数据库。不过memcache还可用于缓存其他东西,例如图片、视频等等

2、数据类型–Memcache在添加数据时就要指定数据的字节长度

3、mecache完全内存存储,redis可以实现持久存储

4、Redis不仅仅支持简单的k/v类型的数据,同时还提供list,set,hash等数据结构的存储;Memcached只是简单的K/V缓存

5、灾难恢复–memcache挂掉后,数据不可恢复; redis数据丢失后可以通过aof恢复

 

empty(),isset(), is_null()区别

empty
如果 变量 是非空或非零的值,则 empty() 返回 FALSE。换句话说,、0、0、NULL、FALSE、array()、var $var、未定义; 以及没有任何属性的对象都将被认为是空的,如果 var 为空,则返回 TRUE。

isset
如果 变量 存在(非NULL)则返回 TRUE,否则返回 FALSE(包括未定义)。变量值设置为:null,返回也是false;unset一个变量后,变量被取消了。注意,isset对于NULL值变量,特殊处理。

is_null
检测传入值【值,变量,表达式】是否是null,只有一个变量定义了,且它的值是null,它才返回TRUE . 其它都返回 FALSE

代码片段:

 

php
$a;
$b = false;
$c = '';
$d = 0;
$e = null;
$f = array();
var_dump(empty($a));//true
var_dump(empty($b));//true
var_dump(empty($c));//true
var_dump(empty($d));//true
var_dump(empty($e));//true
var_dump(empty($f));//true

var_dump(isset($a));//false
var_dump(isset($b));//true
var_dump(isset($c));//true
var_dump(isset($d));//true
var_dump(isset($e));//false
var_dump(isset($f));//true

var_dump(is_null($a));//true
var_dump(is_null($b));//false
var_dump(is_null($c));//false
var_dump(is_null($d));//false
var_dump(is_null($e));//true
var_dump(is_null($f));//false

哈希算法

哈希算法将任意长度的二进制值映射为较短的固定长度的二进制值,这个小的二进制值称为哈希值。哈希值是一段数据唯一且极其紧凑的数值表示形式。

通常用于加密和查找

加密使用小例子:

比如我们在php中传递参数a=12,b=’str’,c=14;我们需要进行参数加密,可以使用md5(‘a=12&b=str&c=14’)

很多公司使用这样的算法进行加密,比如微信的公共平台中就用到了:http://blog.phpfs.com/archives/1511.html

PHP底层的运行机制和原理[转]

本文转自:http://www.nowamagic.net/librarys/veda/detail/102

PHP说简单,但是要精通也不是一件简单的事。我们除了会使用之外,还得知道它底层的工作原理。

PHP是一种适用于web开发的动态语言。具体点说,就是一个用C语言实现包含大量组件的软件框架。更狭义点看,可以把它认为是一个强大的UI框架。

了解PHP底层实现的目的是什么?动态语言要像用好首先得了解它,内存管理、框架模型值得我们借鉴,通过扩展开发实现更多更强大的功能,优化我们程序的性能。

Continue reading

PHP的各种缓存手段介绍[转]

WEB程序获取信息的方式主要是查询数据库,当数据库不是很大的情况下不会有太大的问题。然而,随着网站的发展,数据库呈几何级数的方式增长的时候,就会出现瓶颈,于是PHP缓存技术诞生了。PHP缓存技术工作时,当程序查询数据的时候,会把相应的结果序列化后保存到文件中,以后同样的查询语句就可以不用直接查询数据库,而是从缓存文件中获得。这一改进使得程序运行速度得以太幅度提升。

php缓存技术的应用时相当普遍的,也许有些人还对这项技术不太了解,我们现在就为大家详细的介绍一下PHP缓存技术的相关应用技巧。

在大部份情况下我们的网站都会使用数据库作为站点数据存储的容器。当你执行一个SQL查询时,典型的处理过程是:连接数据库->准备SQL查询->发送查询到数据库->取得数据库返回结果->关闭数据库连接。但数据库中有些数据是完全静态的或不太经常变动的,缓存系统会通过 把SQL查询的结果缓存到一个更快的存储系统中存储,从而避免频繁操作数据库而很大程度上提高了程序执行时间,而且缓存查询结果也允许你后期处理。

Continue reading

Java基础语法

Java两种循环
List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();
for (int i = 0; i < 5; i++) {
Map<String, Object> m = new HashMap<String, Object>();
m.put(“name”, “Text” + i);
m.put(“icon”, R.drawable.f001);
m.put(“but”, “Button” + i);
list.add(m);
}
for (int j = 0; j < list.size(); ++j) {
Log.w(“Name”, list.get(j).get(“name”).toString());
}
for (Map<String, Object> obj: list){
Log.w(“But”, obj.get(“but”).toString());
}

Java数组之定义和使用

1、定义
int[] arr = {1,2,3,4};
或者int arr[] = {1,2,3,4};
或者使用int arr[3] = new int[3];//为整形数组分配3个int型整数所所占内存空间

2、使用
arr.length可以获取数组长度
可以使用arr[2]获取数组元素

BaseAdapter简单用法

BaseAdapter就Android应用程序中经常用到的基础数据适配器,它的主要用途是将一组数据传到像ListView、Spinner、Gallery及GridView等UI显示组件,它是继承自接口类Adapter.

例子:自定义列表适配器

MyListAdapter.java代码

package com.example.baseadapter;

import java.util.List;
import java.util.Map;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.TextView;

public class MyListAdapter extends BaseAdapter {
	private LayoutInflater inflater = null;
	private Context context = null;
	private List> listdata = null;

	/*
	 * 一行元素
	 */
	public final class ListItem {
		public ImageView icon;
		public TextView name;
		public Button but;
	}

	public MyListAdapter(Context ui, List> listdata) {
		this.context = ui;
		this.inflater = LayoutInflater.from(this.context);
		this.listdata = listdata;
	}

	@Override
	public int getCount() {
		return listdata.size();
	}

	@Override
	public Object getItem(int position) {
		return position;
	}

	@Override
	public long getItemId(int position) {
		return position;
	}

	/*
	 * 这是渲染的重点,包括行内的点击事件也需要在这里定义
	 */
	@Override
	public View getView(int position, View v, ViewGroup parent) {
		// 初始化一行元素,这里也有部分优化
		ListItem listitem = null;
		if (v == null) {
			v = inflater.inflate(R.layout.listitem, null);
			listitem = new ListItem();
			listitem.icon = (ImageView) v
					.findViewById(R.id.image);
			listitem.name = (TextView) v
					.findViewById(R.id.text);
			listitem.but = (Button) v
					.findViewById(R.id.button);
			v.setTag(listitem);
		} else {
			listitem = (ListItem) v.getTag();
		}
		// 填充数据
		listitem.name.setText(listdata.get(position).get("name").toString());
		listitem.but.setText(listdata.get(position).get("but").toString());
		listitem.icon.setImageResource(Integer.parseInt(listdata.get(position).get("icon").toString()));
		return v;
	}

}

BaseActivity.java代码

package com.example.baseadapter;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import android.app.Activity;
import android.os.Bundle;
import android.widget.ListView;

public class BaseActivity extends Activity {

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.baseactivity);
		ListView lv = (ListView) findViewById(R.id.listview1);
        List> list = new ArrayList>();
        for (int i = 0; i < 5; i++) {
            Map m = new HashMap();
            m.put("name", "Text" + i);
            m.put("icon", R.drawable.f001);
            m.put("but", "Button" + i);
            list.add(m);
        }
        MyListAdapter adapter = new MyListAdapter(
        		this,//listview的运行环境界面上下文
        		list
        		);
        lv.setAdapter(adapter);
	}

}

baseactivity.xml代码


    

listitem.xml代码


    
    
    

SimpleAdapter简单用法

官方文档:

这是一个简单的适配器,可以将静态数据映射到XML文件中定义好的视图.
你可以将 Maps 的 ArrayList 指定为用于列表的数据.
ArrayList 中的每一项对应列表中的一行. Maps 中包含用于一行的数据.
你也可以指定 XML 文件,其中定义了用于显示行的视图,
通过 Map 的关键字映射到指定的视图.绑定数据到视图分两个阶段.
首先,如果 SimpleAdapter.ViewBinder 是有效的,则调用 setViewValue(android.view.View, Object, String) 方法.
如果返回值为真,则执行绑定.如果返回值为假,则按以下顺序绑定视图:实现了 Checkable 的视图(例如 CheckBox),期望绑定值是布尔类型.
TextView,期望绑定值是字符串类型,通过调用 setViewText(TextView, String) 绑定.
ImageView,期望绑定值是资源 ID 或者一个字符串,通过调用 setViewImage(ImageView, int) 或 setViewImage(ImageView, String)绑定.
如果没有合适的绑定发生,将会抛出 IllegalStateException 异常.

Continue reading

ArrayAdapter简单使用

Adapter是Data和View之间的桥梁,一般用在ListView中。
代码:MainActivity

import android.app.Activity;
import android.os.Bundle;
import android.widget.ArrayAdapter;
import android.widget.ListView;

public class MainActivity extends Activity {

	private  String[] words = {"one", "two", "three"};
	private ListView listview;
	private ArrayAdapter mAdapter;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);

		listview = (ListView) findViewById(R.id.listview1);

		mAdapter = new ArrayAdapter(this, R.layout.list_item, words);
		listview.setAdapter(mAdapter);

	}

}

代码:activity_main


    


代码:list_item(注意不能带有其他布局属性,只能有一个TextView节点)