Redis基础

过期时间
$now = time();
$over = strtotime(date("y-m-d 23:59:59",$now));
$dif = $over - $now;//秒数
1.访问redis根目录    cd  /usr/local/redis-2.8.19

2.登录redis:redis-cli -h 127.0.0.1 -p 6379

3.查看所有key值:keys *

4.删除指定索引的值:del key

5.清空整个 Redis 服务器的数据:flushall 

6.清空当前库中的所有 key:flushdb 

phpstudy开启redis扩展
如何保证Redis的高并发
redis高并发
如何发现 Redis 热点 Key ,解决方案有哪些?
Redis实现订阅发布与批量发送短信
PHP与Redis,从安装,配置到操作
Redis的各项功能解决了哪些问题?
PHP操作Redis数据库常用方法

image.png

适合场合及其优势

1)[Sort Set]排行榜应用,取top n操作,例如sina微博热门话题
2)[List]获得最新N个数据 或 某个分类的最新数据
3)计数器应用
4)[Set]sns(social network site)获得共同好友
5)[Set]防攻击系统(ip判断)等等
4、与memcache比较说明

redis与memcache比较

(1)数据类型:memcache支持的数据类型就是字符串,redis支持的数据类型有字符串,哈希,链表,集合,有序集合
(2)持久化:memcache数据是存储到内存里面,一旦断电,或重启,则数据丢失。redis数据也是存储到内存里面的,但是可以持久化,周期性的把数据给保存到硬盘里面,导致重启,或断电不会丢失数据。
(3)数据量:memcahce一个键存储的数据最大是1M,而redis的一个键值,存储的最大数据量是1G的数据量

启动-操作

(1)使用vim打开配置文件redis.conf
daemonize yes #---默认值no,该参数用于定制redis服务是否以守护模式运行.改为yes
(2)启动redis服务
语法:命令 配置文件
redis-server(路径) redis.conf(路径)

image.png

查看是否启动成功:启动成功后,默认的端口是6379
netstat –tunpl | grep 6379
(3)客户端连接redis服务
语法: redis-cli -h 主机ip -p端口号
如果是连接到本地,则直接输入连接命令即可。
redis-cli是客户端连接服务器的命令
(4)关闭redis的服务
停止Redis实例
我们可以使用/usr/local/redis/bin/redis-cli shutdown
也可以使用pkill redis-server
killall redis-server

1、字符串(string)

redis的string可以包含任何数据。包括jpg图片或者序列化的对象
单个value值最大上限是1G字节, 如果只用string类型,redis就可以被看作加上持久化特性(服务器重启之后,数据不丢失)的memcache
(1)set
语法:set 键名称 值
注意:重新设置则直接覆盖。
(2)get
获取key对应的string值,如果key不存在返回 nil,
语法:get 键名称

image.png

(3)incr
对key的值做加加操作,,每执行一次值加1,值类型要是数据类型。
语法:incr key
(4)incrby
执行加法的命令,可以指定相加的值,
语法:incrby key 相加的值

2、hash

hash可以用来存储对应的mysql中一行的数据,类似于关联数组
(1)hset
设置哈希里面的field和vlaue的值。

语法: hset 哈希的名称(键名称) field value

image.png

(2)hget
获取哈希里面的field的值

语法:hget 哈希的名称(键名称) 指定的field

注意:user:id:1 名称里面的:符号,就表示一个普通符号,没有任何含义。
(3)hmset
一次性设置多个field和value

语法:hmset 哈希的名称 field1 value1 field2 value2……

image.png

(4)hmget
一次性获取 多个field的value

语法:hmget 哈希的名称 field1 field2…….

image.png

(5)hgetall
获取指定哈希中所有的field和value

语法:hgetall 哈希的名称

image.png

3、链表(list)

list类型其实就是一个双向链表。通过push,pop操作从链表的头部或者尾部添加删除元素。这使得list既可以用作,也可以用作队列
(1)lpush
从链表的头部添加元素

语法:lpush 链表的名称(键的名称) 元素
看下图返回值&注意

(2)lrange
获取链表里面的元素

语法:lragne 链表的名称 开始下标(索引) 结束下标(索引)

image.png

注意:如果开始下标是0结束下标是-1则是返回链表中所有的元素。
注意:链表里面的元素是序号的(从0开始数,从头部开始),类似于索引数组。

(3)rpush
从链表的尾部添加元素

语法: rpush 链表的名称(键的名称) 元素

(4)ltrim
保留指定范围的元素 会改变值

语法:ltrim 链表的名称 开始下标 结束下标

image.png

(5)lpop
从链表的头部删除一个元素返回删除的元素删除元素用

语法:lpop 链表的名称

image.png

4、集合(set)

