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 密码
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',
];
connect('127.0.0.1', 6379);
$redis->auth('密码');
//检查是否还再链接
$redis->ping();
//写入,存在会被覆盖
$redis->set("key", "value");
//读取
$redis->get("key");
//删除
$redis->del('teacher_1');
//释放资源
$redis->close();
?>
//判断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);
//选择数据库,默认第0个,默认共有16个数据库(0~15)
$redis->select(5);
//将key从当前数据库移动到指定数据库
$redis->move('age',1);
//删除当前数据库的所有key
$redis->flushdb();
//删除所有数据库的所有key
$redis->flushall();
创建
//设置单个key
$redis->set("key", "value");
#第3个参数:
#10 – 设置键key的过期时间,10秒
#NX – 只有键key不存在的时候才会设置key的值
#XX – 只有键key存在的时候才会设置key的值
//一次性设置多个key
$redis->mset([
'name'=>'小明',
'age'=>'13',
'sex'=>'男'
]);
获取
//一次性获取多个key,返回索引数组
$redis->mget(['name','age','sex']);
//获取指定key值的索引开始位置和结束位置所对应的值,索引从0开始
$redis->getrange('key',1,2)
追加
//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');
创建
//从列表左边放入一个或者多个元素,不存在创建
$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');
创建
//单个设置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');
创建
//添加一个或多个元素到集合中
$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');
创建
//元素已存在,会更新排序值(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');
(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 会查看当前服务器状态,如果状态良好,就进行备份(随机)。这种备份方式数据是没有保证的。
注:对比下来,性能:alwayseverysec>no。
作用:
为了降低每个redis服务器的负载,可以设置几个,并做主从模式
一个服务器负载“写”数据(主服务器),其他服务器负载“读”数据(从服务器)
主服务器数据会自动同步数据给从服务器
连接
修改redis.windows.conf配置文件
slaveof 主服务器ip 端口号 #成为谁的从服务器
slave-read-only yes #是否只读,默认只读