php操作redis

  • Post author:
  • Post category:php


1.文件说明

redis-cli.exe               # 客户端
redis-server.exe            # 服务器
redis.windows.conf          # 配置文件

2.什么是redis

redis是一款内存高速的缓存数据库

3.缓存

数据缓存(redis,memcache)	用于经常要变化的地方		如:商品的推荐
页面缓存(smarty)			用于不经常发生变化的地方	如:新闻消息页面

4.redis和memcache比较

(1)redis不仅仅支持简单的k/v类型的数据,同时还提供string,list,set,zset,hash等数据结构的存储
(2)redis支持master-slave(主一从)模型应用
(3)redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用,
	MemCached不支持数据持久化,断电或重启后数据消失
(4)redis单个value最大限制1GB,memcache只能保存1MB的数据
(5)如果redis只使用string类型,redis就可以被看作加上持久化特性的memcache
(6)memcache是多线程的(这是memcache优势之一),也就意味着阻塞情况少,而redis是单线程的,阻塞情况相对较多

5.redis里面只放mysql里使用频繁,用户操作量较大的数据,或者用户近期使用的数据

(1)读取数据的时候先从redis里面查,若没有,再去数据库查,同时写到redis里面,并且要设置失效时间。 
(2)存数据的时候要具体情况具体分析,可以选择同时插到数据库和redis(要是存放到redis中,最好设置失效时间)。

6.cmd操作redis

输入redis-cli
输入auth 密码



7.各种数据类型的解释

string
	字符串
	$a='123';
list
	列表
	$a=['1','2','3'];
set
	无序的集合。集合成员是唯一的,这就意味着集合中不能出现重复的数据。
	$a=['1','2','3'];
zset
	有序的集合,且不允许重复的成员。
	$a=['1','2','3'];
hash
	适合用于存储对象
	$hash=[
			'a'=>'1',
			'b'=>'2',
			'c'=>'3',
		];



8.php对redis的基本操作

<?php
   	$redis = new Redis();
   	//连接
   	$redis->connect('127.0.0.1', 6379);
   	$redis->auth('密码');
   	//检查是否还再链接	   
	$redis->ping();
   	//写入,存在会被覆盖
   	$redis->set("key", "value");
   	//读取
   	$redis->get("key");
   	//删除
   	$redis->del('teacher_1');
   	//释放资源
   	$redis->close();
?>



9.对key的基本常用操作

//判断name是否存在,存在返回true
$redis->exists('name')

//匹配所有key,返回key名数组
$redis->keys('*')

//匹配a开头的key
$redis->keys('a*')

//同时删除多个key,返回变化的数据条数
$redis->del('name','age');

//改key名字,name改成name1
$redis->rename('name','name1')

//获取当前数据库key的数量
$redis->dbsize()

//获取key的剩余过期时间,单位秒
$redis->ttl('sex');

//设置key的过期时间,默认-1表示永不过期,-2表示已经过期,单位秒
$redis->expire('sex',10);

//取消有效期,变为永久存储
$redis->persist("fool");

//选择数据库,默认第0,默认共有16个数据库(0~15$redis->select(5);

//将key从当前数据库移动到指定数据库
$redis->move('age',1);

//删除当前数据库的所有key
$redis->flushdb();

//删除所有数据库的所有key
$redis->flushall();

//type 类型检测,字符串返回 string ,列表返回 list , set表返回 set/zset ,hash表返回 hash
$redis->type('foo');



10.对string数据的操作

创建

//设置单个key
$redis->set("key", "value");
	#第3个参数:
	#10 – 设置键key的过期时间,10秒,会重定向,并实际调用SETEX
	例:$redis->set('key','value', 10);
	
	#NX – 只有键key不存在的时候才会设置key的值	
	例:$redis->set('key', 'value', ['nx', 'ex' => 10]);	如果该键不存在,设置该键,过期时间为10#XX – 只有键key存在的时候才会设置key的值 
	例:$redis->set('key', 'value', ['xx', 'px' => 1000]); 	如果它存在,设置一个键,过期时间为1000毫秒
	
//一次性设置多个key
$redis->mset([
	'name'=>'小明',
	'age'=>'13',
	'sex'=>'男'
]);	