redis的set是string类型的无序集合
set元素最大可以包含(2的32次方-1)(整型最大值)个元素。
关于set集合类型除了基本的添加、删除操作,其他有用的操作还包含集合的取并集(union),交集(intersection),差集(difference)。通过这些操作可以很容易的实现sns中的好友推荐功能
注意:每个集合中的各个元素不能重复。
(1)sadd
向集合中添加元素

语法:sadd 集合名(键名) 元素名称

image.png

(2)smembers
获取集合中的元素

语法:smembers 集合名

image.png

(3)sdiff
获取集合中的差集(在集合1中存在,不在集合2中存在的元素)

语法:sdiff 集合1 集合2

image.png

(4)sinter
获取交集(在两个集合中都存在的元素)

语法:sinter 集合1 集合2

(5)sunion
并集(两个集合合并后,去掉重复的元素)

语法:sunion 集合1 集合2

(6)scard
获取集合中元素的个数

语法:scard 集合名称

5、(有序集合)zset

(1)zadd
向有序集合中添加元素。如果该元素存在,则更新其顺序。

语法:zadd 集合名 序号(权重) 内容

(2)zrange
(把集合排序后,返回名次[start,stop]的元素
默认是升续排列 Withscores 是把score也打印出来)
按序号升序获取有序集合中的内容,

语法:zrange 集合名称 开始下标 结束下标

(3)zrevrange
按序号降序获取有序集合中的内容。

语法:zrevrange 集合名称 开始下标(索引) 结束下标(索引)

image.png

Redis常用命令

1、键值相关的命令
2、服务器相关命令
(1)keys
返回当前数据库里面的键,可以使用通配符* 表示:任意多个,?任意一个字符

image.png

(2)exists
判断一个键是否存在。

语法:exists 键名称

(3)del
删除指定的键

语法: del 键名称

(4)expire
设置键的有效期

语法:expire key 有效期(秒数)

image.png

(5)ttl
返回一个键剩余的过期时间.
(6)type
返回数据类型

语法:type key

image.png

(7)select
选择数据库,在redis里面默认有0-15号数据库,默认是0号数据库,
可以通过redis.conf配置文件进行设置。

切换数据库语法:select 数据库的编号

(8)dbsize
返回当前数据库里面键的个数
(9)flushdb
清空当前数据库里面所有的键,(慎重使用)
(10)flushall
清空所有数据库里面所有的键,(慎重使用)

安全认证

方法:打开redis的配置文件(redis.conf)
(1)#requirepass 设置的密码

image.png

(2)重启redis服务,让密码生效。
关闭redis服务 pkill redis-server
启动 /usr/local/redis/bin/redis-server /usr/local/redis/redis.conf
方式一:
添加 -a 选项。语法:redis-cli –a 密码
image.png

方式二;
使用auth命令来完成验证。语法auth 密码
image.png

php支持redis

1、安装php支持redis的扩展。
(1)准备扩展,根据PHP的版本来选择扩
(2)把合适的扩展文件复制到php的安装目录里面的ext目录里面
(3)打开php.ini文件,进行引入扩展,

image.png

(4)重启nignx服务器,进行测试
重启后,可以使用PHPINFO函数进行测试即可,
image.png

<?php
$redis  = new Redis();
$redis->connect('192.168.1.180');
$redis->auth('beijing');
//添加字符串数据
//$redis->set('username','xiaowanzi');
//添加哈希类型的数据
//$redis->hmset('hash1',array('id'=>100,'name'=>'xiaohei','age'=>12));
//添加链表数据
//$redis->lpush('list1','张三丰');
//$redis->lpush('list1','宋江');
//$redis->lpush('list1','张无忌');
//$redis->lpush('list1','xiaohai');
//添加集合类型数据
//$redis->sadd('set1','xiongda');
//$redis->sadd('set1','xionger');
//天假有序集合类型
$redis->zadd('zset1',10,'guangouqing');
$redis->zadd('zset1',20,'bengbeng');
?>
获取数据代码如下;
<?php
header("content-type:text/html;charset=utf-8");
$redis  = new Redis();
$redis->connect('192.168.1.180');
$redis->auth('beijing');
//获取字符串类型数据
var_dump($redis->get('username'));
echo '<br>';
//获取哈希类型的数据
var_dump($redis->hgetall('hash1'));
echo '<br>';

//获取链表类型的数据
var_dump($redis->lrange('list1',0,-1));
echo '<br>';
//获取集合类型的数据
var_dump($redis->smembers('set1'));
echo '<br>';
//获取有序集合类型的数据
var_dump($redis->zrange('zset1',0,-1));
echo '<br>';

使用实列

需求:在登录密码连续错误的时候,进行计数,如果超过xx次,就在规定时间内不允许登录了(不去验证密码是否对)。

image.png

