1、Redis安装 见 https://blog.csdn.net/niuxitong/article/details/90505794
使用场景
1. 去最新n个数据的操作
2. 排行榜,取top n个数据 //最佳人气前10条
3. 精确的设置过期时间
4. 计数器
5. 实时系统, 反垃圾系统
6. pub, sub发布订阅构建实时消息系统
7. 构建消息队列
8. 缓存
使用场景
1. 去最新n个数据的操作
2. 排行榜,取top n个数据 //最佳人气前10条
3. 精确的设置过期时间
4. 计数器
5. 实时系统, 反垃圾系统
6. pub, sub发布订阅构建实时消息系统
7. 构建消息队列
8. 缓存
# 登录本机无密码直接 redis-cli 回车即可
# 本机有密码 redis-cli 回车 然后再输入 auth password
#登录第三方 redis-cli -h ip地址 -p 6379 -a password
PHP 链接redis
$redis = new Redis();
$redis->connect('127.0.0.1', 6379) or die('Redis连接失败,是否开启了redis-server服务?');
//$redis->auth("23434"); // 如果有密码就启用此命令
//$redis->select(0); // 选择指定数据库 默认为0 数字为0--15 共16个。
$redis->set('username', 'zhangsan');
echo $redis->get('username');
# select 2 选择2号数据库 (0--15)
1、keys * 返回所有键名
2、keys prefix* 返回所有以prefix开头的键
3、keys prefix?? 返回所有以prefix开头并且后面只有两个字母的键
4、exists key 判断一个键是否存在,存在返回1 否则返回 0
5、del key 删除一个键,返回删除的个数
del key1 key2 同时删除多个键
6、flushdb 清空当前数据库中所有键
7、flushall 清空所有数据库中的所有键(0--15号数据库)
8、type key 返回键的数据类型
string是redis最基本的类型,你可以理解成与Memcached一模一样的类型,一个key对应一个value。
string类型是二进制安全的。意思是redis的string可以包含任何数据。比如jpg图片或者序列化的对象 。
string类型是Redis最基本的数据类型,一个键最大能存储512MB。
注意:在redis-cli.exe客户端
字符串类型的值,可以加双引号或单引号。
-->set username zhangsan
-->set username "zhangsan"
-->set username 'zhangsan'
这三种写法是等效的
1、set key value //设置字符串键并赋值,成功 true 失败 false
set key value Ex 3600 //设置有效期3600秒
2、get kye //获取键值
3、mset //批量设置键值对
mset key1 value1 key2 value2 ...
如: mset username "张三" sex "男" age 18
PHP:$redis->mset(array('username'=>"张三", 'sex'=>"男", 'age'=>18));
4、mget //批量获取
语法:mget key1 key2
--> mget username sex age
返回:
1) "张三"
2) "男"
3) "18"
PHP:$arrs = $redis->mget(array('username', 'sex'));
返回:Array([0]=>张三 [1]=>男);
5、setnx('key', 'value') //当指定键不存在时赋值
当此键不存在时赋值,返回 1。 当存在时不赋值,返回 0
6、strlen key -- 返回指定键的值的长度,键不存在返回 0
-->set username "zhangsan"
127.0.0.1:6379> strlen username
(integer) 8 -- 返回 长度 8
PHP:
$int = $redis->strlen("username") // 返回 int类型 8
7、incr key -- 返回递增数字 没次递增1。
-->incr id
(integer) 1
-->incr id
(integer) 2
PHP:
$redis->incr('key') = 1
$redis->incr('key') = 2
$uid = $redis->incr('userid') -- 多用于保存自增类型的id
扩展:incrby key 2 指定步长
8、decr key -- 递减数字 1
-->decr id
-->decr id
-->decr id
PHP:
$redis->set('num', 100)
$redis->decr('num') -- 99
$redis->decr('num') -- 98
扩展: decrby key 3 每次递减3
9、append('key', 'value') -- 向指定键的尾部追加值
当此键不存在时赋值,返回 1。 当存在时不复制,返回 0
$redis->set('username', 'niuhehe')
$redis->append('username', ' niuxixi')
$redis->append('username', ' niuhaha')
echo $redis->get('username')
输出 niuhehe niuxixi niuhaha
散列类型类似于数据库中的表的一条记录,一个键下有多个字段 。主要用于保存一个键下多个字段、值的一行记录:如一篇文章的id、title、contents
hmset('post:id:1', 'id','1', 'title','标题', 'contents','内容');
1、hset key field value -- 设置散列键并赋值
-->hset goodsID:1 title "苹果"
-->hset goodsID:1 price "3.50"
-->hset goodsID:1 addtime 1493014218
说明:hset不区分插入和更新操作,如果字段不存在,hset执行的是插入操作,返回1, 如果字段已存在,执行的是更新操作,返回0
PHP:
$redis->hset('goodsID:1', 'title', '苹果');
$redis->hSet('goodsID:1', 'price', "3.50");
$redis->hSet('goodsID:1', 'addtime', time());
2、hget key field -- 获取散列键中字段的值语法:hget key field
-->hget goodsID:1 title
-->hget goodsID:1 price
-->hget goodsID:1 addtime
PHP:
echo $redis->hGet('goodsID:1', 'title');
echo $redis->hGet('goodsID:1', 'price');
echo $redis->hGet('goodsID:1', 'addtime');
3、hmset -- 批量设置字段的值, 成功返回true,
语法:hmset key field1 value1 field2 value2 field3 value3;
-->hmset goodsID:2 title "香蕉" price "2.80" addtime = 1493014228
-->hmset goodsID:2 title "橘子" price "3.30" addtime = 1493014238
PHP:
$redis->hMset('goodsID:2',array('title'=>'香蕉', 'price'=>'2.80', 'addtime'=>time()));
$redis->hMset('goodsID:3',array('title'=>'橘子', 'price'=>'3.30', 'addtime'=>time()));
4、hmget('key', 'field1', 'field2') -- 批量获取字段的值。
语法:hmget key field1 field2...
--> hmget goodsID:3 title price addtime
输出:
1) "\xe6\xa9\x98\xe5\xad\x90" // 橘子
2) "3.30"
3) "1493014218"
php中为数组:
$info = $redis->hMGet("goodsID:2", array('title', 'price'));
print_r($info);
输出:Array ([title]=>香蕉 [price]=>2.80);
5、hgetall key -- 获取指定键中的所有字段
通常用于当我们不知道 key 键中有哪些字段 ,就全部打印出来
PHP返回数组:
$info = $redis->hGetAll("goodsID:3");
print_r($info);
输出:Array([title]=>橘子 [price]=>3.30 [addtime]=>1493018724)
6、hsetnx key field -- 当指定字段不存在时赋值,存在不赋值, 指定字段不存在返回true,存在返回false。
通常用于为指定的键增加新的字段和值
7、hexists key field -- 判断一个字段是否存在
PHP:
$res = $redis->hExists('goodsID:4', 'title');
var_dump($res); // 返回的是布尔值,存在返回true 否则false
8、hlen('key') -- 获得指定键中字段个数
9、hdel key field -- 删除指定键下的指定字段 返回被删除字段的个数
语法:hdel key field [,field2]
-->hdel goodsID:4 title price
PHP:
$res = $redis->hDel("goodsID:5",'title', 'price');
var_dump($res); // int(2)
也可以使用:del goodsID:5 删除整个
10、 -- 只获取指定键的字段名称,而不显示字段值
-->hkeys goodsID:5
输出:
1) "title"
2) "price"
3) "addtime"
PHP:
$arr = $redis->hkeys("goodsID:5");
print_r($arr);
// Array ( [0] => title [1] => price [2] => addtime )
11、hvals key -- 只获取指定键的字段值,而不显示字段名
-->hkeys goodsID:5
输出:
1) "香蕉"
2) "2.25"
3) "1457876786"
PHP:
$list = $redis->hvals("goodsID:5");
print_r($list);
Array
(
[0] => '香蕉.'
[1] => '2.25'
[2] => '值...'
[3] => '1457876786'
)
主要用于保存文章的id序列,列表类型是通过双链表实现的,靠近两端的数据查询速度快,所以他更适合如实现“新鲜事”、“日志”这样的少访问中间元素的场景 。
1、lpush key value 从左边插入--,返回值为增加元素值后的列表长度
语法:lpush key value [value2 value3 ...]
--> lpush postID 1
--> lpush postID 2
--> lpush postID a // (integer) 3 //[ a 2 1 ]
PHP:
$res = $redis->lPush("goodsID", "0");
$res = $redis->lPush("goodsID", "a", "b", "c"); // [ c b a 0]
2、rpush key value 从右边插入
类似于字符串类型中的append('key', 'value')
3、lrange key start stop -- 获得列表片段(指定区域的元素值)
语法:lrange key start stop
返回索引值从start到stop之间的所有元素(包括两端)的值,Redis列表索引从0开始
start、stop 分别表示开始索引号、结束索引号
lrange key 0 -1 获取所有
PHP: 返回指定范围值的数组
$arr = $redis->lRange("postid", 0, 10);
Array ( [0] => a [1] => 2 [2] => 1 [3] => 1 [4] => b [5] => c )
$arr = $redis->lRange("postid", 2, 4);
Array ( [0] => 1 [1] => 1 [2] => b )
4、llen key -- 获取列表中元素的个数。
PHP:
$num = $redis->llent('goodsID');
echo $num -- 8
php端可使用lSize('key') 也可以获取
5、lpop key
-- 从列表左边弹出一个元素(删除)并返回被删除的元素值
$res = $redis->lPop("postID");
echo $res; // 删除了 a
6、rpop key
-- 从列表右边弹出一个元素(删除)并返回被删除的元素值
7、lrem key count value -- 删除列中指定个数的指定值
删除列中前 count个值为 value的元素,返回实际删除的元素个数:
(1)当count > 0 时,从左开始删除前count个值为value的元素
(2)当count < 0 时,从右边开始删除前count个值为value的元素
(3)当count = 0 时,删除所有值为value的元素
例: postID 的值为 [3 2 0 a b a c d f a b]
127.0.0.1:6379>lrem postID 2 a
(integer) 2 // 从左边开始删除两个a 变成了[3 2 0 b c d f a b]
PHP:
$redis->lRem("goodsID", "要删除的值", 个数); //返回删除的个数
注意这里的参数顺序
8、lindex key index -- 返回指定索引的元素值(索引从0开始)
如果index是负数,表示从右边开始计算索引, 最右边元素的索引值是-1;
例: postID 值为 [ 1 0 b c ]
127.0.0.1:6379>lindex postID 2
“b”
PHP:
$var = $redis->lIndex("postID", 2);
echo $var; // b
9、lset key index value -- 改变指定索引的值,成功返回真
例:lset postID 1 "zhangsan" 返回真
则此时 postID 值变成了 [ 1 zhangsan b c ]
PHP:
$var = $redis->lSet("postID", 2, "lisi");
var_dump($var); 返回真
10、ltrim -- 删除指定索引范围之外的所有元素,(即保留此范围之内的元素)
语法:ltrim key start end 成功返回真
例:ltrim postID 2 5
删除 索引为0,1 以及6、7、8...的所有值,只保留索引在2--5范围内的值。
例: 只希望保留最近的100条日志。
lpush logList "日志内容"
ltrim logList 0 99 //只保留0--99的日志, 大于99的都删除掉
PHP:
$var = $redis->lTrim("postID", 0, 4); 返回真
11、linsert key before/after privot value;
-- 向列表中(指定的位置)插入元素值
例: artList [3 2 1];
linsert artList before 2 a // 把元素值a插入到值2的前面
(integer) 4 // 成功返回元素个数,
linsert artList after 3 b // 把元素值b插入到值3的后面
PHP:
$tag = $redis->lInsert('artlist', Redis::BEFORE, 'b', 'niuxitong'); //插入值b前面
$tag = $redis->lInsert('artlist', Redis::AFTER, 'b', 'niuhehe');//插入值b后面
12、rpoplpush key1 key2 -- 将元素从一个列表转移到另一个列表
语法:rpoplpush key1 key2 // 将列表key1里的最右边的值弹出并保存到key2的最左边
例:rpoplpush artlist postList // 把artlist里的最后一个值b弹出并存入postList的最左边。
主要用于保存文章标签tag,集合类型里的元素是无序的,如我们一次插入多个值,每个值可能会打乱排列。使用集合类型保存tag,而不使用列表类型,主要是基于集合类型中元素不相同,而且可以实现搜索。
1、sadd -- 创建一个集合类型键并增加至
语法:sadd key value [value2 value3 ....] 返回添加成功的元素个数,
例:
sadd tags one -- 返回1
sadd tags one -- 返回0 因为 one 已经存在
sadd tags two three 返回2,
PHP:
$redis->sadd('tags', 'one');
$redis->sadd('tags', 'two', 'three', 'one'); -- 返回 2,
在php中批量添加,是以 参数的形式添加的
2、srem -- 从集合中删除一个或多个元素值,返回删除成功的个数
语法: srem key value [value2 value3]
例:
srem tags one // 删除one 返回1
srem tags aa bb // 删除这两个值 返回2
PHP:
$tag = $redis->sRem("tags", "bb", "dd");
echo $tag; // 返回2 成功删除两个
3、smembers key -- 获得集合的所有元素
例:smembers tags; 列出所有值
$tagArr = $redis->smembers('tags');
print_r($tagArr)
输出Array([0]=>three [1]=>two [2]=>one); -- 返回元素值的索引数组
4、sismember key value -- 判断元素是否在集合中
语法: sismember key value 存在返回1, 不存在返回 0
例: sismember tags niuxitong 存在返回1
PHP:
$tag = $redis->sIsMember("tags", "niuxitong");
echo $tag; // 返回1
5、sdiff -- 计算多个集合键之间的差集
语法:sdiff keyA keyB [keyC keyD ...]
集合A与集合B之间的差集表示 所有在集合A中存在,在集合B中不存在的元素。(B中存在,A中不存在的不考虑)如没有就返回空。
例:
sadd setA a b c
sadd setB b c d
127.0.0.1:6379> sdiff setA setB // setA与setB的差集
1) "a"
127.0.0.1:6379> sdiff setB setA // setB与setA的差集
1) "d"
sadd setC a e f // 在增加一个集合setC
127.0.0.1:6379> sdiff setA setB setC
(empty list or set); 返回空
先计算setA - setB, 再计算得到的结果与 setC的差集。
PHP:
$arr = $redis->sDiff("setA", "setB");
var_dump($arr);
$arr = $redis->sDiff("setA", "setB", "setC");
var_dump($arr); // 没有值,返回一个空数组
6、sinter -- 计算多个集合键之间的交集
语法:sinter keyA keyB [keyC keyD ...]
交集,表示在集合A中存在,同时也在集合比中存在的元素值。
例:
127.0.0.1:6379> sinter setA setB
1) "b"
2) "c"
127.0.0.1:6379> sinter setA setB setC
(empty list or set)
PHP:
$arr = $redis->sInter("setA", "setB");
print_r($arr); // Array ( [0] => b [1] => c )
$arr = $redis->sInter("setA", "setB", "setC");
print_r($arr); // Array ()
7、sunion -- 计算多个集合之间的并集, 表示所有元素组成的和
语法:sunion keyA keyB [keyC keyD ...]
127.0.0.1:6379> sunion setA setB
1) "b"
2) "a"
3) "c"
4) "d"
127.0.0.1:6379> sunion setA setB setC
1) "e"
2) "f"
3) "a"
4) "d"
5) "b"
6) "c"
PHP:
$arr = $redis->sUnion("setA", "setB");
print_r($arr); //Array ( [0] => b [1] => a [2] => c [3] => d )
8、scard -- 获取集合元素的个数
语法:scard key
127.0.0.1:6379> scard setA
(integer) 4
127.0.0.1:6379> smembers setA
1) "1"
2) "b"
3) "c"
4) "a"
9、spop -- 随机从集合中弹出(删除)一个元素,并返回这个元素
语法:spop key
127.0.0.1:6379> spop setA
"a"
127.0.0.1:6379> spop setA
"b"
127.0.0.1:6379> smembers setA
1) "1"
2) "c"
发送到发
1、zadd -- 向有序集合中插入一个分数和对应元素,
如果元素已经存在,则会替换对应的分数。返回新插入的元素个数。
语法:zadd key 分数 元素 [分数 元素 分数 元素 ]
例:
127.0.0.1:6379> zadd clicks 89 niuxitong 90 liuhaiyun
(integer) 2
PHP:
$tag = $redis->zAdd("shijian", "30", "id1", "20", "id2");
echo $tag; // 添加了两个
2、zscore -- 获得指定元素的分数
语法:zscore key 元素
例:
127.0.0.1:6379> zscore clicks niuxitong
"89"
PHP:
$tag = $redis->zScore("shijian", "id2");
echo $tag; // 20
3、zrange -- 获取排名在某个下标范围的元素列表,并按元素分数由小到大的顺序排列。
语法: zrange key start stop [withiscores]
例:127.0.0.1:6379> zrange chengji 0 2
1) "Peter"
2) "Tom"
3) "niuhehe"
127.0.0.1:6379> zrange chengji 0 2 withscores // 同时获得元素的分数
1) "Peter"
2) "76"
3) "Tom"
4) "89"
5) "niuhehe"
6) "95"
PHP:
$arr = $redis->zRange("chengji", 0, 2);
返回 :Array ( [0] => Peter [1] => Tom [2] => niuhehe )
$arr = $redis->zRange("chengji", 0, 2, 'withscores');
或者
$arr = $redis->zRange("chengji", 0, 2, true);
返回:Array ( [Peter] => 76 [Tom] => 89 [niuhehe] => 95 )
4、zrevrange -- 用法与zrange基本一致,只是按元素分数由大到小的顺序排列。
5、zrangebyscore -- 按元素分数从小到大的顺序返回一定范围内的元素
语法:zrangebyscore key min max [withscores] [limit offset count]
min 表示最低分(包含)
max 表示最高分(包含)
limit offset count 类似于SQL中的limit子句。
offset 键的开始位置
count 显示条数
例:
127.0.0.1:6379> zrangebyscore chengji 90 100
1) "niuhehe"
2) "David"
3) "niuxixi"
127.0.0.1:6379> zrangebyscore chengji 90 100 withscores
1) "niuhehe"
2) "95"
3) "David"
4) "100"
5) "niuxixi"
6) "100"
127.0.0.1:6379>
PHP:
注意在PHP中第四参数是以数组的形式设置其他参数的
如
array(
'withscores'=>true, // 显示分数
'limit' => array(0, 2) // 限定查询条数
)
$arr = $redis->zRangeByScore("chengji", 80, 100);
返回:Array ( [0] => Tom [1] => niuhehe [2] => David [3] => niuxixi )
$arr = $redis->zRangeByScore("chengji", 80, 100,array('withscores'=>true));
返回:Array ( [Tom] => 89 [niuhehe] => 95 [David] => 100 [niuxixi] => 100 )
$arr = $redis->zRangeByScore("chengji", 80, 100, array('withscores'=>true, 'limit' => array(0, 2)));
返回:Array ( [Tom] => 89 [niuhehe] =>95)
6、zrevrangebyscore -- 按元素分数从大到小的顺序返回一定范围内的元素
语法:zrevrangebyscore key max min [withscores] [limit offset count]
用法与zrangebyscore基本一致,不过max 与 min的顺序反了
127.0.0.1:6379> zrevrangebyscore chengji 100 80 withscores limit 1 3
1) "David"
2) "100"
3) "niuhehe"
4) "95"
5) "Tom"
6) "89"
7、zincrby -- 增加某个元素的分数,返回更改后的分数
语法:zscore key 分数 元素
例:
127.0.0.1:6379> zscore chengji niuxixi
"102"
127.0.0.1:6379> zincrby chengji 1 niuxixi
"103"
127.0.0.1:6379> zincrby chengji 2 niuxixi
"105"
127.0.0.1:6379> zincrby chengji -1 niuxixi
"104"
8、zcard -- 获得有序集合中元素的个数, 求列表总数
语法:acard key
例:
127.0.0.1:6379> zcard chengji
(integer) 5
127.0.0.1:6379> zrange chengji 0 -1
1) "Peter"
2) "Tom"
3) "niuhehe"
4) "David"
5) "niuxixi"
9、zcount -- 获得指定分数范围内的元素个数
语法:zcount key min max
用于按某一分数范围内统计个数
例:
127.0.0.1:6379> zcount chengji 95 110
(integer) 3
127.0.0.1:6379> zcount chengji (95 110
(integer) 2
10、zrem -- 删除一个或多个元素,返回删除的元素个数
语法:zrem key 元素 [元素 元素 元素]
例:
127.0.0.1:6379> zrem key niuhehe
(integer) 0
127.0.0.1:6379> zrem chengji niuhehe
(integer) 1
PHP:
$tag = $redis->zRem("chengji", 2); // 删除2 的元素
echo $tag;
11、zremrangebyrank -- 按照元素排名下标范围删除元素
语法: zremrangebyrank key start stop
zremrangebyrank命令按元素分数由小到大的顺序排列,删除在指定(下标)范围内的所有元素,并返回删除的个数
例:
127.0.0.1:6379> zremrangebyrank chengji 0 1
(integer) 2
12、zrank -- 按元素分数从小到大的顺序获取指定元素的排名(即下标值)
语法:zrank key member