//setex 存放带存储时效的记录
$redis->setex("library" , 10 , 'phpredis');  //存储key为library,值为phpredis的记录,有效时长为10秒

//add操作,不会覆盖已有值
$redis->setnx("foo" , 12); //返回true, 添加成功  存在不做任何操作  否则创建
$redis->setnx('foo' , 34); //返回false ,添加失败,因为存在键名foo的记录

//getset 是 set的变种,结果返回替换前的值
$redis->setnx("foo" , 12);
$redis->getset('foo' , 56);//返回12;如果之前不存在记录,则返回null

获取

//获取key为library得记录值
$redis->get("library");

//一次性获取多个key,返回索引数组
$redis->mget(['name','age','sex']);

//获取指定key值的索引开始位置和结束位置所对应的值,索引从0开始
$redis->getrange('key',1,2)

//randomkey  随机返回一个key
 $redis->randomkey(); //可能是返回‘foo1’ 或者是foo2 及其它任何已存在的key

追加

//key已经存在,且值为字符串,会把 value 追加到原来值(value)的结尾。 如果 key 不存在,创建
$redis->append('key','value');

//数字类型的key自减操作,key类型不是数字则报错 ,返回结果
$redis->decr('number');

//数字类型的key自加操作,与DECR相反
$redis->incr('number');

//数字类型key指定减少数值
$redis->decrby('number',10);//每次减10

//数字类型key指定增加数值,与DECRBY相反
$redis->incrby('number',10);

//获取key值的长度
$redis->strlen('key');



11.对list数据的操作

创建

//从列表左边放入一个或者多个元素,不存在创建
$redis->lpush('list','值1');

//当列表存在时,从左边放入一个元素,不存在时报错
$redis->lpushx('list','值2');

//从列表右边放入一个或者多个元素,不存在创建
$redis->rpush('list','值1');

//当列表存在时,从右边放入一个元素,不存在时报错
$redis->rpushx('list','值2');

获取

//根据索引获取列表中的元素,列表索引最后一个可以使用-1
(1)$redis->lrange('list',0,-1);
(2)$redis->lgetrange('list',0,-1)

//根据列表索引获取值
(1)$redis->lindex('list',0);
(2)$redis->lget('list',0);

修改

//根据索引设置列表中元素的值,当list不存在时报错
$redis->lset('list',0,'新值');	

删除

//从列表左边删除一个元素
$redis->lpop('list');

//从列表右边删除一个元素
$redis->rpop('list');

//从list列表里移除前 2(count)次出现的值为 value 的元素
$redis->lremove('list','value',2);
	#count > 0: 从头往尾移除值为 value 的元素
	#count < 0: 从尾往头移除值为 value 的元素
	#count = 0: 移除所有值为 value 的元素
	
//删除list列表右边的最后一个元素将其追加到list1列表,list1不存在会创建
$redis->rpoplpush('list','list1');

//根据索引start和stop保留列表元素,其他元素全删除
$redis->ltrim('list',1,2);

//获取列表长度
$redis->llen('list');



12.对hash数据的操作

创建

//单个设置hash内容,字段已存在会覆盖
$redis->hset('hash','a','value');
//只有当字段不存在时候才设置hash表中字段值
$redis->hsetnx('hash','a','value');
//批量设置hash内容
$redis->hmset('hash',
[
	'a'=>12,
	'b'=>2,
	'c'=>3
]);

获取

//获取hash指定字段的值
$redis->hget('hash','a');

//批量获取
$redis->hmget('hash',['a','b','c']);

//获取全部
$redis->hgetall('hash');

//获取hash表中所有字段的值
$redis->hvals('hash');

//获取hash表中所有的字段
$redis->hkeys('hash');

删除

$redis->hdel('hash','a');

//判断hash指定字段的值是否存在
$redis->hexists('hash','a');

//获取hash表中字段个数
$redis->hlen('hash');



13.对set数据的操作

创建

//添加一个或多个元素到集合中
$redis->sadd('set','a','b');

获取

//返回集合中所有的元素
$redis->smembers('set');

//获取两个或两个以上集合的交集
$redis->sinter('set','set1','set2');

//获取两个或两个以上集合的并集
$redis->sunion('set','set1','set2');