redis实现秒杀功能
实现原理:使用redis链表中队列,进行pop操作,因为pop操作是原子的,即使有很多用户同时到达,也是依次执行,推荐使用。
第一步:先将商品库存如队列
<?php  
$store=1000;  
$redis=new Redis();  
$result=$redis->connect('127.0.0.1',6379);  
$goods_number = 100;  
for($i=0;$i<$goods_number;$i++){  
    $redis->lpush('goods_store',1);  
}  
echo $redis->llen('goods_store');  
?>
第二步:抢购开始,设置库存的缓存周期
$redis->setTimeout(‘goods_store’,60);
第三步:客户端执行下单操作,下单前判断redis队列库存量  
$redis=new Redis();  
$redis->connect('127.0.0.1',6379);  
$count=$redis->lpop('goods_store');  
if(!$count){  
    echo ‘抢购失败’;
    return;  
}
//跳转到下单页面,完成下单操作

持久化机制

redis支持两种持久化方式:
(1)snapshotting(快照)默认方式
(2)append-only file(缩写aof)的方式

1、snapshotting快照方式持久化

该持久化默认开启,一次性把redis中全部的数据保存一份存储在硬盘中(备份文件名字默认是dump.rdb),如果数据非常多(10-20G)就不适合频繁进行该持久化操作。
(1)如何开启,默认开启,有自己的触发条件:

image.png

image.png

注意:屏蔽该触发条件,即可关闭快照方式。
image.png

(2)手动发起快照:
两种方式完成手动保存。
方式一:在登录状态:
则直接执行bgsave即可。
image.png

方式二 :在没有登录状态
./redis-cli bgsave 手动发起一次快照保存操作
(3)缺点:
由于快照方式是在一定间隔做一次的,所以如果redis意外down掉的话,就会丢失最后一次快照后的所有修改。

2、append-only-file 追加方式持久化AOF

本质:把用户执行的每个“写”指令(添加、修改、删除)都备份到文件中,还原数据的时候就是执行具体写指令而已。

(1)如何开启
appendonly yes //启用 aof 持久化方式
appendfilename appendonly.aof //保存命令的文件(可以指定路径)
打开redis.conf配置文件,进行打开配置。

image.png

(2)触发条件
# appendfsync always //每次收到写命令就立即强制写入磁盘,最慢的,但是保证完全的持久化,不推荐使用
#appendfsync everysec //每秒钟强制写入磁盘一次,在性能和持久化方面做了很好的折中,推荐
#appendfsync no //完全依赖 os,性能最好,持久化没保证
打开配置文件进行如下修改。
image.png

(3)aof文件的重写
例如:可以把多个incr指令换为一个set指令
问题:
每个命令重写一次aof,如果某个key操作100次,产生100行记录,aof文件会很大,怎么解决?
比如,当执行多次incr number操作,aof 文件中会保存多次incr number的命令。这样会增大aof文件容量,我们可以对aof文件重写,把里面重复的命令压缩成一条命令
就比如执行10次incr number 压缩成set number 11
执行重写的命令是:
执行重写可以在登录状态下执行,直接输入bgrewriteaof,也可以在未登录状态下执行,

语法:./bin/redis-cli –a 密码 bgrewriteaof

image.png

注意点:如果两种持久化方式都开启,则以aof为准,虽然 快照方式恢复速度快,但是最终被aof给覆盖,所以两种方式都开启时,以aof为准。

具体使用

  1. key的操作


    image.png

    image.png

    image.png

    image.png

    image.png

    image.png

    image.png

    image.png

    image.png

    image.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,530评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 86,403评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,120评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,770评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,758评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,649评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,021评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,675评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,931评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,659评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,751评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,410评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,004评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,969评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,042评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,493评论 2 343

推荐阅读更多精彩内容

  • 须知:个人读书笔记,很多点没有具体描述,只是大体罗列下,立个flag后面完善。 文章罗列了基本知识(类型,小功能)...
    alivs阅读 860评论 0 17
  • redis简介 redis是开源,BSD许可,高级的key-value存储系统.可以用来存储字符串,哈希结构,链表...
    SithCait阅读 232评论 0 0
  • 前言 昨天和室友去包夜,玩了一晚上的LOL,跪了一整夜,但是很开心。从S1末开始玩LOL的我,到现在还是青铜,真是...
    cmazxiaoma阅读 1,955评论 0 14
  • 本人博客同步发表,排版更佳 对象的类型 redis中的对象包括: 字符串对象 REDIS_STRING 列表对象 ...
    峰巢阅读 153评论 0 1
  • 王凯今年27岁,是我上家公司的一个同事。 昨天夜里1点多他发微信给我,说:“万哥,咱两撸串去呀?” 外面下着大雨,...
    老韩大叔阅读 2,242评论 5 38