//获取两个或者两个以上集合的差集
$redis->sdiff('set','set1','set2');

删除

//删除一个或多个集合中的元素
$redis->srem('set','a','b');

// 随机移除一个元素,并返回移除的元素
$redis->spop('set');

//将set的一个元素(a)移动到set1集合中去
$redis->smove('set','set1','a');

//判断元素是否是在指定集合中
$redis->sismember('set','a');



14.对zset数据的操作

创建

//元素已存在,会更新排序值(score)
var_dump($redis->zadd('zset',10,'a'));

获取

//根据开始结束索引获取集合中的元素,-1表示最后一个,排序值越大的越靠后,如果相等,则后添加的靠后
$redis->zrange('zset',0,-1);
//反转排序,与zrange效果相反
$redis->zrevrange('zset',0,-1);
//获取指定元素(a)的索引(下标)
$redis->zrank('zset','a');
//获取指定元素(a)的排序值
$redis->zscore('zset','a');
//获取有序集合中元素个数
$redis->zcard('zset');
//获取指定范围的元素个数
$redis->zcount('zset',min,max);

删除

//删除有序集合中一个或多个元素,删除ab元素
$redis->zrem('zset','a','b');

修改

//为有序集的元素(a)的排序值增加2
	$redis->zincrby('zset',2,'a');



15.持久化

(1)快照
	特点:
		快照是一次全量备份,快照是内存数据的二进制序列化形式,在存储上非常紧凑
	持久化默认开启,配置文件redis.windows.conf
		//指定生成的文件名
		dbfilename dump.rdb
		//指定保存路径
		dir ./
		备份频率
		save 900 1             	#900 秒内如果超过 1 个 key 被修改,则发起快照保存
		save 300 10            	#300秒超过10个key被修改,发起快照
		save 60 10000           #60秒超过10000个key被修改,发起快照
	如果发现dump.rdb文件缺少了最近的记录,那么在这补充一种手动持久化方式,可以立即看到效果,执行此命令
		#./redis-cli bgsave          #异步保存
 	一些其他的手动命令
		#./redis-cli shutdown    	#同步保存到服务器并关闭redis服务器
		#./redis-cli lastsave    	#返回上次成功保存到磁盘的unix时间戳
		#./redis-cli bgrewriteaof  	#当日志文件过长时优化AOF日志文件存储
(2)AOF日志
	特点:
		AOF日志是连续的增量备份,AOF日志记录的是内存数据修改的指令记录文本。
		AOF日志在长期的运行过程中会 变的无比庞大,数据库重启时需要加载 AOF 日志进行指令重放,这个时间就会无比漫长。
		所以需要定期进行 AOF重写,给 AOF日志进行瘦身。
	本质:
		把用户执行的每个指令备份到文件中,还原数据时,就是执行具体指令的过程
	开启AOF持久化(会清空redis内部的数据,最好在redis使用之前就开启它)
		修改redis.windows.conf配置文件
			appendonly yes					#改为yes
			appendfilename "appendonly.aof"	#保存的文件名
		修改完成配置之后重启redis(linux中)
			#kill -9 65261
			#ps -A | grep redis
		在redis.conf中,可以调整AOF备份形式:
			appendfsync everysec
				参数解释:
					always          一写指令就备份一次。这样做虽然安全,但是系统性能会降低。不推荐使用
					everysec        每一秒中备份一次。不管一秒钟变化了多少key,只备份一次,性能得到一定的保护。推荐使用。
					no            	会查看当前服务器状态,如果状态良好,就进行备份(随机)。这种备份方式数据是没有保证的。
					注:对比下来,性能:always<everysec<no,而数据安全:always>everysec>no。



16.主从模式

作用:
	为了降低每个redis服务器的负载,可以设置几个,并做主从模式
	一个服务器负载“写”数据(主服务器),其他服务器负载“读”数据(从服务器)
	主服务器数据会自动同步数据给从服务器
连接
	修改redis.windows.conf配置文件
		slaveof 主服务器ip 端口号	#成为谁的从服务器
		slave-read-only yes		#是否只读,默认只读	



如果您觉得本篇内容不错,可以点个关注,给个赞



版权声明:本文为qq_36303853原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。